さくらのクラウドAPIを使ってみよう(1)——コマンドラインツール「sacloud」から使う
コマンドラインツール「sacloud CLI」を使う
sacloud CLIはさくらインターネットが開発して提供しているツールで、Node.jsおよびJavaScriptで実装されている。MITライセンスで公開されているので、これをベースに独自にカスタマイズすることもできる。また、使い方などのドキュメントは日本語で公開されている。
Node.jsはWindowsおよびMac OS X、Linux、SunOSなどで動作する。sacloud CLIの動作環境については明示されていないが、すべてプラットフォーム非依存のJavaScriptで実装されているので、これらすべてのプラットフォームで動作すると思われる。本記事ではLinuxおよびMac OS X環境での動作を確認している。
sacloud CLIのインストール
sacloud CLIを利用するには、Node.jsが必要だ。Node.jsはNode.jsのWebサイトで公開されており、WindowsおよびMac OS X、Linux、SunOS向けのバイナリパッケージとソースコードが提供されている。プラットフォームに応じたインストーラもしくはパッケージをダウンロードし、インストールしておこう(図2)。
また、sacloud CLIはNode.js向けのアプリケーション/ライブラリパッケージ管理システムであるnpmで配布されている。GitHub上でも配布されているが、通常はnpmを使ってインストールすることをおすすめする。
npmを使ってsacloud CLIをインストールするには、root権限で次のようにnpmコマンドを実行する。
# npm install -g sacloud
すると、sacloud CLI本体および依存するライブラリがダウンロードされインストールされる。このとき、sacloud CLIは/usr/bin/sacloudとしてインストールされる。
また、root権限がない場合、もしくは/usrディレクトリ以下にsacloud CLIをインストールしたくない場合は、sacloud CLIをインストールしたいディレクトリで以下のように実行すれば良い。
$ npm install sacloud
この場合、npmコマンドを実行したディレクトリ以下の./node_modules/.binディレクトリ内にsacloudコマンドがインストールされる。このとき、フルパス指定無しでsacloudコマンドを実行できるようaliasコマンドなどで設定しておく必要がある。
alias sacloud="<npmコマンドを実行したディレクトリ>/node_modules/.bin/sacloud"
APIトークンの取得
さくらのクラウドAPIを使用する場合、認証情報として「アクセストークン(Access Token)」および「アクセストークンシークレット(Access Token Secret)」というものが必要だ。アクセストークンがユーザー名、アクセストークンシークレットがパスワードに相当する扱いとなる。
これらの情報は、さくらのクラウドコントロールパネルで取得できる。コントロールパネルにログインし、右上に表示されるユーザー名をクリックするとメニューが表示される(図3)。
そこで「設定」をクリックするとアカウントに対する設定画面が表示されるので、左側のメニュー内の「APIキー」をクリックし、続けて「追加」ボタンをクリックする(図4)。
すると「APIキーを追加」ダイアログが表示されるので、ここでキーの名前と説明を入力し「追加」をクリックする(図5)。これらはキーを識別するためだけに使われるので、適当なもので構わない。
APIキーを作成すると、作成したキーがリストに追加されるので、それをダブルクリックするとアクセストークンおよびアクセストークンシークレットを確認できる(図6)。
なお、アクセストークンおよびアクセストークンシークレットがあれば、そのアカウントで利用しているサービスのほぼすべての情報にアクセスでき、さらにサーバの削除や作成といった操作も行えてしまう。これら情報の管理には十分注意したい。
また、環境によってはsacloudが備えている自動補完機能の設定が必要だ。これが設定されていない場合、sacloudコマンドの実行時に以下のようなメッセージが表示される。
ATTENTION: Your environment doesn't support auto-complete. To enable it, try running the following commands: node sacloud.js --install >> /home/hylom/.bashrc source /home/hylom/.node-completion/sacloud.js
この場合、メッセージに従ってsacloudコマンドを--installコマンド付きで実行し、出力される設定を~/.bashrc内に追加すれば良い。
$ sacloud --install >> ~/.bashrc
環境によっては~/.bashrcではなく~/.profileや~/.bash_loginに追加するようメッセージが表示される場合もあるので、指示に従ってコマンドを実行して欲しい。
エンドポイントおよびアクセストークンを登録する
sacloud CLIを利用するには、まずさくらのクラウドAPIを利用するためのURLと、アクセストークンを登録する必要がある。これらの作業は、「sacloud config」コマンドで実行する。
まずURLの登録だが、さくらのクラウドのゾーンごとにこのURLは異なる。APIドキュメントに記載されているが、第1ゾーンの場合は「https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/」、第2ゾーンの場合は「https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/」となる。使用しているゾーンに応じて、以下のようにしてこれらURLを登録する。
第1ゾーンの場合: $ sacloud config --apiRoot="https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/"
第2ゾーンの場合: $ sacloud config --apiRoot="https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/"
続いて、アクセストークン情報を登録する。
$ sacloud config --accessToken=<アクセストークン> --accessTokenSecret=<アクセストークンシークレット>
以上で設定は完了だ。設定されている情報は次のようにして確認できる。
$ sacloud config /Users/foo/.sacloudcfg.json: { "apiRoot": "https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/", "accessToken": "<アクセストークン>", "accessTokenSecret": "<アクセストークンシークレット>" }
最後に正しく設定が行えているかどうかを、作成されている仮想サーバを表示する「sacloud show server」」コマンドを実行して確認しておこう。正しく設定できていれば、以下のようにサーバ一覧が表示される。
$ sacloud show server GET https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server.json?{"Count":0} -> 200 OK (1/1) ~0.645sec +--------------+-------------------------------+--------+---------------------+ | id | name | status | created at | +--------------+-------------------------------+--------+---------------------+ | 112500152369 | centos 48-120 | down | 2013-04-05 12:46:25 | +--------------+-------------------------------+--------+---------------------+ : :
サーバの情報を確認する
続いては、sacloudでAPIを実行する例を紹介していこう。まずはサーバの情報などを確認するコマンドだ。先ほど、「sacloud show server」コマンドで作成されている仮想サーバの一覧を表示したが、サーバIDを引数として「show server」コマンドを実行すると、指定したサーバについての詳細を確認できる。
$ sacloud show server 112500152369 GET https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/112500152369.json?{"Count":0} -> 200 OK (1/1) ~0.397sec +-------------------+-------------------------------------------------------------+ | id | 112500152369 | +-------------------+-------------------------------------------------------------+ | zone | 31001:is1a | +-------------------+-------------------------------------------------------------+ | name | centos 48-120 | +-------------------+-------------------------------------------------------------+ | tags | @virtio-net-pci, @keyboard-us | +-------------------+-------------------------------------------------------------+ | plan | 1:(旧)プラン1 | +-------------------+-------------------------------------------------------------+ | cpu | 1 | +-------------------+-------------------------------------------------------------+ | memory | 2048MB | +-------------------+-------------------------------------------------------------+ | status | down | +-------------------+-------------------------------------------------------------+ | status changed at | 2014-03-09 21:28:48 | +-------------------+-------------------------------------------------------------+ | hypervisor | | +-------------------+-------------------------------------------------------------+ | disk | 112500152368:名称未設定 サーバ 13dda3aa184, virtio, 20480MB | +-------------------+-------------------------------------------------------------+ | interface | 112500152370:**:**:**:**:**:** -> ***.***.**.*** | +-------------------+-------------------------------------------------------------+ | created at | 2013-04-05 12:46:25 | +-------------------+-------------------------------------------------------------+
なお、sacloudコマンドはデフォルトでは表形式で出力を行うが、「--csv」オプションを付けることでCSV形式で、「--tsv」オプションを付けることでTSV形式で、「--json」オプションを付けることでJSON形式で出力が可能だ。これらはスクリプトなどで出力を加工する場合などに便利だ。
$ sacloud --json show server 112500152369 [{ "requestInfo": { "time": 1397396161193, "method": "GET", "url": "https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/112500152369.json?{\"Count\":0}", "path": "server/112500152369" }, "request": { "Count": 0 }, "responseInfo": { "time": 1397396161553, "latency": 360, "length": 1957, "serial": "66493241c0670b52489191b7ba8b53ae", "status": 200, "statusText": "OK", "type": "resource", "key": "server" }, "response": { "server": { "id": "112500152369", "name": "centos 48-120", "hostName": "localhost", "description": "", "serviceClass": "cloud/plan/1", "createdAt": "2013-04-05T12:46:25+09:00", "icon": { "id": "112300511981", "url": "https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/icon/112300511981.png", "name": "CentOS", "scope": "shared" }, "serverPlan": { "id": 1, "name": "(旧)プラン1", "cpu": 1, "memoryMB": 2048, "serviceClass": "cloud/plan/1", "availability": "disabled" }, "zone": { "id": 31001, "name": "is1a", "description": "石狩第1ゾーン", "vncProxy": { "hostName": "sac-is1a-ssl.sakura.ad.jp", "ipAddress": "133.242.31.244" }, "ftpServer": { "hostName": "sac-is1a-ssl.sakura.ad.jp", "ipAddress": "133.242.31.244" }, "region": { "id": 310, "name": "石狩", "description": "石狩", "nameServers": [ "133.242.0.3", "133.242.0.4" ] } }, "instance": { "server": { "id": "112500152369" }, "status": "down", "beforeStatus": "cleaning", "statusChangedAt": "2014-03-09T21:28:48+09:00", "migrationProgress": null, "migrationSchedule": null, "isMigrating": null, "migrationAllowed": null, "modifiedAt": "2014-03-09T21:28:48+09:00", "host": null, "cdrom": null, "cdromStorage": null }, "disks": [ { "id": "112500152368", "name": "名称未設定 サーバ 13dda3aa184", "connection": "virtio", "connectionOrder": 1, "reinstallCount": 0, "availability": "available", "sizeMB": 20480, "storage": { "id": "3100196005", "mountIndex": "3100196005", "class": "iscsi1204" }, "bundleInfo": null } ], "interfaces": [ { "id": "112500152370", "macAddress": "**:**:**:**:**:**", "ipAddress": "***.***.**.***", "userIPAddress": null, "hostName": null, "switch": { "id": "112400128561", "name": "sac-is1a-rt1-***.***.**.*", "scope": "shared", "subnet": { "id": null, "networkAddress": "***.***.**.*", "networkMaskLen": 24, "defaultRoute": "***.***.**.*", "internet": { "bandWidthMbps": 100 } }, "userSubnet": { "defaultRoute": "***.***.**.*", "networkMaskLen": 24 } }, "packetFilter": null } ], "appliance": null, "tags": [ "@virtio-net-pci", "@keyboard-us" ] }, "is_ok": true } }]