Application Load Balancer入門：AWS ALBで複数EC2インスタンスを負荷分散する手順

## はじめに
この記事では、AWSのEC2インスタンスを起動し、Application Load Balancer (ALB)を設定する手順について説明します。

ALBを使用することで、複数のEC2インスタンスにトラフィックを分散させ、可用性を高めることができます。

また、ヘルスチェック機能を利用することで、インスタンスの稼働状況を監視し、異常時には自動的にトラフィックを切り替えることが可能です。

この記事を通じて、基礎的な知識を整理し、忘れがちな自分への備忘録として記録を残していきます。

## 知識整理
今回のアーキテクチャを実装する上で、以下の知識が必要です。

:::note
**EC2 (Elastic Compute Cloud):** 
AWSが提供する仮想サーバー。必要に応じてスケールアウト/スケールインが可能。

**ALB (Application Load Balancer):** 
トラフィックを複数のEC2インスタンスに分散するためのサービス。HTTP/HTTPSプロトコルに基づくリクエストのルーティングを行う。

**ヘルスチェック:** ALBがターゲットとなるEC2インスタンスの稼働状況を定期的に確認する機能。正常なインスタンスにのみトラフィックを送ることができる。
:::

## EC2インスタンスの起動とALBの設定手順
### EC2インスタンスの起動
EC2サービスに移動し、インスタンスを起動します。

使用する**Amazon Machine Image (AMI)** は、お好みのLinux系AMI（例: Amazon Linux 2）を選択し、インスタンスタイプはt2.microなど、無料利用枠を考慮して選びます。

![スクリーンショット 2024-10-26 13.42.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ca09466a-8289-f767-0714-904503006ed9.png)

ネットワーク設定では、作成したVPCを選択し、サブネットにはパブリックサブネットを選びます。また、セキュリティグループは、事前に設定したものを選択してください。

また、セキュリティグループは、事前に設定したセキュリティグループを選択してください。

:::note warn
セキュリティグループのインバウンドルールで「HTTP(80):0.0.0.0/0」を許可する必要があります。
:::

この設定で、EC2インスタンスを2台起動します。

![スクリーンショット 2024-10-26 13.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/16b3c82b-8f72-e54c-0800-434da1e36bee.png)

### Apacheのインストール
各EC2インスタンスにSSHで接続し、以下のコマンドを実行してApacheをインストールします。

```bash
sudo yum update -y
sudo yum install httpd -y
sudo systemctl start httpd
sudo systemctl enable httpd
```

サーバーのパブリックIPアドレスにアクセスし、デフォルトのApacheテストページが表示されればインストールは正常に完了しています。

![スクリーンショット 2024-10-26 13.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/01d2baec-ccf7-512d-f803-001e133630c8.png)

### ヘルスチェック用のコンテンツ作成
ヘルスチェックのパスが「/」の場合、ロードバランサーはEC2インスタンス上のWebサーバーのルートディレクトリ（トップページ）を参照します。

:::note warn
デフォルトでは``/var/www/html``ディレクトリが空のため、ヘルスチェックが失敗してしまいます。
:::

このため、ALBがルートディレクトリ（/）にリクエストを送信した際にApacheが応答するよう、``index.html``ファイルを作成しておきます。

**テストサイトA用のインスタンスに配置**
```bash
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>テストサイトA</title>
</head>
<body>
休みの日も勉強頑張ってて偉い！（こちらはテストサイトA用のインスタンスになります。）
</body>
</html>
```

**テストサイトB用のインスタンスに配置**
```bash
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>テストサイトB</title>
</head>
<body>
休みの日も勉強頑張ってて偉い！（こちらはテストサイトB用のインスタンスになります。）
</body>
</html>
```

上記の内容で``index.html``ファイルを作成し、``/var/www/html``ディレクトリに保存後、以下のコマンドでApacheを再起動します。

```bash
sudo systemctl restart httpd
```

それぞれのEC2インスタンスのパブリックIPアドレスに「/」を付与してアクセスし、テストページが表示されることを確認します。

``http://テストサイトA用のインスタンスのグローバルIPアドレス/``

![スクリーンショット 2024-10-26 13.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9568b786-b431-23cb-365b-61101dd60d0e.png)

``http://テストサイトB用のインスタンスのグローバルIPアドレス/``

![スクリーンショット 2024-10-26 13.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a4dbdfab-bc96-558a-747f-82bd60dc58b7.png)

### ターゲットグループの設定
まず、ターゲットグループを作成し、任意の名前を設定します。プロトコルは「HTTP」、ポートは「80」を選択し、作成済みのVPCを選びます。

![スクリーンショット 2024-10-26 13.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/094b068b-955e-36cd-9ee5-ec31277862d5.png)

次に、作成したターゲットグループに先ほど起動した2台のEC2インスタンスを追加し、「次へ」で進んでいき、設定を完了させます。

![スクリーンショット 2024-10-26 14.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a940f713-7e26-25b2-5ae6-2a106adcf827.png)

### Application Load Balancer (ALB)の作成
EC2サービス画面に戻り、左メニューから「Load Balancers」を選択します。「Create Load Balancer」をクリックし、「Application Load Balancer」を選択します。

![スクリーンショット 2024-10-26 14.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a1ad1fe4-ffca-8b21-5c33-7c8113827ec0.png)

基本設定では、ALBの名前を入力し、スキームは「インターネット向け」、リスナーは「HTTP (ポート80)」を選びます。

![スクリーンショット 2024-10-26 14.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5193f962-7fa1-01b6-1dea-659e2425e6e2.png)

また、ネットワークマッピングの設定では、事前に作成しているVPCとアベイラビリティゾーンを、EC2インスタンスが配置されているpublicサブネットに対応させるように設定します。

![スクリーンショット 2024-10-26 14.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7162eb5d-3219-b2ed-1532-f73cb624dacc.png)

:::note warn
セキュリティグループは、インバウンドルールで「HTTP (80):0.0.0.0/0」を許可するものをアタッチしてください。
:::

最後に、あらかじめ作成したターゲットグループを選択します。

![スクリーンショット 2024-10-26 14.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/169343af-d9c5-d6c5-30b6-8348a4725ffa.png)

これで設定が完了すると、「ec2-test」というロードバランサーが作成され、ターゲットが登録されていることが確認できればOKです。

![スクリーンショット 2024-10-26 14.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/42df80ba-4cf2-9ad9-921b-046996631915.png)

## 動作確認
ALBの詳細画面からDNS名を取得し、ブラウザでアクセスして2台のApacheサーバーが正常に応答しているか確認します。

私の環境では以下がロードバランサーのDNS名なので、ブラウザで確認してみます。

``http://ec2-test-291646990.ap-northeast-1.elb.amazonaws.com/``

![スクリーンショット 2024-10-26 14.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/51785091-ebea-893a-69dc-fb8266c13ea5.png)


何度かアクセスして「``こちらはテストサイト⚪︎用のインスタンスになります。``」と表示される「``A``」「``B``」が切り替われば、動作確認は成功です。

![スクリーンショット 2024-10-26 14.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/817dacef-16bb-ef3f-b196-3c4fe40a7979.png)

### 追加：テストサイトA用のインスタンスを停止した際の確認

次に、「``ec2-test-A``」インスタンスのhttpdプロセスを停止します。

```bash
sudo systemctl stop httpd
```

``ps``コマンドで確認すると、Apacheのhttpdサービスが停止していることがわかります。

```bash
[ec2-user@ip-10-0-7-185 ~]$ ps -ef | grep httpd
ec2-user  3683  3642  0 05:30 pts/0    00:00:00 grep --color=auto httpd
[ec2-user@ip-10-0-7-185 ~]$ 
```

停止後、ヘルスチェックで「``ec2-test-A``」が「``Unhealthy``」と表示されていることが確認できます。

![スクリーンショット 2024-10-26 14.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d6f6d876-27ec-dc8e-060d-0e02483fd565.png)

この状態でロードバランサーのDNS名でアクセスすると、「``こちらはテストサイトB用のインスタンスになります。``」のみが表示されることが確認できました。

![スクリーンショット 2024-10-26 14.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2b8f11f5-b238-6fcc-049a-a47e8d1e8981.png)

ロードバランシングの裏側の仕組みを理解し、期待通りの動作が確認できると、さらに楽しさが増しますね！

## まとめ
本記事では、EC2インスタンスの起動からApplication Load Balancer (ALB)の設定、動作確認までの手順を説明しました。

ALBを利用することで、複数のEC2インスタンスへのトラフィック分散やヘルスチェック機能を活用でき、可用性の高いシステムを構築することができます。

今後は、この基本的な設定をもとに、さらなる機能追加やセキュリティ設定を検討してみてください。

## 参考文献

https://qiita.com/kobayashi-m42/items/9f6dd14ad1e4dc7cab4c

https://qiita.com/ksawada1979/items/375cc4f7a2c5b59a89f2