さくらのクラウド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
}
}]
