geek.conf.2

あるエンジニアの備忘録

rubyでlistVMSnapshot@CloudStack APIを打ちたい

コンチワ。
CloudStack APIrubyで操作してごにょごにょしてます。その際に、cloudstack_ruby_clientを使っているのですが、これ、listVMSnapshotが利用できないんですね。なので、自分でRest API応答をこさえました。その時に、苦労したことがあるので、展開します。

CloudStack APIを叩く時にPortを8080を使う場合、URIに含める署名を作成する必要があります。その署名の作成方法を今日は紹介します。
その前に、CloudStack APIを叩く際のURIを構成する部品を整理します。

URI:http://YOUR_SERVER_NAME:8080/client/api?command=listVMSnapshot&response=json&apikey=YOUR_CLOUDSTACK_API_KEY&signature=YOUR_CLOUDSTACK_SIGNATURE
コマンドパラメータ:command=listVMSnapshot&response=json&apikey=YOUR_CLOUDSTACK_API_KEY
署名:signature=YOUR_CLOUDSTACK_SIGNATURE
秘密鍵YOUR_CLOUDSTACK_SECRET_KEY
はい。それでは、上記の署名を作成する方法です。ちなみにCloudStack 4.3ですね。バージョンは。

1. コマンドパラメータの要素を並べ替え
コマンドパラメータ内の&で区切りられた要素の要素名(apikeyとかcommandとか)をアルファベット順に並べ替えます。
コマンドパラメータ2:apikey=YOUR_CLOUDSTACK_API_KEY&command=listVMSnapshot&listall=true&response=json

2.コマンドパラメータ2をURLエンコード
並べ替えたコマンドパラメータ2をURLエンコードします。(コマンドパラメータ3とする)

3. コマンドパラメータ3を小文字化
URLエンコードしたコマンドパラメータ3のアルファベットを全て小文字にします。(コマンドパラメータ4とする)

4.コマンドパラメータ4をHMAC SHA-1でハッシュ化し、Base64エンコード
小文字化したコマンドパラメータ4をハッシュアルゴリズムHMAC SHA-1でハッシュ化します。さらにBase64エンコーディングし、UTF-8にします。(署名0とする)

5.署名0をURLエンコード
コマンドパラメータ4をハッシュ化してBase64エンコードした署名0をさらにURLエンコードします。(署名とする)

署名の出来上がりです。

これをrubyでこさえるとこんな感じです。※サーバURLやapikeyは外部ファイルから取っています。

command_param = "apikey=#{config['APIKEY']}&command=listVMSnapshot&listall=true&response=json"
urlenc_command_param =  URI.escape(command_param)
data = urlenc_command_param.downcase
base64_sig = Base64.encode64(OpenSSL::HMAC.digest( OpenSSL::Digest.new('sha1'), config['SECKEY'], data)).strip
enc_sig = CGI.escape(base64_sig)
access_uri = URI.parse("#{config['URL']}/client/api?#{command_param}&apikey=#{config['APIKEY']}&signature=#{enc_sig}")

そして、listVMSnapshotを実行して、作成されて1日経過しているものの個数を出力するコードはこんな感じになります。

rubyでCloudStack APIエンドポイントURIの署名作成方法ってあまり、なかったので書いてみました。
おしまい。