2016年12月22日

curlでOpenStack API叩いてみた

OpenStack アドベントカレンダー22日目のエントリとなります。

申込んだのはいいけどネタはない。
だがネタができるのを待っていたらいつまでも書けない。
そう思って後追いでネタを考えようとしてましたが
ポケモンサンムーンポケモンGOとFateGrand Orderと
遊戯王デュエルリンクスとシャドウバースに追われる日々で
何のネタも!浮かびませんでした!!

OpenStack擬人化?
あれから1年経ってるけど何もしてないです!!!
多分今後もやりません!!!!!

鉄板の鰻ネタ?書く前にまず、鰻が食べたいです。

阿部さんネタ?それはアッードベントカレンダーですね。


…とまぁ最悪ネタに走ってしまおうと思ってましたが
特に面白いことは浮かばなかったので
超初心者でも書けるネタにします。


本題:OpenStack APIを使おう

というわけでAPIの使い方でも触れてお茶を濁します。 http://developer.openstack.org/ja/api-guide/quick-start/ この辺見ればとりあえず載ってるよ。 以上終了。 冗談はおいておいて、もうちょっとちゃんと扱います。 python-openstackclientをインストールして openstackって打ったあと helpとか実行すれば使い方出てくるよ! 以上終(略) …なんですが、クライアントのインストールが面倒というケースが多々あると思います。
  • CentOS6とかだとまずpython2.7を入れるのが大変
  • 手間はかけてもいいけど、ライブラリを汚したくない
  • 勝手にclientを入れられない共有サーバだけどAPI疎通テストしたい
  • そんな事より鰻が食べたい
などなど、python-xxxxxclientでは対応できないケースもあります。 そんなわけで今回はcurlとjqを使った方法にします。 jqを入れられないケースはあるかもしれませんが、所詮パーサなのでそこは違う手段で頑張って、どうぞ 人間が読んで解釈する、いわばお前がパーサになるんだよ!!でも良いかと思います。

OpenStack APIをcurlで使うサンプル

大雑把な前提知識
  • OpenStackはREST APIを使っていてhttpベースで操作できる
  • 認証情報は直接リクエストに入れず、認証時に発行されたトークンをヘッダに入れる
という理由で、まずはトークンの取得が必要になります。

トークンの取得

  1. 認証情報の入ったリクエストデータをサーバに送る
  2. サーバからのレスポンスの中にトークンがあるので以後の処理で使用する
1のためのサンプルを載せます。 Identity API v2だとレスポンスデータ(json)の中にtokenが入っていますが Identity API v3からはHTTPヘッダに含まれます。 Identity API v2は既に非推奨なのでここではv3用の例となります。 tokenの取得方法は何パターンかあるようですが Projectを明記しているscopedのリクエストになります。 参考:identity API v3 API Examples using Curl もう全部公式のドキュメントでいいんじゃないかな
# OS_AUTH_URL=http://identityhost:port/v3 # curl -i -k -X POST $OS_AUTH_URL/auth/tokens \ -H "Content-Type: application/json" -d '{ "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "$username", "password": "$password", "domain": { "id": "default" } } } }, "scope": { "project": { "name": "$project", "domain": { "id": "default" } } } } }'
($username, $password, $projectはそれぞれ自分のものに読み替えてください) tokenデータがHTTPヘッダに入る関係上、-iオプションを付けているのと 独自CA局でのHTTPSな場合もあるので-kオプションも入れてます。 レスポンスデータに、サービスカタログの情報もあるため 一時ファイルに保存して、必要なものを取り出すという作りにしても良いでしょう。 パースの際にjqが役立ちます。 TOKENデータは
X-Subject-Token: xxxxxx
として設定されているため
TOKEN=xxxxxx
みたいにシェルの変数に設定することでその後の処理に使いやすくできます。

トークンを使った処理とjqでのパース

トークンはX-Auth-TokenというHTTPヘッダに設定して使う取り決めになっているので
curl -k -H "X-Auth-Token: $TOKEN" "http://host:port/お目当てのpath"
のように実行していきます。 ここではjqのサンプルを兼ねてその後の処理に必要な、swiftのpublic URLの取得を行います。 (token取得時に取れるかもしれないけど、まぁ…)
curl -k -H "X-Auth-Token: $TOKEN" "$OS_AUTH_URL/auth/catalog" \ | jq ."catalog" | jq 'map(select(.["name"] == "swift"))' | jq .[]."endpoints" \ | jq 'map(select(.["interface"] == "public"))' | jq .[]."url"
Jqについてはjqコマンドが便利な件を参考にさせていただきました。 jq .[]."endpoints" のようにしてjsonの階層を絞り込み jq 'map(select(.["interface"] == "public"))' のようにして条件に合致するものを取り出します。 あとはObject Storage APIのリファレンスを見て お目当てのURLに好きなリクエストを送るだけです。 上記のjqパースでは
"http://object-storagehost:port/v1/AUTH_xxxxxxxxx"
というような形で /v1/{account} までが補完された状態で取得できます。 その後の処理に使いやすいように以下のように設定します。
OBJECT_STORAGE_URL="http://object-storagehost:port/v1/AUTH_xxxxxxxxx"

swift API利用サンプル

コンテナ一覧は GET /v1/{account} で取得できるので以下のようにします。
curl -k -H "X-Auth-Token: $TOKEN" "$OBJECT_STORAGE_URL"
コンテナ内のオブジェクト一覧だと GET /v1/{account}/{container} なので以下のようにし
curl -k -H "X-Auth-Token: $TOKEN" "$OBJECT_STORAGE_URL/$container
オブジェクトの取得だと GET /v1/{account}/{container}/{object} なので以下。
curl -k -H "X-Auth-Token: $TOKEN" "$OBJECT_STORAGE_URL/$container"/$object
(オブジェクトの内容が標準出力に表示されるので ファイルとして保存するにはcurlのオプションやリダイレクトを使う。)

結論

APIリファレンスからリクエストに必要な情報を調べ、レスポンスデータのjsonの構造を見て 必要な情報を取り出して…と、中々地道な作業が必要になります。 鰻が食べたくなりますね APIパラメータを調べたり、jqでパースしたりしなくても使えるpython-xxxxclientっていいね!


nanodayo at 11:12コメント(0) 
OpenStack 

コメントする

名前
 
  絵文字