背景
AWSを基盤にECS on Fargateで稼働するWebアプリケーションを開発することになった。
アプリケーションには前段にALBを置いて、インターネット経由のHTTPSアクセスをALBで受け付けて、ALBからトラフィックがルーティングされるような構成をとることになった。
以上のようなシステムを構築する際に、「エンドユーザー(クライアント) - ALB - ECSタスク」のネットワーク疎通のためにどのリソースでどの設定項目でどのような設定が必要になるかが分かりづらかったので整理してみた。
なお、以下を前提とする。
- Public Subnetに紐づくルートテーブルにてInternet Gateway経由でインターネットと疎通する設定は済んでいる
- ネットワークACLはデフォルトのままとする
整理した内容
通信の経路
今回の構成の場合、エンドユーザー(クライアント)からECSタスクまでの通信の経路は以下の通りになる。
- エンドユーザー(クライアント) → ALB
- ALB → ECS on Fargateのホスト
- ECS on Fargateのホスト → ECSタスク
ただし 3.
については、ECS on Fargateの場合はネットワークモードで「awsvpc」というネットワークモードのみが指定可能で、 「awsvpc」ではhostportとcontainerportが同一になるという仕様がある(ECSタスクのポートマッピングのcontainerportの設定で指定したのと同じポート番号がホスト側で予約されるという仕様)。
そのため、3.
に関しては 2.
と区別して意識する必要がない(ECS on EC2の場合は区別する必要あり)。
1.
と 2.
の各経路に関して、ALBやECSで通信に用いるプロトコルとポートを設定したうえで、ALBとECSのセキュリティグループで該当のプロトコルとポートによる疎通を許可してやれば問題なく疎通できる。
プロトコルとポートの設定箇所やセキュリティグループの設定については以下の通り。
プロトコルとポートの設定
-
1.
の経路については、ALBのリスナー にて、ALBがリクエストを受け付けるプロトコルとポートを設定する
-
2.
の経路については、(1)ALBがターゲットに対して トラフィックをルーティング する際のプロトコルとポートと、(2)ALBが ターゲットヘルスチェック を行うためのプロトコルとポートの2種類を設定する。それぞれの設定箇所は以下の通り。- (1)の設定箇所
- ALBのターゲットグループ でプロトコルとポートを指定
- ECSサービス定義 のproductionlistenerportにてポートを指定
- ECSタスク定義 のポートマッピングのcontainerportにてポートを指定 - (2)の設定箇所
- ALBのターゲットグループのヘルスチェックの設定項目にてプロトコルとポートを指定((1)のルーティング用のプロトコルとポートと同じでもよい)
- (1)の設定箇所
セキュリティグループの設定
ALBとECSサービスに対してアタッチすることになる。
ALBのセキュリティグループではインバウンドルールで 1.
、アウトバウンドルールで2.
のトラフィックの疎通の許可が必要。
ECSサービスのセキュリティグループではインバウンドルールで2.
のトラフィックの疎通の許可が必要。