Rubyから「さくらのクラウド」を操ろう 4ページ

クラウドサービスライブラリ「fog」を利用してさくらのクラウドを操作する

 さくらのクラウド以外にもAPI経由で操作できるクラウドサービスを提供している事業者は多くあるが、それらAPIには互換性がない。そこで、さまざまなクラウドサービスのAPIをラッピングし、統一的な手法でアクセスできるようにする「fog」というRuby向けクラウドサービスライブラリがある。fogはさまざまなクラウドサービスに対応しており、さくらのクラウドにも対応している。そこで以下ではfogを使ってさくらのクラウドを操作する例を紹介しておこう。

fogにおけるさくらのクラウド対応

 fogはRubyのモジュール機能を使って実装されており、さくらのクラウド対応は「Fog::Volume::SakuraCloud」および「Fog::Compute::SakuraCloud」というモジュールで実装されている。前者がディスク関連の処理を実装したモジュールで、後者がサーバー関連の処理を実装したモジュールだ。これらに関するドキュメントは、https://github.com/fog/fog/blob/master/lib/fog/sakuracloud/docs/getting_started.mdにて閲覧できる。

 ただし、現時点ではさくらのクラウドのすべての機能がfogから利用できるわけではない。現時点で利用できるのはサーバーの作成/削除、サーバー一覧の取得、サーバーの起動/停止、ディスクの作成/削除、ディスク一覧の取得、SSH鍵の管理、といった機能のみだ。

fogのインストール

 fogはgem形式で提供されているため、次のようにgemコマンドでのインストールが可能だ。

# gem install fog

 インストール後は、スクリプト内で「require ‘fog’」文を実行することでfogの機能を利用できるようになる。

fogを使ってさくらのクラウドを操作する

 次のスクリプトは、fogを使ってさくらのクラウドでサーバーを作成するものだ。

# -*- coding: utf-8 -*-

# ゾーンを指定
SAKURACLOUD_API_ZONE = 'is1a'

require 'fog'

# APIトークンを指定
token = '<アクセストークン>'
secret = '<アクセストークンシークレット>'

compute = Fog::Compute.new({
                             :provider           => 'SakuraCloud',
                             :sakuracloud_api_token => token,
                             :sakuracloud_api_token_secret => secret
                           })

server = compute.servers.create({
                                  :serverplan => '1001', # 1コア/1GBメモリ
                                  :name => 'FogTest',
                                  :volume => {
                                    :diskplan => 4, # SSD
                                    :sourcearchive => '112500570421'
                                    # ↑「CentOS 6.5 64bit (基本セット)」からコピー
                                  }
                                })

p server # 作成されたサーバーの情報を出力

 まず、「SAKURACLOUD_API_ZONE = ‘is1a’」で使用するゾーンを指定している。fogのさくらのクラウドモジュールではコード内の定数で使用するゾーンを決めているので、このような形でゾーンを指定する形になる。

 次に、Fog::Compute.newメソッドでさくらのクラウドのサーバーを操作するためのFog::Computeクラスのインスタンスを作成する。ここで、引数として与えるハッシュの:provider要素に「SakuraCloud」を指定することで、さくらのクラウド用モジュールを使ったインスタンスが作成される。また、アクセストークンやアクセストークンシークレットは:sakuracloud_api_tokenおよび:sakuracloud_api_token_secret要素で指定する。

 サーバーの作成は、Fog::Computeクラスに対しservers.createメソッドを実行することで行える。引数としてはサーバープランID、サーバー名、サーバーに接続するディスクなどのパラメータが指定可能だ。ここでは「CentOS 6.5 64bit (基本セット)」アーカイブからのコピーを行うよう指定している。

 このメソッドはFog::Compute::SakuraCloud::Serverクラスのインスタンスを返し、その出力結果は以下のようになる。

  <Fog::Compute::SakuraCloud::Server
    id="112600360342",
    name="482c35b3-5b57-473c-81c7-9cb6e9bbb3c2",
    server_plan={"ID"=>1001, "Name"=>"プラン/1Core-1GB", "CPU"=>1, "MemoryMB"=>1024, "ServiceClass"=>"cloud/plan/1core-1gb", "Availability"=>"available"},
    instance={"Server"=>{"ID"=>"112600360342"}, "Status"=>"down", "BeforeStatus"=>nil, "StatusChangedAt"=>nil, "MigrationProgress"=>nil, "MigrationSchedule"=>nil, "IsMigrating"=>nil, "MigrationAllowed"=>nil, "ModifiedAt"=>"2014-05-19T19:49:36+09:00", "Host"=>nil, "CDROM"=>nil, "CDROMStorage"=>nil},
    disks=[{"ID"=>"112600360344", "Name"=>"c78c627b-7b88-429f-a92d-e0cd08d28f8f", "Connection"=>"virtio", "ConnectionOrder"=>1, "ReinstallCount"=>0, "Availability"=>"available", "SizeMB"=>20480, "Storage"=>{"ID"=>"3100194012", "MountIndex"=>"3100194012", "Class"=>"iscsi1204"}, "BundleInfo"=>nil}],
    interfaces=[{"ID"=>"112600360343", "MACAddress"=>"9C:A3:BA:23:83:D9", "IPAddress"=>"153.120.83.203", "UserIPAddress"=>nil, "HostName"=>nil, "Switch"=>{"ID"=>"112600296406", "Name"=>"スイッチ", "Scope"=>"shared", "Subnet"=>{"ID"=>nil, "NetworkAddress"=>"153.120.83.0", "NetworkMaskLen"=>24, "DefaultRoute"=>"153.120.83.1", "Internet"=>{"BandWidthMbps"=>100}}, "UserSubnet"=>nil}, "PacketFilter"=>nil}]
  >

 また、サーバー一覧はcompute.serversプロパティに格納されており、これを参照することで作成されているサーバー情報を確認できる。

 なお、現状ではfogのさくらのクラウドサポートは前述のように非常に限られており、新規ディスクの作成やスイッチへの接続、サーバーやディスクの属性変更と言った昨日は実装されていない。fogのさくらのクラウドサポート自体、今年になってから実装されたばかりなので、今後の機能強化に期待したい。

APIを活用した自動化を

 さくらのクラウドAPIは、さくらのクラウドを単純にVPS代わりに利用するのであれば不要かもしれないが、頻繁にサーバーやディスクの作成/削除を繰り返したり、状況に応じて構成を変更するような用途では非常に有用だ。今回はRubyを使ったリクエスト送信について紹介したが、認証はシンプルなBASIC認証で、リクエストの送受信にはJSON形式を利用することから、ほかの言語でも容易に利用できるだろう。ドキュメントや関連ライブラリのサポート不足などやや取っつきにくい点もあるが、比較的簡単にその使い方は習得できるので、一度試して見てはいかがだろうか。