IBM CloudのALBのWeighted Round Robinを使って業務時間外のSorryサーバーへの割り振りを自動化する


# やりたいこと
IBM CloudのApplication Load Balancerのロードバランシングの方式のうち、Weighted Round Robin(重み付きラウンドロビン)を利用して、ロードバランシングの比重の変更をしてみます。重みづけを0にするとそのサーバーには接続が転送されなくなるので、これを利用して、業務時間外のサーバーへのアクセスをSorry Serverに振るようにすることなどが出来ます。

IBM Cloud Docsより
>重みづけしたラウンドロビン
>割り当てられた重みに比例して各インスタンスに要求を転送します。 例えば、インスタンスA、B、Cがあり、それぞれの重みが60、60、30に設定されている場合、インスタンスAとBは同数の接続を受け、インスタンスCは半分の接続を受ける。

# 想定される利用方法
業務時間9:00-17:00はサーバーA、業務時間外17:00-9:00はサーバーB(Sorry Server)に振り分けられるよう、時刻によって割り振りの比重を変える。

# 検証構成・用意するリソース

![スクリーンショット 2025-05-23 8.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/99ef9e79-ce73-4f0e-935e-c6cdb3478b34.png)
* Client PC
* Public ALB  
* VSI
    * 業務用サーバー ```gyomuyo-vsi```
    * Sorryサーバー　```sorry-vsi```


# 手順
1. ALBをオーダー
2. 業務サーバーを想定してwebページを作成
3. ALBのロードバランシング設定を変える

# 0. 準備
ALBからの割り当て先として2台のVSIをオーダーします。またVSIにSecurity groupを設定しておきます。こちらの詳細は省略します。

# 1. ALBをオーダー
IBM Cloud portalを開き、Infrastructure> Network> Load balancersからALBをオーダーします。
![スクリーンショット 2025-05-23 11.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/a88a75db-584d-4e3f-ad18-c388f87bdfef.png)
* Location: jp-tok
* Name: egawa-alb-kensyo
* subnet: tok-01,tok-02
* Type: Public
* DNS Type: Public
* Security group: Client PCを通すものに設定
Back-end pool等は3で設定するので一旦空欄で作成します。


# 2. 業務時間にアクセスされるサーバーを想定してwebページを作成
```gyomuyo-vsi```を業務用サーバーと想定してwebページを準備しておきます。
Apacheをインストール
```
dnf -y install httpd
```
Apacheを起動
```
service httpd start
```

起動時にApacheも自動起動するよう設定
```
systemctl enable httpd 
```
ステータスを確認
```
service httpd status
```

webページを作成
```
vi /var/www/html/index.html
```
表示するwebページをhtmlで記述
![スクリーンショット 2025-05-23 9.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/9f0d6939-0658-4039-9314-86865787434b.png)
```gyomuyo-vsi```のIPアドレスにアクセスしてみます。
![スクリーンショット 2025-05-23 9.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/b7a1f88c-f940-4345-9dbf-43c14ff66ad0.png)
同様に```sorry-vsi```も準備します。
![スクリーンショット 2025-05-23 9.47.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/2315ac2a-8a22-4af2-9907-58a539d35261.png)



# 3. ALBのロードバランシング設定を変える
## ALBのBack-end poolを作成
1でオーダーしたALBのBackend-poolを作成します。
![スクリーンショット_2025-05-23_9_59_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/0fce68dd-69f9-41cf-9066-6cb150ca9476.png)
Methodは"Weighted round robin"を選択します。
その他の項目はデフォルトのままで大丈夫です。
![スクリーンショット_2025-05-23_10_02_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/6b0be307-8e37-4ba9-8d83-39a99eb1eb50.png)
続いて、Backend-poolに含めるメンバーを追加します。
![スクリーンショット_2025-05-23_10_07_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/54b7178c-fb07-4ac0-ba50-ea8746fceb06.png)
もう一度Attachをクリック
![スクリーンショット_2025-05-23_10_10_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/eacea10c-9719-4864-b967-ea14a94aacc9.png)
Backend-poolに追加するVSIを選択します。
![スクリーンショット_2025-05-23_10_12_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/af93f1e7-3f03-4898-a3bd-0262dbb94c0f.png)
"Weight"の値で、ALBからバックエンドプールの各メンバー(サーバー)へのロードバランシングの比重を設定します。重みづけは、0 から 100 までの範囲の任意の値を用いることができます。画像の通り、各サーバーの重みはデフォルトで50になっています。たとえばこれを0にするとそのサーバーには接続が転送されなくなります。

## ALBのfront-end listenerを設定
ALB画面の"front-end listeners"を選択し作成をクリックします。
Back-end poolは作成したものを選択します。listner portを80に設定し、その他の項目はデフォルトのままにします。
![スクリーンショット_2025-05-23_11_24_20-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/91ae01d6-8456-42c8-bf0e-cebb3f1bde34.png)

Back-end poolとfront-end listenerが登録できたので、Client PCからALBのホストネームにアクセスしてみます。
![スクリーンショット 2025-05-23 10.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/77b262bd-3657-4ec5-adaf-aeacedc50621.png)
業務用サーバーに接続されました。何度かリロードしてみると50:50の割合で2つのサーバーにアクセスしていることがわかります。


## 重みづけを変えてみる
続いて、重みをUIで変えてみます。
業務用サーバーを0、Sorryサーバーを1にしてみます。
![スクリーンショット_2025-05-23_10_39_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/3f475f6b-ac74-4bc2-83e5-b16ee51ca789.png)
Sorryサーバーにのみ振られるようになりました。
![スクリーンショット 2025-05-23 10.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/5d532e64-e586-465c-9745-35a0d354d35d.png)

重みは以下のコマンドでも変更可能です。

```ruby:(例)メンバーAの重みを1、メンバーBの重みを0に設定
ibmcloud is load-balancer-pool-member-update [backend pool ID] [memberA ID] --weight 1
ibmcloud is load-balancer-pool-member-update [backend pool ID] [memberB ID] --weight 0
```
参照:https://cloud.ibm.com/docs/cli?topic=cli-vpc-reference&locale=ja#load-balancer-pool-member-update

backend pool IDやmember IDは以下のコマンドで取得可能です
```
ibmcloud is load-balancer-pool [loadbalancer ID/name] [backendpool ID/name]
```
参照:https://cloud.ibm.com/docs/cli?topic=cli-vpc-reference&locale=ja#load-balancer-pool-view

APIも提供されているので、APIを呼び出すスクリプトを作成することで時刻に応じたアクセスの振り分けをするよう自動化するという使い方ができます。