Posted at

idcfcloud-cliからILBを操作してみる(ILBでオートスケールできるかな)

More than 1 year has passed since last update.


はじめに

idcfcloud-cliで、ILBの操作を試してみます。

最終的に、リソース監視と組み合わたオートスケールのための試行として、ILB配下のサーバ追加/削除用のシェルスクリプトを作ります。

前提条件

Ruby 2.2.7以降

環境

Amazon Linux AMI release 2017.03

※ 環境の違う方は、本家のマニュアルとブログを参考にインストールを進めてください。

idcfcloud-cliについて|技術ドキュメント/API

idcfcloud-cliをリリース!|IDCF テックブログ


インストール


Ruby

idcfcloud-cliは、前提条件としてRuby 2.2.7以降がインストールされた環境が必要です。

既存環境のRubyが2.0だったため、2.3をインストールします。

Amazon Linuxには標準でalternatives コマンドが入っているので、Rubyのバージョンを切り替えて使用します。

切替可能なバージョンのリストを表示

# update-alternatives --display ruby

rubyインストール

# yum install -y ruby23 ruby23-devel

Rubyの選択バージョンを切り替え

# update-alternatives --set ruby /usr/bin/ruby2.3

下記で対話的に切り替えることもできます。

# alternatives --config ruby

alternativesの参照先が切り替わったかどうか確認。

# update-alternatives --display ruby

ruby - status is manual.
link currently points to /usr/bin/ruby2.3

Rubyのバージョンが2.3になっていることを確認。

# ruby --version

ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux-gnu]


Gem

idcfcloud-cliはRubyGemsからインストールするので、準備しておきます。

次のコマンドでGemパッケージのインストールからアップデートまでを行う事ができます。

# gem update --system

# gem --version
2.6.13


idcfcloud-cli


インストール

idcfcloud-cliをインストールしていきます。

インストールフォルダ配下に設定ファイルが出来るため、

下記コードでは明示的にユーザー領域にインストールしています。

$ gem install --user-install idcfcloud

Fetching: idcfcloud-0.1.4.gem (100%)
Please carry out 'init' command.
Successfully installed idcfcloud-0.1.4
Parsing documentation for idcfcloud-0.1.4
Installing ri documentation for idcfcloud-0.1.4
Done installing documentation for idcfcloud after 0 seconds
1 gem installed

以下のコマンドで、どこにインストールされたか確認できます。

$ gem contents idcfcloud  | grep bin

/home/qg/.gem/ruby/2.3/gems/idcfcloud-0.1.4/bin/idcfcloud


初期設定

自分のIDCFクラウドのAPI情報を確認し初期設定として入力していきます。

$ idcfcloud init

default:api_key[NONE] :
【API Keyを貼りつけてください】
default:secret_key[NONE] :
【Secret Keyを貼りつけてください】
default:region[NONE] :
【デフォルト指定するリージョンを記述ください(jp-east/jp-east-2/jp-west)】

以下はTabキーによる入力補完を行うための設定です。便利機能ですね。

$ vi ~/.bash_profile

source $HOME/.gem/ruby/2.3/gems/idcfcloud-0.1.4/output/complement.bash


実行


list_loadbalancers:ILBの情報を取得する

WebコンソールからILBを作成して、idcfcloud-cli から情報を取得してみましょう。

IDCFクラウド上に、Webサーバを2台用意しておき、

そのうちの1台をILBの配下に設置します。

Screenshot-2017-10-18 IDCFクラウド - ilb create.png

このILBの情報を cli から情報を取得してみます。JSON形式でいーっぱい情報が返ってきますね。

このデータのうち、ILBのIDとconfigのIDは、

サーバ追加や削除等、他のコマンド実行時にパラメータとして使用します。

$ idcfcloud ilb list_loadbalancers

{
"status": 200,
"message": "",
"data": [
{
"id": "5ea2a04b-3419-43ea-a9ee-bdbba9abad95",
"account_id": "71000007335",
"network_id": "34a1ea86-9ef1-485d-9a45-bd509f0e8d33",
"network_name": "lux-network1",
"network": {
"id": "34a1ea86-9ef1-485d-9a45-bd509f0e8d33",
"name": "lux-network1",
"account_id": "71000007335",
"networkcidr": "10.32.0.0/22",
"domainid": "35874605-3e5a-4381-9efa-a21d1218b57b",
"domain": "71000007335",
"gateway": "10.32.0.1",
"networkoffering_id": "7c1bbf37-5551-4fdb-9e7f-d799c64e3b6e",
"networkoffering_name": "DefaultIsolatedNetworkOffering",
"state": "Implemented",
"traffic_type": "Guest",
"related": "34a1ea86-9ef1-485d-9a45-bd509f0e8d33",
"zone_id": "95c8746d-57b3-421f-9375-34bea93e2a3d",
"zone_name": "lux"
},
"configs": [
{
"id": "17a3c43b-ba12-474e-be9d-4aa1afb314b7",
"port": 80,
"loadbalancer_id": "5ea2a04b-3419-43ea-a9ee-bdbba9abad95",
"algorithm": "roundrobin",
"healthcheck": {
"check_interval": 30,
"timeout": 5,
"type": "http",
"unhealthy_threshold": 2,
"healthy_threshold": 10,
"path": "/"
},
"frontend_protocol": "http",
"backend_protocol": "http",
"connection_timeout": 60,
"created_at": "2017-10-18T16:39:28.000+09:00",
"updated_at": "2017-10-18T16:39:50.000+09:00",
"servers": [
{
"id": "20344366-d7c2-4e96-8bbc-ba2bbfcefe02",
"loadbalancer_id": "5ea2a04b-3419-43ea-a9ee-bdbba9abad95",
"config_id": "17a3c43b-ba12-474e-be9d-4aa1afb314b7",
"ipaddress": "10.32.0.161",
"port": 80,
"created_at": "2017-10-18T16:39:28.000+09:00",
"updated_at": "2017-10-18T16:39:50.000+09:00",
"state": "Running"
}
],
"state": "Running"
}
],
"name": "ilbtest",
"created_at": "2017-10-18T16:39:28.000+09:00",
"updated_at": "2017-10-18T16:39:50.000+09:00",
"state": "Running",
"fqdn": "ilbtest.public.ilb.jp-east-2.idcfcloud.net",
"zone_id": "95c8746d-57b3-421f-9375-34bea93e2a3d",
"zone_name": "lux"
}
]
}


add_server:ILBにサーバを追加する

では、ILBにサーバをもう一台追加してみます。

パラメータは、上記の list_loadbalancers で返ってきた値と追加サーバの情報です。


  • ILBのID

  • configのID

  • 追加サーバのdata(IPアドレスとポート番号)

実行すると、ILBの配下のサーバがに2台になります。

$ idcfcloud ilb add_server \

> "5ea2a04b-3419-43ea-a9ee-bdbba9abad95" \
> "17a3c43b-ba12-474e-be9d-4aa1afb314b7" \
> '{"ipaddress":"10.32.0.15", "port":80}'
{
"status": 200,
"message": "",
"data": [
{
"id": "20344366-d7c2-4e96-8bbc-ba2bbfcefe02",
"ipaddress": "10.32.0.161",
"port": 80
},
{
"id": "4c3f6365-458a-4778-95b6-b337ed604598",
"ipaddress": "10.32.0.15",
"port": 80
}
]
}


delete_server:ILBからサーバを削除する

次は、追加したサーバを削除してみます。

パラメータは以下です。


  • ILBのID

  • configのID

  • 対象サーバのID

$ idcfcloud ilb delete_server \

> "5ea2a04b-3419-43ea-a9ee-bdbba9abad95" \
> "17a3c43b-ba12-474e-be9d-4aa1afb314b7" \
> "4c3f6365-458a-4778-95b6-b337ed604598"
{
"status": 200,
"message": "",
"data": null
}


list_servers:サーバリストの確認

サーバーリストを実行してみます。

パラメータは以下です。


  • ILBのID

  • configのID

$ idcfcloud ilb list_servers \

> "5ea2a04b-3419-43ea-a9ee-bdbba9abad95" \
> "17a3c43b-ba12-474e-be9d-4aa1afb314b7"
{
"status": 200,
"message": "",
"data": [
{
"id": "20344366-d7c2-4e96-8bbc-ba2bbfcefe02",
"ipaddress": "10.32.0.161",
"port": 80
}
]
}


create_loadbalancer:ILBを新規作成する

create_loadbalancerのパラメータは、helpを見ても<attributes> [headers]とあるだけで、

何を指定するのかよくわかりません・・・。

$ idcfcloud ilb help

Commands:
...
idcfcloud ilb create_loadbalancer <attributes> [headers] ...
...

気になるので、調べてみましょう。

$ idcfcloud ilb create_loadbalancer '{"name": "lbtest", "network_id": "34a1ea86-9ef1-485d-9a45-bd509f0e8d33", "configs": [{"ipaddress":"10.32.0.161", "port":80}]}'

HTTP status code: 400, Error message: Parameter Error.
frontend_protocol(#0) is invalid,backend_protocol(#0) is invalid,servers(#0) is invalid,algorithm(#0) is invalid,healthcheck(#0) is invalid, Reference: http://docs.idcf.jp/cloud/ilb/

パラメータが足りないみたいですね。

エラーとなっているパラメータを追記して・・・。

$ idcfcloud ilb create_loadbalancer '{"name": "lbtest", "network_id": "34a1ea86-9ef1-485d-9a45-bd509f0e8d33", "configs": [{"port": 80, "algorithm": "roundrobin", "healthcheck": {"check_interval": 30, "timeout": 5,"type": "http","unhealthy_threshold": 2,"healthy_threshold": 10,"path": "/"}, "frontend_protocol": "http", "backend_protocol": "http", "connection_timeout": 60, "servers": [{"ipaddress":"10.32.0.161", "port":80}]}]}'

{
"status": 200,
"message": "",
"data": {
"id": "bf82c638-adf7-4ae4-b461-b1bc5ab23a7c",
"configs": [
{
...
"state": "Running"
}
}

できました♪

HTTPの負荷分散の例なので、用途によってパラメータが変わると思いますが、とりあえずこんな感じ。


  • name:作成するILBの名前、FQDN

  • network_id:ILBを配置するネットワークのID

  • configs:複数指定可能


    • port:ポート番号

    • algorithm:ロードバランシングアルゴリズム。Round Robin/Least Connection/Source IP

    • healthcheck:ヘルスチェック


      • check_interval:間隔(秒)

      • timeout:タイムアウト(秒)

      • type:HTTP/TCP

      • unhealthy_threshold:失敗回数(Down)

      • healthy_threshold:成功回数(Up)

      • path:パス



    • frontend_protocol:フロントエンドプロトコル HTTP/HTTPS/TCP/SSL

    • backend_protocol:バックエンドプロトコル HTTP/HTTPS

    • connection_timeout:コネクションタイムアウト

    • servers:ILBに追加するサーバの情報。複数指定可能


      • ipaddress:仮想マシンのIPアドレス

      • port:ポート番号






delete_loadbalancer:ILBを削除する

ついでに、作ったILBを削除します。パラメータは以下です。


  • 削除したいILBのID

$ idcfcloud ilb delete_loadbalancer "bf82c638-adf7-4ae4-b461-b1bc5ab23a7c"

{
"status": 200,
"message": "",
"data": null
}


ILBへサーバ追加/削除するシェルスクリプト

JQコマンドを使うと、JSONデータから欲しい値だけを抽出することができます。

ILBの情報から必要なIDを抽出して、その値をパラメータに次のコマンドを実行すれば、

ILBへサーバ追加/削除するシェルスクリプトになります。


サーバ追加

$ vim add_server_test.sh

#!/bin/sh

ILB_ID=`idcfcloud ilb list_loadbalancers | jq -r '.data[] | select(.network_name == "lux-network1") | .id'`
CONFIG_ID=`idcfcloud ilb list_loadbalancers | jq -r '.data[] | .configs[] | select(.port == 80) | .id'`

idcfcloud ilb add_server $ILB_ID $CONFIG_ID '{"ipaddress":"10.32.0.15", "port":80}'

$ chmod 755 add_server_test.sh
$ ./add_server_test.sh

場合によってselectの条件を変更してください。

-rは返り値からダブルクォートを外すオプションです。付けないとうまく動かないので注意です。


サーバ削除

$ vim del_server_test.sh

#!/bin/sh

ILB_ID=`idcfcloud ilb list_loadbalancers | jq -r '.data[] | select(.network_name == "lux-network1") | .id'`
CONFIG_ID=`idcfcloud ilb list_loadbalancers | jq -r '.data[] | .configs[] | select(.port == 80) | .id'`
SERVER_ID=`idcfcloud ilb list_loadbalancers | jq -r '.data[] | .configs[] | select(.port == 80) | .servers[] |select(.ipaddress == "10.32.0.15") | .id'`

idcfcloud ilb delete_server $ILB_ID $CONFIG_ID $SERVER_ID

$ chmod 755 del_server_test.sh
$ ./del_server_test.sh

.servers[] |select(.ipaddress == "10.32.0.15") | .id

の部分で IPアドレス をキーに削除対象のサーバIDを取得していますが、

例えば、

.servers[0] | .id'

とすると1つ目のサーバのIDを取得できます。