ECSにおけるALBの各設定項目を理解し、構築する

# 本記事のミッション
- ALBの基本的な設定項目と各設定項目がALBの処理プロセスにどのように作用しているか理解した上で、ALBの構築を行う。
# 背景
ECS、生成AIの入門に[こちら](https://qiita.com/minorun365/items/84bef6f06e450a310a6a "Qiita Home")の構築手順を試していたところ、
深堀したい設定や、追加したい機能がいろいろと出てきたので、
今回は第一弾としてALBについて調査し、まとめてみました。
特に、ALBの各設定項目が処理にどのような影響を与えるのか気になったため、今回はその点を重点的に調べて、備忘用にまとめてみました。
# 本記事で書いていること
- 本記事におけるインフラ構成
- ALBについて
- ALBの設定項目と処理プロセス
- ALBの構築手順
- 今後の展望
# 本記事の構成
構築の際に参考にした[こちら](https://qiita.com/minorun365/items/84bef6f06e450a310a6a "Qiita Home")の記事では、ECSのタスク数を1として構築していましたが、本記事では、タスク数を２とし、２つのコンテナに負荷分散できる構成にしています。
# ALBについて
超基本の機能なので、詳細は割愛しますが、ALB（Application Load Balancer)は受信したトラフィックを、複数のターゲットに負荷分散させるサービスです。今回は、負荷分散とヘルスチェックに関する設定項目と処理プロセスをまとめました。
# ALBの各設定項目と処理プロセスについて
ALBの機能である、**負荷分散**、**ヘルスチェック機能**の目的と、設定項目、処理プロセスついて説明します。
### 負荷分散
**目的**
受信したトラフィックを負荷が一部のインスタンスに集中しないように複数のインスタンスに分散する。
**設定項目**
| 設定項目| 説明 |
| ---- | ---- |
| リスナー| 処理を行うリクエストのプロトコル、ポートを設定する。（HTTPまたはHTTPSを選択する。） |
| デフォルトアクション| リスナーで受信した際のデフォルトのルールを指定する。デフォルトではターゲットグループにルーティングを行う。 |
| リスナールール |デフォルトはターゲットグループへのルーティングを実施する。<br>デフォルトルール以外は、ALB作成後に詳細なルールを作成可能。（プロトコル、ポート以外の条件、後続のアクション、ルールの優先順位を決めるなどのルールが作成可能） |
| セキュリティグループ |ネットワークトラフィック（ プロトコル、IPアドレスレベル）のアクセス制御を行う |
| セキュリティポリシー | リスナーのプロトコルにHTTPSを設定した場合、設定が必要 <br>TLS接続で使用するプロトコルと暗号スイートの組み合わせを指定する。AWS側で定義されたセキュリティポリシーを指定することが推奨される。|
| ターゲットグループ | トラフィックを分散させるインスタンスのまとまり。ターゲットグループ内でルーティングを行う。 |

**負荷分散の処理プロセス**
１\. クライアントからリクエストが来ると、まず、**セキュリティグループ**の設定を元に、通過対象のトラフィックか否かを判断する。
２\. 通過したトラフィックに対して、**リスナー**として設定した**プロトコル**、**ポート**、**ルール**内の条件に合う、リクエストを受信する。
このとき、HTTPS通信であった場合、**セキュリティポリシー**の設定によって通信の安全性を確認する。
３\. リスナーは指定した**ルール**内のアクションを元に後続のアクションを実施する。デフォルトアクションの場合、受信したリクエストを設定した**ターゲットグループ**に振り分けを行う。

### ヘルスチェック
**目的**
ルーティング先のターゲットが正常な状態か監視を行う。（異常と判断した場合、判断されたインスタンスをターゲットから除外する。）

**ヘルスチェックの設定項目**
| 設定項目| 説明 |
| ---- | ---- |
| プロトコル| ヘルスチェック先のターゲットと通信するプロトコル（HTTPまたはHTTPSを選択） |
| パス | ターゲットのパスを選択（パスについて補足参照） |
| ポート | ターゲットのポートを選択|
| 間隔 | ヘルスチェックのリクエストをターゲットに送信する間隔（秒） |
| タイムアウト | ターゲットにヘルスチェックのリクエストを送信してから応答が来るまでの待ち時間（秒） |
| 正常のしきい値| ターゲットを正常とみなすまでの応答の連続成功回数 |
| 非正常のしきい値 | ターゲットを異常とみなすまでの応答の連続失敗回数 |
|成功コード | ターゲットからの正常なレスポンスを確認するために使用するコード。 |

:::note info
ヘルスチェックのパスについて
デフォルト設定では「/」が指定されており、アプリケーションのルートパスに対して応答のチェックを行っている。必要に応じて、/health、/statusなどを指定する。
/health：アプリケーションの状態を詳細に確認するためのエンドポイントを指定する。アプリケーションの状態（正常に動作しているか、依存関係が正常かなど）をjson形式で返す。
/status：アプリケーションの状態やバージョン情報を返すエンドポイントを指定する。バージョン情報や稼働状況など情報提供に重点を置く場合に使用する。
:::
**ヘルスチェックの処理プロセス**
1\. ロードバランサーが、指定された**プロトコル**と**ポート**を使って、**間隔**で設定した時間ごとにターゲットにリクエストを送信する。
2\. ターゲットからの応答（**成功コード**で設定したHTTPレスポンスコード)を待つ。**タイムアウト値**で設定した時間内に、応答が来た場合、成功と判断し、応答が来なかった場合、失敗と判断する。
3\. 応答の連続成功回数が、**正常のしきい値**を超えた時、正常と判断する。応答の連続失敗回数が**異常のしきい値**を超えた場合、異常と判断し、ターゲットから除外する。

# 構築手順
ECSのサービスを作成する時に、ECSの設定の中でロードバランサを作成することができます。ですが、今回は設定項目の理解を深めるために、構築したECSのサービスに対してターゲットグループの作成とロードバランサの作成を行いました。

## 1.ターゲットグループの作成
最初にロードバランサの振り分け先となるターゲットグループを作成します。ターゲットグループを設定することで、管理を容易にします。
ロードバランシングの「ターゲットグループの作成」を選択し、以下設定をしたのち、「次へ」をクリックする。
- グループの詳細設定
    - 基本的な設定
        - ターゲットタイプの選択：IP
        - ターゲットグループ名：任意のグループ名
        - プロトコル/ポート：HTTP/8501（コンテナのポートを指定）
        - IPアドレスタイプ：IPv4
        - VPC：ECSを含むVPC名
        - プロトコルバージョン：HTTP1
    - ヘルスチェック
        - ヘルスチェックプロトコル：HTTP
        - ヘルスチェックパス：/
        - その他詳細なヘルスチェックの設定は今回は行わない
        - 属性


次にターゲットグループに含めるためのターゲットを登録します。以下設定をして、「保留中のターゲットを登録する」をクリックします。
- IPアドレス
    - ステップ１：ネットワークを選択する。ターゲットに含める対象のVPCを選択する。
    - ステップ2：負荷分散するコンテナンのIPアドレスを選択して、ポートを定義する。「保留中として以下を含める」を選択する。
- ターゲット確認
    - ステップ２で設定したIPアドレスが含まれていることを確認する。

これで負荷をルーティングするターゲットグループの作成は完了です。

## 2.ALBの作成
「ロードバランサの作成」をクリックすると、どのロードバランサを作成するか選択肢が出てくるので「Application Load Balancer」を選択します。以下設定をし、「ロードバランサーの作成」をクリックする。

- 基本的な設定
    - ロードバランサ名：Test-Loadbalancer
    - スキーム：インターネット
    - ロードバランサのIPアドレスタイプ：IPv4
- ネットワークマッピング
    - VPC：ターゲットと同VPC
    - IP Pools：本記事では設定しない
    - Availability Zons and subnets：振り分けを行うAZを選択し、AZに対して、インターネットに接続しているパブリックサブネットを選択する。
:::note info
IPAMプールについて
IPAMプールを設定することで、IPアドレスの管理が可能。設定によってALBに特定のIPアドレス範囲からIPアドレスを割り当てることができる。
:::
- セキュリティグループ
    - 該当のセキュリティグループを設定：今回は元サイトで作成したALB用のセキュリティグループを使用（MYIPのHTTP通信のみを許可）
- リスナーとルーティング
    - プロトコル/ポート：HTTP/80
        - HTTPのリクエストに対して負荷分散を行う
    - デフォルトアクション：先ほど作成したターゲットグループを選択
- サービスの統合で最適化
    - 本記事では設定を行わない

以下のように、ロードバランサのリソースマップを確認すると、2つのタスクに負荷を振り分けるように、設定ができていることが確認できます。
![スクリーンショット 2025-03-17 171309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543693/b1fa395f-3078-4c9b-8b0d-5c66f3f0e0eb.png)

# 今後の展望
今回はALBの各設定項目と処理プロセスの関係についてまとめました。ただ実施どういう要件に対して各設定がなされているかは実務をこなさないとわからないなと思ったのでプロジェクトの資料を覗いてみようと思います。
今後は以下のような内容について調査・サービス追加して、記事にしていきたいです。
- ロードバランサについて
    - Cognitoによる認証
    - HTTPS通信によるリクエストの受信
    - デフォルト以外のルール、アクションの適用
- その他の機能について
    - Route53＋ACMによるDNS認証
    - Cognitoによるアクセス制御
    - AutoScalingの導入
    - 監視設定の追加
    - 機能追加など、、