OCI ロード・バランサでWebサーバを負荷分散

本記事は、以下のOCIチュートリアルを参考に執筆しました。

https://oracle-japan.github.io/ocitutorials/intermediates/using-load-balancer/

しかし、上記チュートリアルの内容が古くなっているため、新たに本記事を執筆しました。

# 本記事のゴール
以下構成図を参考に、Webブラウザからロード・バランサのIPアドレスを入力を行い、​
事前に設定した2台のコンピュート(VM1・2)のWebページが交互に表示されることを確認します。
![スクリーンショット 2025-03-18 17.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/81e0e44c-4fcc-4ecd-89da-796cd53c60db.png)

# 本手順
本検証は以下の手順で実施を行います。
**1. コンピュート・インスタンス2台(VM1・2)を作成**
**2. 作成後、httpdを使用してVM1・2をWebサーバ化​**
**3. ロード・バランサ用のパブリックIPアドレスを予約​**
**4. ロード・バランサを作成、バックエンド・セットにVM1・2を登録**
**5. Webブラウザからロード・バランサのパブリックIPアドレスを入力、​
VM1・2で設定したWebページが交互に表示されるか確認**

# 事前準備
事前に以下リソースは作成済の状態となっております。
* VCN：VCN_10.0.0.0/16
    * パブリック・サブネット：Pubsub_10.0.0.0/24
    * プライベート・サブネット：Prisub_10.0.1.0/24
    * インターネット・ゲートウェイ：IGW（パブリック・サブネットにアタッチ）
    * NATゲートウェイ：NGW（プライベート・サブネットにアタッチ）
* ルート表​
    * パブリック・サブネット用：宛先CIDR：0.0.0.0/0,ターゲット：IGW​
    * プライベート・サブネット用：宛先CIDR：0.0.0.0/0,ターゲット：NGW​
* ファイアウォール（今回はNSGで制御。セキュリティ・リストは空で設定）
    * ロード・バランサ用​
        * イングレス・ルール：ソースCIDR：0.0.0.0/0, プロトコル：TCP/80(HTTP)​
        * エグレス・ルール：宛先CIDR：0.0.0.0/0, プロトコル：全てのプロトコル
    * VM1・2用​
        * イングレス・ルール：ソースCIDR：10.0.0.0/24（パブリック・サブネット）, プロトコル：TCP/80(HTTP)​
        * エグレス・ルール：宛先CIDR：0.0.0.0/0, プロトコル：全てのプロトコル

また、パブリック・サブネットに踏み台サーバ(Bastion)を作成、踏み台サーバ経由でワンライナーで接続します。

# 1. コンピュート・インスタンス2台(VM1・2)を作成
ここでは以下スペックを参考に、コンピュート・インスタンスを作成します。
※尚、時間の関係上VM1のみの作成とします。
* OS：Oracle Linux 9
* シェイプ：VM.Standard.E5.Flex
* OCPU：1OCPU
* メモリ：8GB
* ストレージ：50GB

最初にOCIコンソールの左上のナビゲーション・メニューから「**コンピュート**」→「**インスタンス**」をそれぞれ選択します。
![スクリーンショット 2025-03-19 10.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/01b7b287-a54c-4714-be09-aefd4cd81b68.png)

「**インスタンスの作成**」を選択します。
![スクリーンショット 2025-03-19 10.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/b88e09a0-991d-4e79-bc6d-ca547529a626.png)

以下項目をそれぞれ入力します。
* 名前：VM1
* フォルト・ドメイン：任意（ここではFD-1を使用）
![スクリーンショット 2025-03-19 11.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1fb0f90e-89bc-4c4e-b424-a0729f66f2cd.png)

「**イメージの変更**」を選択してイメージを変更します。
![スクリーンショット 2025-03-19 11.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/e8ed827d-336d-43ca-9517-34e94e9bc4f8.png)

イメージの選択画面が表示されるので、「**Oracle Linux 9**」にチェックを入れ、「**イメージの選択**」を選択します。
![スクリーンショット 2025-03-19 11.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/065d46cb-4038-44ff-8608-0eb97ac5d5f6.png)

イメージの選択後、「**Change Shape**」を選択してシェイプを変更します。
![スクリーンショット 2025-03-19 11.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/cce2ed38-9b61-4806-94d9-99c0d768ea82.png)

シェイプをそれぞれ適切な値に変更、「**シェイプの選択**」を選択します。
![スクリーンショット 2025-03-19 11.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/8af2beef-19de-4410-ad00-f26723e0eed4.png)

以下項目をそれぞれ入力、「**拡張オプションの表示**」を選択します。
* VCN：VCN_10.0.0.0/16
* サブネット：Prisub_10.0.1.0/24
* プライベートIPv4アドレス：10.0.1.2
![スクリーンショット 2025-03-19 11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/b34cb370-5021-4d5f-83af-2424709c0b3a.jpeg)

「**ネットワーク・セキュリティ・グループを使用してトラフィックを制御**」にチェックを入れ、「**NSG-VM**」を選択します。
![スクリーンショット 2025-03-19 11.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/40f86e3d-1ac3-4a8c-8bc8-bc950b14defe.png)

「**SSHキーの追加**」でSSHキーを作成する場合は「**キー・ペアの自動で生成**」を、既存SSHキーを使用する場合は「**公開キー・ファイル(.pub)のアップロード**」をそれぞれ選択します。

「**カスタム・ブート・ボリューム・サイズを指定します**」にチェックを入れ、ストレージのサイズを調整します。
![スクリーンショット 2025-03-19 11.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/22e09d7d-0937-4b2a-a79a-5b0f86069e8c.png)

全ての項目の入力が終わった後、「**作成**」を選択します。
![スクリーンショット 2025-03-19 11.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/29afce40-be3b-4c4d-b7f3-65425d9c510b.png)

# 2. 作成後、httpdを使用してVM1・2をWebサーバ化​
コンピュート・インスタンスの作成後、httpdをインストールしてWebサーバ化を行います。

最初に以下コマンドで踏み台サーバを経由してワンライナーでVM1にSSH接続を行います。
```
ssh -i <コンピュートのsshキーのパス> -o ProxyCommand='ssh -i <踏み台サーバのsshキーのパス> -W %h:%p opc@<踏み台サーバのパブリックIPアドレス>' opc@<コンピュートのプライベートIPアドレス>
```

VM1にログイン後、以下コマンドでOS側のファイアウォール(`firewalld`)の無効化を行います。
```
sudo systemctl stop firewalld
```

必要に応じて、`firewalld`の自動起動の無効化も以下コマンドで実行します。
```
sudo systemctl disable firewalld
```

今回は`httpd`をインストールしてWebサーバ化を行います。
```
sudo dnf install -y httpd
```

実行ログの最後に以下の文が表示された場合、`httpd`のインストールは完了となります。
```
完了しました!
```

`httpd`の起動と、必要であれば自動起動の有効化も行います。
```
sudo systemctl start httpd
```
```
sudo systemctl enable httpd
```

以下コマンドで`httpd`が起動しているか確認を行います。
```
sudo systemctl status httpd
```
```shell:実行結果
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Wed 2025-03-19 12:41:41 JST; 45s ago
       Docs: man:httpd.service(8)
   Main PID: 101087 (httpd)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 177 (limit: 47290)
     Memory: 21.8M
        CPU: 60ms
     CGroup: /system.slice/httpd.service
             ├─101087 /usr/sbin/httpd -DFOREGROUND
             ├─101088 /usr/sbin/httpd -DFOREGROUND
             ├─101089 /usr/sbin/httpd -DFOREGROUND
             ├─101090 /usr/sbin/httpd -DFOREGROUND
             └─101091 /usr/sbin/httpd -DFOREGROUND

 3月 19 12:41:41 vm1 systemd[1]: Starting The Apache HTTP Server...
 3月 19 12:41:41 vm1 systemd[1]: Started The Apache HTTP Server.
 3月 19 12:41:41 vm1 httpd[101087]: Server configured, listening on: port 80
 ```

 `httpd`の場合、作成後に`/var/www/html`のディレクトリが自動作成されて、/html配下にWebコンテンツをアップロードしてWebサーバを作成する、といった流れとなります。
 ここではドキュメントルートを表す`index.html`に以下ファイルを格納して、擬似的なWebページを作成します。

最初に`/var/www/html`に移動します。
```
cd /var/www/html
```

移動後に以下コマンドで`index.html`を作成、その下にある簡易的なWebサイト用ソースコードをペーストします。
```shell
sudo vim index.html
```

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test Server</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
        }
        .container {
            text-align: center;
            background: white;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>This is a test server 1.</h1>
    </div>
</body>
</html>
```

保存後、Webサーバの作成は完了となります。

# ロード・バランサ用のパブリックIPアドレスを予約​
Webサーバを作成後、OCIコンソール画面に戻りロード・バランサ用のパブリックIPアドレスの予約を行います。

OCIコンソールの左上のナビゲーション・メニューから「**ネットワーキング**」→「**予約済パブリックIP**」をそれぞれ選択します。
![スクリーンショット 2025-03-19 13.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/f979cc55-a891-4c8e-9673-57786973c444.png)

「**パブリックIPアドレスの予約**」を選択します。
![スクリーンショット 2025-03-19 13.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/fa140e18-dbd6-4023-8935-97763e70bce4.png)

任意のIPアドレス名(ここでは「IP-FLB」）を入力、「**パブリックIPアドレスの予約**」を選択します。
![スクリーンショット 2025-03-19 13.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1748e305-1740-42c9-9f85-c97bcfe41634.png)

作成したパブリックIPアドレスが表示されます。
![スクリーンショット 2025-03-19 13.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/7c9db556-426b-4d71-b680-3c61ac93264d.png)

# 4. ロード・バランサを作成、バックエンド・セットにVM1・2を登録
パブリックIPアドレスを予約​後、ロード・バランサの作成を行います。
OCIコンソールの左上のナビゲーション・メニューから「**ネットワーキング**」→「**ロード・バランサ**」をそれぞれ選択します。
![スクリーンショット 2025-03-19 14.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/3ff389fc-fbb1-48be-a667-dfd14630ca3d.png)

「**ロード・バランサの作成**」を選択します。
![スクリーンショット 2025-03-19 14.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/f62d9e91-fb52-46a4-9109-558bdb9d7c16.png)

ロード・バランサの作成詳細画面が表示されるので、以下の項目を入力して「**次**」を選択します。
* ロード・バランサ名：FLB
* 可視性タイプ：パブリック
* パブリックIPアドレスの割当て：予約済IPアドレス
* 予約済IPアドレス：IP-FLB
* 帯域幅：任意（ここでは最小・最大いずれも10Mbps）
* 仮想クラウド・ネットワーク：VCN_10.0.0.0/16
* サブネット：Pubsub_10.0.0.0/24
* ネットワーク・セキュリティ・グループを使用してトラフィックを制御：有効
* ネットワーク・セキュリティ・グループ：NSG-FLB
※他はデフォルトの設定値で問題ございません。

![スクリーンショット 2025-03-19 14.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/ef0d128f-2057-46cd-8dcc-6caec42e1a5e.png)
![スクリーンショット 2025-03-19 14.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/39b32bfb-80c8-462c-ad1c-6c7ee22a5785.png)
![スクリーンショット 2025-03-19 14.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/6f25502a-d398-4983-a9d3-63a0b0dfc916.png)

続いてバックエンドの選択画面が表示されるので、以下の項目を入力、「**バックエンド・サーバーの選択**」を選択します。
* ロード・バランシング・ポリシー：重み付けラウンドロビン
![スクリーンショット 2025-03-19 15.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/44a34ef1-9884-430e-8285-7bc9034c8bec.png)

VM1とVM2をそれぞれ選択、「**インスタンスの追加**」を選択します。
![スクリーンショット 2025-03-19 15.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/7cfea958-a8ea-426f-bcca-6ac647a06438.png)

ヘルス・チェック・ポリシーの指定画面が表示されますが、ここではデフォルトの設定で問題ございません。
![スクリーンショット 2025-03-19 15.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/7bb668c8-9b50-47e0-8a6f-f92760e5d87c.png)

その他設定画面が表示されるので、以下の項目を入力、「**次**」を選択します。
* バックエンド・セット名：任意（ここでは「BS-FLB」）
* セキュリティ・リスト：バックエンド・サーバーの追加後にセキュリティ・リスト・ルールを手動で構成します
※他はデフォルトの設定値で問題ございません。
![スクリーンショット 2025-03-19 15.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/2e148e67-19b8-48f9-842a-4c833c4e5c22.png)

リスナーの作成画面が表示されるので、以下の項目を入力、「**次**」を選択します。
* リスナー名：任意（ここでは「LSTN-FLB」）
![スクリーンショット 2025-03-19 15.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/70012f7b-a49a-4043-87cc-2d1a009ee2f2.png)

ロギングの管理画面が表示されますが、取得不要のため全て無効化を行い「**次**」を選択します。
![スクリーンショット 2025-03-19 15.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/dd8c63bb-0a95-44d9-ade3-84a7586cb355.png)

最後に全ての設定の確認画面が表示されるので、問題がない場合は「**送信**」を選択します。
![スクリーンショット 2025-03-19 15.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/1a83181a-54fb-4e97-8f41-3cf71854c477.png)

ステータスが「**作成中**」→「**アクティブ**」になったのち、ロード・バランサの作成は完了となります。
![スクリーンショット 2025-03-19 15.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/188ce955-fca9-4da8-810d-619c80473091.png)

左下のリソースから「**バックエンド・セット**」→「**BS-FLB**」をそれぞれ選択してバックエンド・セットの状態を確認します。
![スクリーンショット 2025-03-19 15.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/c97221a0-fc90-4801-8e5a-0b28e92ce89b.png)

バックエンド・セットとして設定した2台（VM1・VM2）はいずれもヘルスが「**OK**」の状態となり、正常にヘルス・チェックが実行されています。
尚、バックエンド・セットで1台でも「**クリティカル**」になった場合、全体のヘルスも「**クリティカル**」の状態になります。
![スクリーンショット 2025-03-19 15.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/4cc2ef0b-9771-4d39-9398-2439233cf7ad.png)

# 5.動作確認
全ての設定が完了したので、動作確認を行います。
ブラウザにロード・バランサのパブリックIPアドレスを入力、設定したWebサイトが表示されれば検証は完了となります。
![スクリーンショット 2025-03-19 15.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/72a4b193-7251-4fda-a7a2-05355820604f.png)

尚、「**保護されていない通信**」と警告文が表示されていますが、HTTPでの通信を行っていることが原因です。
別途HTTPS通信も有効化することで上記警告文は表示されずに、Webサイトを表示できます。

また、更新を実施することでVM2に設定したWebサイトが表示され、ロード・バランシング・ポリシー（重み付けラウンド・ロビン）の設定が反映されていることがわかります。
![スクリーンショット 2025-03-19 15.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/9abbf30c-1557-4294-aa60-87142e99549c.png)

本検証については以上となります。

## ロード・バランサのプライベートIPアドレスを確認する方法
補足で、ロード・バランサのプライベートIPアドレスを確認する方法についても紹介します。
ロード・バランサのプライベートIPアドレスは設定不可で、自動で割り当てられます。

バックエンドの詳細画面から、バックエンドに指定されているリソースの赤枠アイコンを選択、表示されているIPアドレスがロード・バランサのものとなっております。
![スクリーンショット 2025-03-19 15.42.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/3b18acd1-4e67-44c0-a780-507a798ca774.png)

尚、IPアドレスが2つ表示されているのは、ロード・バランサが内部で冗長化されており、2つのロード・バランサからヘルス・チェックを実施しているためです。

以上