2015.04.10

GMOアプリクラウドAPIをOpenStack Command-line Clientsで叩いてみた

Pocket

次世代システム研究室のDevOpsネタ担当(見習い)のM. Y.です。

今回は、前回の記事のおまけ的な内容として、OpenStack Command-line ClientsからGMOアプリクラウドAPIを叩いてみました。

一通り叩いてみたところ、一部の例外はあるものの、思った以上にそのままOpenStack Command-line Clientを使えました。十分実用になりそうでしたので、その結果をご紹介します。

OpenStack → [API] → GMOアプリクラウド

前回のあらすじ

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

最新のGMOアプリクラウドは、OpenStack HavanaベースのAPIを提供しています。前回は、cURLからこのGMOアプリクラウドAPIを叩いてみて、実際にVMの作成からロードバランサの設定までできることを確認しました。

今回は、前回叩いたAPIについて、OpenStackのCLIからも叩くことができるのか確認してみました。まあ、作業を自動化するだけならAPIを直接叩けば十分なのですが、人間が使うときにはCLIの方が便利な場面もありそうですし、今回はそのための調査ということでやってみました。

OpenStack Command-line Clientsとは

OpenStack Command-line Clients(以下、CLI)とは、OpenStackプロジェクトが提供する、NovaやCinderなどの各種APIにアクセスできるコマンドラインクライアントです。

OpenStack 管理ユーザーガイド – 第2章 OpenStack コマンドラインクライアント
http://docs.openstack.org/ja/user-guide-admin/content/admin_ch_cli.html

OpenStackのプロジェクト(Nova、Cinderなど)それぞれに、同名のコマンド(nova、cinderなど)が存在しています。ただ、各プロジェクトとコマンドが1対1対応しているわけではないようです。例えば、VM操作に関してはnovaコマンドで完結するように、novaコマンドから他のプロジェクトのAPI(KeystoneのIdentity APIや、GlanceのImage APIなど)も呼び出していました。

OpenStack CLIで叩いてみた結果

今回用いた環境は以下の通りです。
  • マシン:MacBook Air 13-inch, Mid 2013
  • OS:OS X 10.9.5
  • OpenStack CLIのバージョン
    • nova:2.21.0
    • keystone:1.1.0
    • neutron:2.3.11
    • cinder:1.1.1
    • glance:0.15.0
前回叩いたAPIと、OpenStack CLIコマンドの対応関係は以下のようになりました。「OpenStack CLIコマンド」の列が今回叩いてみた結果です。うまく動いた部分はコマンド名を記載し、動かなかった部分は「???」と記載しました。

環境クライアントエンジンTx数TPS (Tx Per Seccond)
ConoHa4GBGeth v1.8.14clique10000374.1
ConoHa4GBParity v1.11.11Aura1000041.2

各コマンドの詳細

以下、各コマンドを叩いてみた結果の詳細です。

Authenticate APIでトークンを取得

明示的にトークンを取得したい場合は、keystone token-getコマンドで取得できます。
$ keystone token-get
+-----------+----------------------------------+
|  Property |              Value               |
+-----------+----------------------------------+
|  expires  |       2015-03-02T07:50:48Z       |
|     id    | 5feea8ab************************ |
| tenant_id | 7045a133************************ |
|  user_id  | aa134444************************ |
+-----------+----------------------------------+
ただし通常は、環境変数にOS_USERNAME、OS_PASSWORD、OS_TENANT_NAME、OS_AUTH_URLを指定しておけば、OpenStack CLIが自動的にトークンを取得してくれます。環境変数の設定方法は、openstack/python-novaclientのGitHubなどに書いてある通りにすれば大丈夫です。

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

イメージIDは、nova image-listコマンドで取得できました。ただ、–limit引数を指定しても無視されるようで、grepコマンドなどを組み合わせないと出力が多くなりすぎてしまいました。
$ nova image-list
+--------------------------------------+----------------------------------+--------+--------+
| ID                                   | Name                             | Status | Server |
+--------------------------------------+----------------------------------+--------+--------+
| 6e8b4443-3bd0-48ac-abc9-b117b06a1dc4 | gacvmi-centos-5-4                | ACTIVE |        |
| 3ef24936-ae74-46c5-acff-84fd5d011548 | gacvmi-centos-5-5                | ACTIVE |        |
(後略)
あと、何故かglanceコマンドの方では取得できませんでした。何故だろう……。
$ glance image-list
{"error":{"message":"The resource could not be found.","code":404,"title":"Not Found"}} (HTTP 404)

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

フレーバーIDは、nova flavor-listコマンドで取得できました。こちらも、–limit引数は効きませんでした。
$ nova flavor-list
+--------+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID     | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+--------+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 101021 | L-0102_H  | 2048      | 28   | 50        |      | 1     | 1           | True      |
| 101022 | L-0102_D  | 2048      | 28   | 50        |      | 1     | 1           | True      |
(後略)

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

これは、nova volume-createコマンドかcinder createコマンドで作成できるかと思ったのですが、うまくいきませんでした。

nova volume-createコマンドの方は、helpを見る限り、Block Storage API v1の引数しか取れないようなので、多分APIのバージョン違いが原因なのかと思います。

一方、cinder createコマンドの方は、環境変数OS_VOLUME_API_VERSIONを2に設定したところ、Block Storage API v2の引数を指定できるようになりました。しかし、どのコマンドを打っても以下のエラーが出る状態で、エンドポイントをうまく見つけられていないようでした。何故だろう……。
$ cinder endpoints
ERROR: publicURL endpoint for volumev2 service not found

Create server APIでVMを作成

これも、nova bootコマンドで作成できるかと思ったのですが、うまくいきませんでした。
$ nova boot --flavor 201022 --boot-volume a71c2b5f-****-****-****-************ "myoshiz-test-01"
ERROR (MethodNotAllowed): Method Not Allowed (HTTP 405)
ちなみに、ローカルディスクプランの場合はイメージIDを指定してVM作成できるので、そちらのプランなら成功するかもしれません。ただ、手元にローカルディスクプランを試せる環境がなかったので、今回は未調査です。

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

nova showコマンドにVMのIDまたは名前を指定することで、VMの詳細情報を取得できました。今回必要な外部IPアドレスは、net-1510-ext networkという項目に記載されているIPアドレスです。
$ nova show 28b6f663-078a-4d09-9f8b-e5843c1b4d5b
+--------------------------------------+----------------------------------------------------------+
| Property                             | Value                                                    |
+--------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                   |
| OS-EXT-AZ:availability_zone          | nova                                                     |
| OS-EXT-STS:power_state               | 1                                                        |
| OS-EXT-STS:task_state                | -                                                        |
| OS-EXT-STS:vm_state                  | active                                                   |
| OS-SRV-USG:launched_at               | 2015-02-05T11:47:30.000000                               |
| OS-SRV-USG:terminated_at             | -                                                        |
| accessIPv4                           |                                                          |
| accessIPv6                           |                                                          |
| config_drive                         | True                                                     |
| created                              | 2015-02-05T11:46:21Z                                     |
| flavor                               | N-0102_D (201022)                                        |
| hostId                               | 6984e733************************************************ |
| id                                   | 28b6f663-****-****-****-************                     |
| image                                | Attempt to boot from volume - no image supplied          |
| key_name                             | -                                                        |
| metadata                             | {}                                                       |
| name                                 | 10-132-***-12                                            |
| net-1510-ext network                 | 10.131.***.12                                            |
| net-1510-int network                 | 10.132.***.12                                            |
| os-extended-volumes:volumes_attached | [{"id": "2dd6ac79-****-****-****-************"}]         |
| progress                             | 0                                                        |
| security_groups                      | default                                                  |
| status                               | ACTIVE                                                   |
| tenant_id                            | 7045a133************************                         |
| updated                              | 2015-02-24T14:29:37Z                                     |
| user_id                              | aa134444************************                         |
+--------------------------------------+----------------------------------------------------------+

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

neutron lb-pool-listコマンドの出力にIPアドレスが含まれないため、neutron lb-vip-listコマンドと組み合わせる必要がありました。以下の例では、最初のコマンドでVIP IDを取得し、2番目のコマンドでそのVIP IDに対応するプールIDを取得しています。
$ neutron lb-vip-list -c id -c address -c protocol_port | grep "157.***.***.12" | grep 80
| dee836da-****-****-****-************ | 157.***.***.12 |            80 |
$ neutron lb-pool-list -c id -c vip_id | grep dee836da-****-****-****-************
| 38f4a504-****-****-****-************ | dee836da-****-****-****-************ |

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

上記で取得したプールIDを用いることで、neutron lb-member-createコマンドでVMを追加できました。
$ neutron lb-member-create --address 10.131.***.12 --protocol-port 80 38f4a504-****-****-****-************
Created a new member:
+--------------------+--------------------------------------+
| Field              | Value                                |
+--------------------+--------------------------------------+
| address            | 10.131.***.12                        |
| admin_state_up     | True                                 |
| id                 | 3f26e067-****-****-****-************ |
| pool_id            | 06aa19b6-****-****-****-************ |
| protocol_port      | 80                                   |
| status             | PENDING_CREATE                       |
| status_description |                                      |
| tenant_id          | 7045a133************************     |
| weight             | 1                                    |
+--------------------+--------------------------------------+
ちなみに、こちらについては削除も成功しました。
$ neutron lb-member-delete 3f26e067-****-****-****-************
Deleted member: 3f26e067-****-****-****-************

まとめ

一通り叩いてみた感じでは、情報を表示するためのコマンドは動作しました。十分に実用できそうな感じです。ただし、元々APIが提供されていないホストの一覧表示や、ハイパーバイザーの一覧表示は、さすがにエラーが出て動作しませんでした……。まあ、意図的にAPIが塞がれてるのかと思います。

その一方で、VMやボリュームを作成するコマンドは動作しませんでした。–debugオプションを指定するなどして調べてみたのですが、私の設定の仕方が悪いのか、APIの互換性の問題なのか、原因はわかりませんでした。時間があるときに、もう少し詳しく調べてみたいと思います。

次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。