API経由で外部に接続するサーバーを作ってみよう


mex_icon

みなさんこんにちは。技術支援のメックスです。馬には乗ってみよ人には添うてみよ、と言いますがクラウドサービスは使ってみよと言ったところでしょうか。使えば使うほど理解が深まるように感じます。

今回はAPIシリーズです。API経由で外部ネットワークに接続するサーバーを作成してみましょう。

GMOアプリクラウドのAPIを叩いてみた
GMOアプリクラウドのAPIを使ってみよう(認証編)
GMOアプリクラウドのAPIで仮想サーバー(ローカルディスクプラン)を作ってみる
GMOアプリクラウドのAPIで仮想サーバー(外部ディスクプラン)を作ってみる
API操作用のトークンIDを変数に入れてみよう
自分で保存したイメージを使用して、API経由で仮想サーバーを作成してみよう(ローカルディスクプラン編)
ロードバランサーをAPI経由で操作してみよう

WEBサーバーやAPPサーバー等、外部からの通信リクエストを直接さばくサーバーはその性質上、どうしても負荷が高まる事が多いです。また、負荷が高くなってボトルネックになってしまう時に、サーバーを増強する事で負荷分散を行う事もデータベースやキャッシュサーバーと比較すると容易である為、スケールを考えやすいといえます。

構築用のスクリプトを予め組んでおけば、緊急時に素早い対応が可能です。また、負荷を感知してのサーバー増加、サーバー減少を自動で行うオートスケール等、出来る事が格段に広がります。GMOアプリクラウドではサーバー作成、削除を全てAPI経由で行える仕様になっています。

今回は外部サーバーを作成するサンプルスクリプトを共有させて頂きます。今回の記述する環境は以下の通りです。尚、本記事の手順は一例であり、動作を保障するものではございませんので、お客様環境におきましては導入前に検証の上、ご利用下さい。


実行仮想サーバータイプ LS-0102
OS CentOS 6.7

作成仮想サーバータイプ  N-0404
OS    CentOS6.7


#!/bin/sh

#アカウント情報
ACCOUNT='アカウント情報'
PASSWORD='パスワード情報'
TENANTID='テナントID'

#、USERTOKEN変数に入れる
USERTOKEN=`curl -i '認証エンドポイント/tokens' -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d "{\"auth\":{\"passwordCredentials\":{\"username\":\"$ACCOUNT\",\"password\":\"$PASSWORD\"},\"tenantId\":\"$TENANTID\"}}" | sed -e '1,7d' | jq -r '.access.token.id'`

#N0404(時間課金)を作成
#centOS6.7をベースにボリュームの作成
curl -X POST -H "X-Auth-Token: $USERTOKEN" -H Content-Type:application/json -d '{"volume": {"name": "test-name","size": "30","volume_type": "os_boot_v2","imageRef":"014ab971-6162-456e-b95c-27985ec56a8f"}}' ボリュームエンドポイント/volumes

#ボリューム一覧を呼び出し、任意のIDを切り出して、VOLUMESID変数に入れる
VOLUMESID=`curl -i -X GET -H "Accept: applicationjson" -H "X-Auth-Token: $USERTOKEN" ボリュームエンドポイント/volumes/detail | sed -e '1,7d' | jq '.volumes[] | select(.name == "test-name")' | jq -r .id`

#ボリュームが出来上がるまで10秒待つ
sleep 10s

#新規VMの作成
curl -X POST -H "X-Auth-Token: $USERTOKEN" -H Content-Type:application/json -d "{\"server\":{\"name\":\"Ntest-vm\",\"flavorRef\":\"204041\",\"networks\":[{\"fixed_ip\":\"eth0ローカルIPアドレス\"},{\"fixed_ip\":\"eth1ローカルIPアドレス\"}],\"block_device_mapping\":[{\"volume_id\":\"$VOLUMESID\"}]}}" サーバー操作エンドポイント/servers

#VMが出来上がるまで30秒待つ
sleep 30s

#新規VMをロードバランサのバランシング対象にする
curl -i -X POST -H "X-Auth-Token: $USERTOKEN" -H "Content-Type: application/json" -H "Accept: application/json" -d '{"member": {"protocol_port": "80", "address": "eth0ローカルIPアドレス","pool_id": "PoolID","admin_state_up": true}}' ネットワークエンドポイント/lb/members

それでは解説していきましょう。

#!/bin/sh

#アカウント情報
ACCOUNT='アカウント情報'
PASSWORD='パスワード情報'
TENANTID='テナントID'

#、USERTOKEN変数に入れる
USERTOKEN=`curl -i '認証エンドポイント/tokens' -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d "{\"auth\":{\"passwordCredentials\":{\"username\":\"$ACCOUNT\",\"password\":\"$PASSWORD\"},\"tenantId\":\"$TENANTID\"}}" | sed -e '1,7d' | jq -r '.access.token.id'`

トークン情報を変数に入れる記述です。API操作用のトークンIDを変数に入れてみようで解説した内容と同一ですので詳しくはそちらをご覧下さい。

#N0404(時間課金)を作成
#centOS6.7をベースにボリュームの作成
curl -X POST -H "X-Auth-Token: $USERTOKEN" -H Content-Type:application/json -d '{"volume": {"name": "test-name","size": "30","volume_type": "os_boot_v2","imageRef":"014ab971-6162-456e-b95c-27985ec56a8f"}}' ボリュームエンドポイント/volumes

#ボリューム一覧を呼び出し、任意のIDを切り出して、VOLUMESID変数に入れる
VOLUMESID=`curl -i -X GET -H "Accept: applicationjson" -H "X-Auth-Token: $USERTOKEN" ボリュームエンドポイント/volumes/detail | sed -e '1,7d' | jq '.volumes[] | select(.name == "test-name")' | jq -r .id`

外部ディスクプランのVMを作成する為に、まずはボリュームを作成します。前回VMの作成を解説した際は、ローカルディスクプランでしたのでボリュームを作成する必要がなかったのですが、カズさんが以前記述した通り外部ディスクプランで作成する場合は、予めボリュームを作成する必要があります。
name名は任意です。
014ab971-6162-456e-b95c-27985ec56a8fは、CentOS6.7イメージを作成する際のIDです。イメージIDは予めAPI経由で確認してください。もちろん自分で作成したイメージIDも使えます。ボリュームエンドポイントはコントロールパネル上から確認して下さい。ボリューム作成後、ボリューム一覧を呼び出し、ボリューム作成時に命名したname名をフックにIDをVOLUMESIDに入れます。name名を変更した場合は、ここもボリューム作成時と同じname名に変更して下さい。

#ボリュームが出来上がるまで10秒待つ
sleep 10s

#新規VMの作成
curl -X POST -H "X-Auth-Token: $USERTOKEN" -H Content-Type:application/json -d "{\"server\":{\"name\":\"Ntest-vm\",\"flavorRef\":\"204041\",\"networks\":[{\"fixed_ip\":\"eth0ローカルIPアドレス\"},{\"fixed_ip\":\"eth1ローカルIPアドレス\"}],\"block_device_mapping\":[{\"volume_id\":\"$VOLUMESID\"}]}}" サーバー操作エンドポイント/servers

続いてVMの作成です。
外部ディスクプランの自動作成スクリプトを記述する際に気をつけるべき点としては、ボリューム作成のAPIを叩いた後、1テンポ置く事です。すぐにVMを作成しようとするとまだボリュームが出来上がっておらず、エラーが出てしまいます。今回はちょっと長めに10秒間、sleepコマンドで時間を置いています。

充分に時間を置き、ボリュームが完成した後VMの作成です。
nameは任意です。
fravorRefは作成したいサーバーのスペックIDです。こちらを参考に作成したいVMスペックを事前に調べ、IDを記述して下さい。今回はN-0404の時間課金タイプですので、204041と記述しています。
今回はローカルIPアドレスを指定して作成しています。必ずeth0とeth1を併記するようにして下さい。

#VMが出来上がるまで30秒待つ
sleep 30s

#新規VMをロードバランサのバランシング対象にする
curl -i -X POST -H "X-Auth-Token: $USERTOKEN" -H "Content-Type: application/json" -H "Accept: application/json" -d '{"member": {"protocol_port": "80", "address": "eth0ローカルIPアドレス","pool_id": "PoolID","admin_state_up": true}}' ネットワークエンドポイント/lb/members

VMが出来上がりましたら、外部から通信を受けられるようにロードバランサーに紐付けします。

先程のボリューム作成時と同じ理屈で、APIを叩いた後すぐに紐付けを行おうとしますと、VMがまだ出来上がっておらずエラーが出ます。sleepコマンドでしばらく間を置きましょう。

ロードバランサーへの紐付けはこちらの記事が参考になるかと思います。

以上となります。シェルスクリプトは組むのは少し面倒ではありますが、一度組んでしまえば非常に作業効率を上げる事が出来るので、是非お試しになってみて下さい。

カテゴリー: GMOアプリクラウド サービス・機能   タグ: ,   この投稿のパーマリンク

コメントは受け付けていません。