IBM Cloud Load BalancerにIBM Cloud CLIでメンバーを追加する


目的

IBM Cloud Load Balancer(以下、ICLB)はIBM CloudのLBaaSです。ICLBは基本的な設定はポータルのWeb UIで可能ですが、Web UIで設定できないものもあります。例えば、ICLBのメンバーはWeb UIでは仮想サーバのプライマリIPしか選択できません。ポータブルIPを指定したい場合はAPIを利用する必要があります。

APIを利用するには、APIドキュメントを読んで頑張ってcurlする、ライブラリを使ってPythonなどで書く、slcliを利用する方法などがありますが、IBM Cloud、特に旧SoftLayer時代のドキュメントは非常にわかりづらいです。Pythonを使ったサンプルは多く公開されていますが、Pythonを動かす環境が必要になります。

そこで、今回はIBM Cloudユーザーなら必ずインストールしているIBM Cloud CLIを使ってメンバーの追加をしてみます。

手順

ICLBのオーダー

APIでも可能ですが今回は割愛し、すでにポータルからオーダーされているものとします。

メンバー(サーバーインスタンス)は空にしておきます。

インスタンスのUUID確認

インスタンスのUUIDを確認します。IBM Cloud CLIを利用します。

$ ibmcloud sl call-api Network_LBaaS_LoadBalancer getAllObjects

[
        {
                "accountId": ******,
                "address": "lb-tok04-******-tok04.clb.appdomain.cloud",
                "createDate": "2020-06-08T10:48:23+09:00",
                "id": ******,
                "isDataLogEnabled": 1,
                "isPublic": 0,
                "locationId": 2344395,
                "modifyDate": "2020-06-21T10:56:37+09:00",
                "name": "lb-tok04",
                "operatingStatus": "ONLINE",
                "provisioningStatus": "ACTIVE",
                "type": 0,
                "useSystemPublicIpPool": 1,
                "uuid": "*******-****-****-****-************",
                "datacenter": {
                        "id": 2344395,
                        "longName": "Tokyo 4",
                        "name": "tok04",
                        "statusId": 2
                }
        }
]

このときのuuidを控えておきます。

メンバー定義JSONの作成

以下のフォーマットでJSONファイルを用意します。配列の1番目に先ほど控えたUUIDを指定します。2番目にメンバーをさらに配列で指定します。宛先がPublic IPの場合はpublicIpAddressにします。今回はprivateIpAddressとします。

members.json
[
  "${uuid}",
  [
    {
      "privateIpAddress": "${メンバー1のIP}"
    },
    {
      "privateIpAddress": "${メンバー2のIP}"
    }
  ]
]

メンバーの追加

次のようにCLIを実行します。

$ ibmcloud sl call-api Network_LBaaS_Member addLoadBalancerMembers --parameters "$(cat members.json)"

{
        "accountId": ******,
        "address": "lb-tok04-******-tok04.clb.appdomain.cloud",
        "createDate": "2020-06-08T10:48:23+09:00",
        "id": ******,
        "isDataLogEnabled": 1,
        "isPublic": 0,
        "locationId": 2344395,
        "modifyDate": "2020-06-21T11:08:35+09:00",
        "name": "lb-tok04",
        "operatingStatus": "ONLINE",
        "provisioningStatus": "UPDATE_PENDING",
        "type": 0,
        "useSystemPublicIpPool": 1,
        "uuid": "*******-****-****-****-************"
}

エラーとならなければOKです。

確認

ポータルから確認します。

ちなみに宛先にポータブルIPを指定した場合はServer Nameとタイプは不明となり気持ち悪いですが、気にしないでよいです。

CLIから確認します。先ほどはUUIDを使いましたがこの場合はIDを使います。

$ ibmcloud sl call-api Network_LBaaS_LoadBalancer getAllObjects --mask id
[
        {
                "id": ******
        }
]
$ ibmcloud sl call-api Network_LBaaS_LoadBalancer getMembers --init ${id}
[
        {
                "address": "*.*.*.*",
                "createDate": "2020-06-21T11:08:35+09:00",
                "id": *******,
                "modifyDate": "2020-06-21T11:08:42+09:00",
                "provisioningStatus": "ACTIVE",
                "uuid": "********-****-****-****-************",
                "weight": null
        },
        {
                "address": "*.*.*.*",
                "createDate": "2020-06-21T11:08:35+09:00",
                "id": *******,
                "modifyDate": "2020-06-21T11:08:42+09:00",
                "provisioningStatus": "ACTIVE",
                "uuid": "********-****-****-****-************",
                "weight": null
        }
]

"weight": null"weight": 50と同じ意味になります。明示したい場合は先ほどのJSONで指定することも可能です。

以上です。

参考