2014/09/06

PowerShellでさくらのクラウドを起動してみた

Gfx

「それWindowsでもできるよ。」

先日さくらのクラウドがSandboxという無償で何をしてもいい環境(意訳)を用意してくださったので、
WindowsのPowerShellでさくらのクラウドのREST APIを叩いて遊んでみました。 

すでにさくらのクラウドのAPIツールとしてはsacloud CLIというJavascript実装が用意されていますが、せっかくなのでPowerShellで挑戦してみました。
もちろんREST APIなので様々な言語で実装可能です。


*作業環境

今回はWindows8.1の環境を利用しました。
PowerShellの Invoke-RestMethodを使いたいのでPowerShell3.0(Windows8またはWindows Server 2012以降)の環境を推奨です。

困ったときはさくらのクラウドのAPIリファレンスを読みましょう。
 さくらのクラウドAPI1.1

 

*事前作業

基本的なことですがさくらのクラウドへアカウント登録済みであるという前提で進めます。

まずはAPIを呼ぶためのアクセストークンを取得します。
APIキーの取得のページから 適当なAPIキーを登録しました。

注:sandbox環境を使う際にはsandbox環境でAPIキーを発行する必要があります。同様に石狩第1ゾーンを利用する場合には第1ゾーンのAPIキーが必要になるようです。

スクリーンショット 2014 09 06 20 42 01

そうするとアクセストークンとシークレットアクセストークンが確認できるようになります。

スクリーンショット 2014 09 06 20 46 03

注:ひらがなで書いている部分には本来半角英数の文字列が記載されています。これを利用してアクセスする形となります。

 

*サーバの状態を確認する。

実際にPowerShellでサーバの一覧を取得してみます。

$ACCESS_TOKEN = "アクセストークン"
$ACCESS_TOKEN_SECRET = "シークレットアクセストークン"

$basicAuth = ("{0}:{1}" -f $ACCESS_TOKEN,$ACCESS_TOKEN_SECRET)
$basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth = [System.Convert]::ToBase64String($basicAuth)
$headers = @{Authorization=("Basic {0}" -f $basicAuth)}

Invoke-RestMethod -Uri https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/server -headers $headers -Method Get

最終行は折り返しなしの1行で。
先ほど取得したアクセストークンを設定してあげ実行すると…

From : 0
Count : 0
Total : 0
Servers : {}
is_ok : True

もちろんサーバは起動していないのでCount:0という戻り値が帰ってきます。 

 

*サーバを起動する

$ACCESS_TOKEN = "アクセストークン"
$ACCESS_TOKEN_SECRET = "シークレットアクセストークン"

$basicAuth = ("{0}:{1}" -f $ACCESS_TOKEN,$ACCESS_TOKEN_SECRET)
$basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth = [System.Convert]::ToBase64String($basicAuth)
$headers = @{Authorization=("Basic {0}" -f $basicAuth)}

$body = @{"Server.Name"="New Server";"Server.Zone.ID"=29001;"Server.ServerPlan.ID"=1001}

Invoke-RestMethod -Uri https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/server -headers $headers -body $body -Method Post

Bodyの部分を追加と一部を変更して実行してあげると…

Server Success is_ok
------ ------- -----
@{ID=112600706358; Name=New Server; HostName=localhost; ... True True

PowerShellのシェル上ではきちんと表示されていますが、このようにTrueが帰ってきます。

スクリーンショット 2014 09 06 21 58 46

さくらのクラウドのWeb画面上でも指定した名前のサーバインスタンスが出来上がっていることを確認出来ました。

先ほど実行したサーバの状態を確認するPowerShellを実行すると

From : 0
Count : 1
Total : 1
Servers : {@{Index=0; ID=112600706358; Name=New Server; HostName=localhost; Description=; ServiceClass=cloud/plan/1core-1gb; CreatedAt=2014-09-06T21:50:56+09:00; Icon=; ServerPlan
=; Zone=; Instance=; Disks=System.Object[]; Interfaces=System.Object[]; Appliance=; Tags=System.Object[]}}
is_ok : True

ちゃんとCountが1になっており1台作成されていることが確認できます。

ちなみにゾーンIDとサーバプランIDの確認の方法はURIから問い合わせできます。

Invoke-RestMethod -Uri https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/zone -headers $headers -Method Get

Invoke-RestMethod -Uri https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/product/server -headers $headers -Method Get

 

*サーバを削除する

$ACCESS_TOKEN = "アクセストークン"
$ACCESS_TOKEN_SECRET = "シークレットアクセストークン"

$basicAuth = ("{0}:{1}" -f $ACCESS_TOKEN,$ACCESS_TOKEN_SECRET)
$basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
$basicAuth = [System.Convert]::ToBase64String($basicAuth)
$headers = @{Authorization=("Basic {0}" -f $basicAuth)}

$body = {Force=true}
Invoke-RestMethod -Uri https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/server/112600706358 -headers $headers -Method DELETE -body $body

対象のサーバIDを確認し、そのURIに対してDeleteメソッドを投げるだけ。

スクリーンショット 2014 09 06 22 13 38

Web画面上でも削除されていることを確認。

ちなみに今回の方法はサーバのインスタンスの用意だけを行いました。
本来はこれに対してディスクを用意して上げる必要があります。むしろディスクを用意しないとサーバインスタンスは用意できますが 起動はできません…
このあたりもURIでコールしてIDを調べて…ッテすればできると思います。

さくらのクラウドのAPIリファレンスにはサンプルコードも掲載されているので、PowerShellとか変化球を狙わなければ比較的簡単にできると思います。 
何を思ったか今回はPowerShellで挑戦しましたが…いい勉強になりました。 

 

今回はさくらのクラウドのAPIをPowerShellから呼び出してみましたが、最近のWebAPIの多くはRESTベースのものですのでWindows環境からの利用というところで応用の幅はあるのではないかと思います。
PowerShellであればモダンなWindows環境下で新規にツールのインストールが必要ないというのが強みではないでしょうか。もちろんきちんとツールが用意できるのであればPowerShellに拘る必要もありません。