rubyでlistVMSnapshot@CloudStack APIを打ちたい
コンチワ。
CloudStack APIをrubyで操作してごにょごにょしてます。その際に、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の署名作成方法ってあまり、なかったので書いてみました。
おしまい。