はじめに

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のバージョンを切り替えて使用します。

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

$ sudo update-alternatives --display ruby

rubyインストール

$ sudo yum install -y ruby23 ruby23-devel

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

$ sudo update-alternatives --set ruby /usr/bin/ruby2.3

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

$ sudo alternatives --config ruby

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

$ sudo 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パッケージのインストールからアップデートまでを行う事ができます。

$ sudo 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キーによる入力補完を行うための設定です。便利機能ですね。

~/.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の配下に設置します。

この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へサーバ追加/削除するシェルスクリプトになります。

サーバ追加

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

サーバ削除

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を取得できます。