2015.02.10

GMOアプリクラウドAPIを試してみた(VM作成からロードバランサ設定まで)

Pocket

初めまして。1月からGMOインターネット株式会社に入社し、次世代システム研究室にjoinしたM. Y.です。主にWebアプリケーションの開発を担当しています。どうぞよろしく。

さて、今回は、GMOアプリクラウドが提供するAPIが、VM作成からロードバランサ設定まで自動化するための機能を備えているかどうかを試してみます。実際に自動化するのは次回以降のネタとして、今回はまずcURLでAPIを1個ずつ叩いてみます。

GMOアプリクラウドAPI

GMOアプリクラウドとは

ソーシャルアプリの開発・運営を支援する【GMOアプリクラウド】
http://cloud.gmo.jp/

GMOインターネット株式会社が提供する、ソーシャルゲームの公開に最適化されたクラウドサービスです。

私たち次世代システム研究室でも、コストパフォーマンスが良いということで自社サービスの基盤として利用しておりますし、「サバろうぜ!」という研究・開発支援制度を通して個人の実験環境としても活用しています。また、GMOアプリクラウドの最新環境はOpenStack Havanaで提供されており(参考:GMOアプリクラウドでのOpenStack Baremetal)、OpenStackが提供するAPIすべてではないですが、そのうちの一部を公開しています。

GMOアプリクラウド APIリファレンス
http://cloud.gmo.jp/docs/

私はGMOアプリクラウドについては全くの初心者なのですが、上記のAPIリファレンスを読みつつ、お客様センターの担当者にお問い合わせしながら、APIをいろいろ叩いてみました。

やりたいことと、今回の範囲

Webサーバを増設するために、
  1. VMの作成
  2. ソフトウェアのインストール
  3. 監視などの各種設定
  4. ロードバランサの設定
といった作業はよくあると思うので、まずはこのあたりの自動化を目指します。

2~3番目は、GMOアプリクラウドの範疇ではないので、1番目と4番目の作業がAPIで実施できるかどうか?の検証が今回の範囲です。cURLでAPIを順番に叩き、やりたいことがどこまでできるか確認してみます。

API叩いてみた

以下の順に叩いていったら、ロードバランサの設定まであっさりできました。ただ、APIの呼び出し方でいくつか詰まるところがあったので、そのあたりを少しご紹介します。

API叩いてみた(詳細版)

Authenticate APIでトークンを取得

GMOアプリクラウドAPIでは、ユーザー名とパスワードで認証するのはAuthentication APIだけで、その他のAPIは、このAuthentication APIで取得したトークン(24時間有効)を使って認証します。

このAuthentication APIの認証に使うユーザは、コントロールパネルの「ユーザー」→「ユーザー管理」→「アカウント管理」画面で作成したユーザです。ユーザの権限は「オペレータ」と「ゲスト」の2種類から選べますが、「ゲスト」にはAPIを叩く権限が含まれないのでご注意ください。それと、テナントIDはコントロールパネルの「API情報」の画面で確認できます。

叩き方はこんな感じ。以下の例で “691b1cf1************************” となっている部分がトークンです。以降のAPI呼び出しで、”X-Auth-Token” ヘッダのなかに入れて使います。
$ curl -i -X POST \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"auth":{"passwordCredentials":{"username":"app*********","password":"********"},"tenantId":"********************************"}}' \
https://ident-r1nd1001.app-sys.jp/v2.0/tokens


HTTP/1.1 200 OK
Server: nginx/1.6.1
Date: Thu, 05 Feb 2015 11:23:55 GMT
Content-Type: application/json
Content-Length: 2114
Connection: keep-alive

{"access":{"token":{"issued_at":"2015-02-05T11:23:55.770935","expires":"2015-02-06T11:23:55Z","id":"691b1cf1************************",
(後略)

インストールしたいOSに対応したイメージIDを察する

コントロールパネルの「サーバー追加」画面でVM追加する場合、同じ画面でOSを選択できるのですが、API経由でVMを作る場合はインストールしたいOSに対応した「イメージID」を指定する必要があります。

で、このイメージIDは、List images APIの返り値から探すことができます。例えば、以下はList images APIの返り値から、CentOS 7.0に対応したイメージの部分だけ取り出したものです。nameから、なんとなくOSを察することができます。
{"status":"active","name":"gacvmi-centos-7-0","tags":[],"container_format":"ovf","created_at":"2015-01-26T06:26:03Z","disk_format":"qcow2","updated_at":"2015-01-26T07:02:14Z","visibility":"public","self":"/v2/images/a24d1b15-f322-430d-9e13-50513499e2ed","protected":false,"id":"a24d1b15-f322-430d-9e13-50513499e2ed","file":"/v2/images/a24d1b15-f322-430d-9e13-50513499e2ed/file","checksum":"2189929d9d8afdb71bcebf4b2b188c55","min_disk":0,"size":1656881152,"min_ram":0,"schema":"/v2/schemas/image"}
または、コントロールパネルの「サーバー追加」画面のソースを開くと、以下の様なHTMLがあるので、こっちから察するほうが楽だと思います(※個人の感想です)。
<option value="a24d1b15-f322-430d-9e13-50513499e2ed" selected="selected">デフォルト (CentOS 7.0)</option>

作りたいVMのスペックに対応したフレーバーIDを察する

フレーバーというのはOpenStackで使われている用語で、CPU、メモリ、ディスクの使用量の組合せの定義のことです。GMOアプリクラウドでは、料金表にあるL-0102やN-0102といったタイプが、フレーバーに相当します。

フレーバーの情報はList details for flavors APIで取得できます。これもList images APIと同様に、なかなか人間が読むには辛い分量ですが、N-0102などのタイプが”name”に入っているので、List images APIよりは察しを求める度合いは低いです。

ただ、このAPIの返り値をよく見ると、”N-0102_D”、”N-0102_H”のように、似たnameのフレーバーが複数あります。これは”_D”と付いている方が日課金、”_H”が時間課金のようです。

Create volume APIで、os_bootタイプのボリュームを作成(外部ディスクプランの場合のみ)

GMOアプリクラウドのプランには、ローカルディスクプランと外部ディスクプランという2種類の仮想サーバーがあります。

外部ディスクプランの仮想サーバーを作る場合は、事前に、Create volume APIで、os_bootタイプのボリュームを作る必要があります。以下は、CentOS 7.0のボリュームを作る例です。
$ curl -X POST \
-H X-Auth-Token:691b1cf1************************ \
-H Content-Type:application/json \
-d '{"volume": {"name": "n-0102-centos-7-0","size": "30","volume_type": "os_boot", "imageRef": "a24d1b15-f322-430d-9e13-50513499e2ed"}}' \
https://block-service-r1nd1001.app-sys.jp/v2/7045a133************************/volumes
{"volume":{"id":"2dd6ac79-****-****-****-************","links":[{"href":"https://block-service-r1nd1001.app-sys.jp/v2/7045a133************************/volumes/2dd6ac79-****-****-****-************","rel":"self"},{"href":"https://block-service-r1nd1001.app-sys.jp/7045a133************************/volumes/2dd6ac79-****-****-****-************","rel":"bookmark"}],"name":"n-0102-centos-7-0"}}

Create server APIでVMを作成

ここまで来ればいよいよVMを作成できます。上記のIDが分かっていれば、あまり詰まることもなくAPI呼び出しできるでしょう。注意点としては、外部ディスクプランの場合はimageRefを指定せず、volume_idに先ほど取得したボリュームID(上記の例では2dd6ac79-****-****-****-************)を指定する、というくらいです。

ちなみに、コントロールパネルでVMを作ると、サーバー名は勝手に割り当てられます(例:gac**-********)。このAPIのパラメータには”name”というのがあったので、「好きなサーバ名を付けられる?」とちょっと喜んだのですが、普通に無視されました。がっかりです。タグを指定できないのも、ちょっと不便ですね。将来の機能拡張に期待です。
$ curl -X POST \
> -H X-Auth-Token:691b1cf1************************ \
> -H Content-Type:application/json \
> -d '{"server":{"name":"myoshiz-test-01","flavorRef":"201022","block_device_mapping":[{"volume_id":"2dd6ac79-****-****-****-************"}]}}' \
> https://compute-r1nd1001.app-sys.jp/v2/7045a133************************/servers
{"server":{"security_groups":[{"name":"default"}],"OS-DCF:diskConfig":"MANUAL","id":"28b6f663-****-****-****-************","links":[{"href":"https://compute-r1nd1001.app-sys.jp/v2/7045a133************************/servers/28b6f663-****-****-****-************","rel":"self"},{"href":"https://compute-r1nd1001.app-sys.jp/7045a133************************/servers/28b6f663-****-****-****-************","rel":"bookmark"}],"adminPass":"************"}}

Get server details APIでVMのIPアドレスを取得

IPアドレスは指定しなくても、VM作成時に勝手に割り当てられます。ただ、新規作成したVMを、特定のVIPにぶら下げるためには、このVMのIPアドレスが必要なんですよね……。

VM作成時の返り値を使って、Get server details APIを呼び出すと、そのVMの詳細を取得できます。

私は最初分からずに、サポートの方から教えていただいたのですが、VMにはeth0とeth1が割り当てられており、外部からの通信にはeth0が利用されます。Create a load balancer member APIのページにある「External IP」というのは、そのeth0に割り当てられたIPアドレスのことだそうです。このIPアドレスを控えておきましょう。

List VIPs APIでVMを追加したいVIPに対応したプールIDを取得

List VIPs APIを呼び出すと、ロードバランサに設定されたIPアドレスとポート番号の組が返されます。この返り値のなかに、VIPに対応したプールIDも含まれます。

例えば、List VIPs APIのページの例で言うと、157.7.158.200:80に対応するプールIDは”75f87fc5-473b-4879-9e55-a9d89af63c01″です。そろそろAPIにも慣れてきたと思うので、サクサク行きましょう。

Create a load balancer member APIで新規作成したVMを追加

そして、ここまでに調べたプールIDと、External IPと、あとはVMのポート番号を指定して、Create a load balancer member APIを呼び出せば、設定完了です。

以下のように201メッセージが返ってきて、コントロールパネル上のページで設定確認するまでには、設定完了していました。長い道のりでしたが、お疲れ様でしたー。
$ curl -i -X POST \
> -H "X-Auth-Token: 691b1cf1************************" \
> -H "Content-Type: application/json" \
> -H "Accept: application/json" \
> -d '{"member": {"protocol_port": "80", "address": "10.131.***.***","pool_id": "38f4a504-***-****-****-************","admin_state_up": true}}' \
> https://networking-r1nd1001.app-sys.jp/v2.0/lb/members
HTTP/1.1 201 Created
Server: nginx/1.6.1
Date: Fri, 06 Feb 2015 06:21:40 GMT
Content-Type: application/json
Content-Length: 280
Connection: keep-alive

{"member":{"status":"PENDING_CREATE","status_description":null,"weight":1,"admin_state_up":true,"tenant_id":"7045a133************************","pool_id":"38f4a504-***-****-****-************","address":"10.131.***.***","protocol_port":80,"id":"e29cb5b8-****-****-****-************"}}

今後は?

とりあえず、APIとして必要な機能が揃っていることは確認できたので、これを自動化のためのスクリプトから呼び出す方法など考えてみたいと思います。OpenStack CLIとの互換性は今回調べませんでしたが、そのあたりもちょっと興味あるところですね。今回の記事をお読みくださった皆さんも、もし興味が沸きましたら、GMOアプリクラウドAPIを試してみてください。