AWSのロードバランサーを使用して、負荷分散を行う

実務で、サーバーの可用性と拡張性を考慮したインフラ構築を行ったので、その備忘録です。今回はAWSのALB(Application Load Balancer)を使用してサーバーの負荷分散を行っていきます。

# はじめに
▼環境・準備するもの
* AWSアカウント
* Windows PC
* Windows Powershell

# ロードバランサーとは？
小規模などのアプリケーション開発などでは、一つのアプリケーションに対して一つのサーバーを構築して運用を行っていくことが多いと思います。しかし、サーバーに何かしらの障害が発生したときにダウンタイムが発生し、サービスが停止してしまうことがあります。そこでロードバランサーを使用して負荷分散を行うことで、一つのサーバーに障害が起きたとしても、すべてのリクエストをもう一つのサーバーに振り分けることができるので、ダウンタイムが発生することなくサービスを運用することができます。また、リアルタイム性が求められるチャットシステムなどでは、高いトラフィックが多々発生します。そういった際に、リクエストをロードバランサーを通して各サーバーへ振り分けることで、一つのサーバーへリクエストが集中するといったことが妨げられるようになります。さらにサーバーの死活状態を監視し、いずれかのサーバーに障害が発生した場合には、そのサーバーへの振り分けを停止する機能もあります。

![スクリーンショット 2024-11-19 201649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/e6c5cd9f-3b0a-5049-8655-b1aef19f7810.png)

# 環境を準備する流れ

* ２つのEC2インスタンスを作成する
* EC２インスタンスのセキュリティグループを追加する
* Nginxをインストールし、セキュリティグループの設定

# ステップ1: EC2インスタンスを作成する

▼ステップ1
AWSコンソールにログインをし、EC2サービスを選択します
選択できたら、`インスタンスを起動`ボタンをクリックしてください<br><br>


▼ステップ2
インスタンスを作成していきます。それぞれ下記と同じように入力、選択してください。


* 名前：**loadbalancer1**
* アプリケーションおよび OS イメージ : **Amazon Linux**
* Amazonマシンイメージ : **Amazon Linux 2023 AMI**

![スクリーンショット 2024-12-03 195856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/8c5eea7d-eb33-b6b7-9d17-c30437c63690.png)

次にインスタンスタイプを選んでいきます。

* インスタンスタイプ : **t2.micro**
* キーペアログイン : **新しいキーペアの作成**<br><br>


![スクリーンショット 2024-12-03 200648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/d50fa1b4-a963-64c9-b7c1-1c27bea98d7e.png)

次に、キーペアを作成していきます。作成したキーペアは自動で`loadbalancer`という名前でダウンロードされます。
今後使うので、なくさないように気を付けましょう。
下記と同じように選択できたら、`キーペア作成`ボタンを押します

* キーペア : **loadbalancer**
* キーペアタイプ : **ED25519**
* ファイル形式　: **.pem**


![スクリーンショット 2024-12-03 201520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/4069a99c-d8b7-030d-09ab-c4ac107f5277.png)

次にネットワーク設定を行います。ネットワーク設定の編集ボタンを押してください。
最初にサブネットを割り当てます。
ap-northeast-1がプロダウンで表示されない場合は、違うものでも大丈夫です。

:::note info
サブネットはもう一つのインスタンスのサブネットと**同じにならないよう**に注意してください。
:::

* サブネット : **ap-northeast-1a**

![スクリーンショット 2024-12-03 202210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/b99ff705-6e62-790e-7252-a5e720a07374.png)


次に、セキュリティの設定を行います。セキュリティグループ名は、**loadbalancer-security**としてください。まず、インバウンドセキュリティの設定を行います。

セキュリティグループで、SSHポート（22）とHTTPポート（80）のインバウンドトラフィックを許可します。送信元IPは0.0.0.0/0（すべてのIPアドレス）に設定します。これにより、SSHでのサーバー接続とWebブラウザからのHTTPアクセスが可能になります。


![スクリーンショット 2024-12-03 203116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/0a01f53e-4c7d-e09c-37b2-9c637e49259e.png)

すべて設定が終わったら、右側にある`インスタンス起動`ボタンをクリックします

![スクリーンショット 2024-12-03 203208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/8ea9a296-779f-6d75-8a81-e3fda8c93517.png)

▼ステップ3
インスタンスが正常に起動しているか、以下の手順で確認します：

1. EC2ダッシュボードのインスタンス画面を開く
2. 作成したインスタンスの状態を確認する
   - インスタンスの状態が「実行中」になっている
   - ステータスチェックが「2/2 のチェックに合格しました」になっている

※起動完了まで数分かかる場合があります

![スクリーンショット 2024-12-03 203755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/51ebae75-7df9-ae55-1ddc-3b1cef5c688e.png)

以上でインスタンスを一つ作成することができました。
ロードバランサーを使用して負荷分散を行うのに、２つ以上インスタンスが必要なので、もう一つも同じ手順で作成してください。


:::note alert
サブネットは、1台目とは**異なるものを選択**してください。
（例：1台目がパブリックサブネット1aなら、2台目はパブリックサブネット1cを選択）
:::

# ステップ2: Nginxをインストールする

作成した２つのインスタンスにNginxをインストールしていきます。
以下の手順で両方のインスタンスにインストールを行ってください。<br>


### 1.ログイン
EC2インスタンスにログインする方法は[こちら](https://qiita.com/moeka-k0729/items/d2c323c90fcbd5e70515#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%89%8B%E9%A0%86)をご覧ください

### 2: Nginxをインストール
Nginxをインストールする方法は[こちら](https://qiita.com/moeka-k0729/items/12b4bc88de32697a8464#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971-nginx%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)をご覧ください

### 3: 動作確認
1. 各インスタンスのパブリックIPアドレスをブラウザに入力してアクセス
2. 以下のような Nginx のデフォルトページが表示されることを確認

![スクリーンショット 2024-12-03 205657.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/b9cce61a-384d-62e7-b38c-06419777b5d4.png)


# ステップ3: ロードバランサーの設定
ロードバランサーの設定を行っていきます。
以下の手順で進めていきます。

1.  ALB用のセキュリティグループの作成
    * ALBが使用する専用のセキュリティグループを設定
    * インターネットからのHTTPトラフィックを受け付けるよう設定 <br><br>

2. ターゲットグループの作成
    * 負荷分散の対象となるEC2インスタンスをグループ化
    * ヘルスチェックの条件も設定<br><br>
    
3. ロードバランサーの設定
    * 作成したセキュリティグループとターゲットグループを使用してALBを設定

#### ▼ステップ1:  ALB用のセキュリティグループの作成
EC2の左側の一覧から「セキュリティグループ」を選択し、「セキュリティグループを作成」ボタンをクリックします。

* セキュリティグループ名 : **loadbalancer-alb**
* 説明 : **Security group for ALB**

![スクリーンショット 2024-12-03 211129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/a0b2ea0d-e5d1-9ad3-de91-78548d955757.png)

次にインバンドルールの設定を行います。
HTTPポート（80）のインバウンドトラフィックを許可します。

![スクリーンショット 2024-12-03 211403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/60def6db-3b13-183b-9104-05dc674a36c6.png)

インバウンドグループの設定ができたら、一番下にスクロールをし、右下にある「セキュリティグループを作成」ボタンをクリックします。

これでALB用のセキュリティグループを作成することができました。

続いて、EC2用で作成したセキュリティグループのインバウンドグループを変更します。
現在の設定では、インバウンドルールの送信元が0.0.0.0/0（すべてのIPアドレス）となっているため、誰でも直接EC2インスタンスにアクセスできる状態です。負荷分散の構成では、
ALBを経由したアクセスのみを許可すれば十分なので、送信元をALBのセキュリティグループに変更します。<br><br>


まず、セキュリティグループ一覧から、先ほど作成した **loadbalancer-security**を選択し、「インバウンドルール」のタブを選択します。選択できたら、「インバウンドのルールを編集」ボタンをクリックします。

![スクリーンショット 2024-12-03 212333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/c5b6ab00-3d3f-cb90-81b9-9fd4c70cdbb2.png)

編集画面で、HTTPルールのソースを変更します：

1. 既存のHTTPルール（0.0.0.0/0）を一度削除します
2. 新しいHTTPルールを追加し、以下のように設定：
   - タイプ：HTTP
   - ポート：80
   - ソース：カスタムを選択し、「sg」と入力
   - 表示されたALB用のセキュリティグループを選択
3. 「ルールを保存」ボタンをクリックして完了

![スクリーンショット 2024-12-03 212935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/dd96854d-de4f-1e8c-2078-4bc6e8ffc8bc.png)

#### ▼ステップ2:  ターゲットグループの作成
EC2の左側の一覧から、ターゲットグループを選択し、右上の「ターゲットグループの作成」ボタンをクリックします。下記と同じように設定できたら、一番下までスクロールし、「次へ」ボタンをクリックします。<br><br>

* ターゲットタイプ : **インスタンス**
* ターゲットグループ名 : **loadbalancer-target**
* プロトコル : **HTTP**
* IPアドレスタイプ: **IPv4**<br><br>


![スクリーンショット 2024-12-03 213643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/066b17ec-72da-da9d-38bb-b81aa732f42b.png)

![スクリーンショット 2024-12-03 213813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/e28b1896-0b24-e05e-45d9-3ef00bb8d539.png)

次に、インスタンスを以下の手順で設定:
   - 先程作成した２つのインスタンスを選択
   - 「保留中として以下を含める」をクリック
   - ターゲットに追加されてることを確認
   - 「ターゲットグループの作成」ボタンをクリック

![スクリーンショット 2024-12-03 214430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/0f835646-1e97-58cf-fb01-1d16fba94d4b.png)

![スクリーンショット 2024-12-03 214555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/6f977803-884c-df47-08dd-3a095564fe90.png)

#### ▼ステップ3: ロードバランサーの設定
EC2の左側の一覧から、ロードバランサーを選択し、右上の「ロードバランサーの作成」ボタンをクリックします。
<br><br>

   - ロードバランサーのタイプ: **Application Load Balancer**
   - ロードバランサー名 : **test**
   - スキーム : **インターネット向け**
   - ロードバランサーの IP アドレスタイプ : **IPv4**
   - アベイラビリティーゾーン : **ap-northeast-1a, ap-northeast-1c**(インスタンス作成する際に選択したサブネット)
   - セキュリティグループ : **loadbalancer-alb**(ALB用で作成したセキュリティグループ)
   - デフォルトアクション : **loadbalancer-target**(作成したターゲットグループ)<br><br>

![スクリーンショット 2024-12-03 214909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/c03858f5-2db8-b509-b6bc-9e691e60b282.png)
![スクリーンショット 2024-12-03 214953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/9dfd2947-756a-cafd-263c-a01ddfca6a4b.png)
![スクリーンショット 2024-12-03 215122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/5802a62a-c6e1-eaee-274d-78522e02f2f5.png)
![スクリーンショット 2024-12-03 215300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/c5bd4a80-ff31-abdf-da68-edf2bebb0957.png)
![スクリーンショット 2024-12-03 215451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/0555cd2b-190d-93bf-a2dc-57c78e14995f.png)

上記のように設定ができたら、一番下までスクロールをし、「ロードバランサーの作成」ボタンをクリックします。

#### ▼ステップ3: 動作確認
ロードバランサー一覧に戻り、作成したロードバランサーを選択します。
ステータスを確認し、「アクティブ」になるまで待ちます。

![スクリーンショット 2024-12-03 220214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/6ac4422e-16ab-32c2-2097-b138b01abf45.png)

「アクティブ」になっていることを確認出来たら、以下の手順でアクセスを確認します：

1. ロードバランサーのDNS名をコピー
   - 説明タブに表示されている「DNS名」をコピー
2. Webブラウザを開き、コピーしたDNS名を貼り付けてアクセス
3. Nginxのデフォルトページが表示されることを確認

![スクリーンショット 2024-12-03 221017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/ab967c53-8a85-eecb-e82a-5cc7314cad58.png)

この画面が表示されれば、ロードバランサーが正常に動作し、EC2インスタンスにトラフィックが分散されていることを確認できます。

※DNS名の反映には数分かかる場合があります<br><br>

また、試しに一つのインスタンスが停止してもサイトにアクセスできることを確認しておきましょう。

1. ヘルスチェックで２つのインスタンスが「healthy]になっていることを確認
2. ひとつのEC2インスタンスを停止させる
3. 再度サイトにアクセスする
4. アクセスできることを確認

![スクリーンショット 2024-12-03 221346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/108f55be-6e07-d7a3-e9c8-e6fd852ab7a3.png)

![スクリーンショット 2024-12-03 221558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/0bf9e7d7-2838-8908-d141-306e1a2dc708.png)


# おわりに

今回はAWS Application Load Balancer (ALB) を使用した負荷分散の構築方法を紹介しました。

この構成のメリット：
- 複数のEC2インスタンス間でトラフィックを分散
- サーバーの冗長化によりサービスの可用性が向上
- 1台のサーバーがダウンしても、サービスを継続して提供可能

実際のプロダクション環境では、以下のような発展的な設定も検討することをお勧めします：
- Auto Scalingによる自動スケーリング
- SSL/TLS証明書の設定
- より詳細なヘルスチェックの設定

これからもAWSのさまざまな機能について学び、情報発信を続けていきたいと思います。
最後までご覧いただき、ありがとうございました！