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形式を利用することから、ほかの言語でも容易に利用できるだろう。ドキュメントや関連ライブラリのサポート不足などやや取っつきにくい点もあるが、比較的簡単にその使い方は習得できるので、一度試して見てはいかがだろうか。