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でも可能ですが今回は割愛し、すでにポータルからオーダーされているものとします。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/f470b29b-e57e-f9c5-bf48-cd64795b010e.png)

## インスタンスの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です。

## 確認

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/262a79a7-546a-11e6-bac2-ec2ad6c388c9.png)

ちなみに宛先にポータブル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で指定することも可能です。

以上です。

# 参考

* [SoftLayer API Reference](https://sldn.softlayer.com/reference/softlayerapi/)
* [ICLB APIリファレンス](https://cloud.ibm.com/docs/loadbalancer-service?topic=loadbalancer-service-api-reference)