ECSのネットワークモードについて
ECS(on EC2)のネットワークモードはhost,bridge,awsvpcの3種類がある。
コンテナのネットワークモードをawsvpcにすることによってホスト跨ぎの通信ができ、またセキュリティグループの設定も可能なので推奨方法。
awsvpcモードを使おうとした
使おうとしたが、はまった
症状としては、
・EC2からタスク定義で指定したポートからアクセスできない
・EC2からdocker psで確認すると、PORTSにポート番号が入っていない
[ec2-user@ip-10-0-0-76 ~]$ docker ps
CONTAINER ID IMAGE
COMMAND CREATED STATUS
PORTS NAMES
63fde9618005 731221110857.dkr.ecr.ap-northeast-1.amazonaws.com/prod-ecr:1eeb0d9 "/bin/sh -c 'cd /usr…" 5 minutes ago Up 5 minutes
ecs-prod-a-task-9-prod-a-task-98e39bb29694b6e32400
7b7735d14db3 amazon/amazon-ecs-pause:0.1.0
"/pause" 6 minutes ago Up 6 minutes
ecs-prod-a-task-9-internalecspause-9a9da0c7ee828e8fe901
c3013cbeedce amazon/amazon-ecs-agent:latest
"/agent" 17 minutes ago Up 17 minutes (healthy)
解決方法
- タスク定義を作成する。ポートはコンテナのポートのみ指定(することしかできない)
- LBを作成し、ターゲットグループを空にしておく(作成したリスナー・ターゲットグループは使わないが、無いと先に進めないので作成する)
- 作成したリスナーとターゲットグループを削除する
- ECSにてサービスを作成し、その中でリスナーとターゲットグループを新規作成する。こうすることで2で作成したLBに新規にリスナーとターゲットグループが紐づき、ターゲットグループにコンテナ(のENI)が紐づけされる
ポート周りの設定について
LBに80で受けてコンテナの8000ポートに飛ばす場合
対象 | ポート | 設定タイミング |
---|---|---|
Dockerfile | 8000 | 環境変数等でセット |
タスク定義 | 8000 | タスク定義作成時 |
EC2のセキュリティグループ | 解放しない | - |
コンテナのセキュリティグループ | 8000 | サービス作成時など |
ALBのセキュリティグループ | 80 | ALB作成時など |
コンテナのターゲットグループの登録ポート | 8000 | サービス作成時※ |
ALBのリスナー | 80 | サービス作成時※ |
※リスナーとターゲットグループはALB作成時にも無いと先に進めないが、最終的にサービス内で作成したものを使う。
80番ポートをALBの受け側に使いたい場合、ALB作成時に作った80番ポートのリスナーをサービス作成前に削除する必要がある。
下記はサービス内でのLB関係ポートの設定部分
補足
awsvpcモードは推奨されている割にまとまった手順の情報が少なく、かなりはまったので。
なお、サービスが正常に起動してもPORTSにはポート情報は入らない。
これはawsvpcモードではコンテナはEC2とは独立したENIのポートを使っているため。
参考