kariaの日記 @ Alice::Diary

ノリツッコミの鳩子がはてなブログ書いちゃうよ

Amazon ECSにおけるnetworkMode,パブリックIPアドレス,VPC外部との通信可否を整理する

Amazon ECSにおいて、EC2とFargateそれぞれの場合にどういうネットワーク設定にできるのかすぐ忘れるので、早見表にした。

機能名 EC2 Fargate
networkMode: awsvpc 対応 対応
networkMode: bridge 対応 非対応
networkMode: host 対応 非対応
networkMode: none 対応 非対応
awsvpcにおけるパブリックIPアドレス つけられない つけられる

※表を簡素化するためOSがWindowsの場合は除外しLinuxに限定した。

networkModeをbridgeとかhostにしたタスク定義は、Fargateにそのまま持って行っても起動することができない。

注目ポイントとしては、ECS on EC2かつawsvpcを採用した場合にタスクにはパブリックIPアドレスを付与することができない。このため、タスクがLBを介さずにVPC外部(インターネット)と通信したい場合、プライベートサブネットにタスクを配置することとNAT Gatewayを設置することが必須要件となる。

このことはAmazon ECS開発者ガイドにも記載がある。

Amazon EC2 Linux インスタンスで awsvpc ネットワークモードを使用するタスクをホストする場合、タスク ENI にはパブリック IP アドレスが付与されません。インターネットにアクセスするには、NAT ゲートウェイを使用するよう設定されたプライベートサブネットでタスクを起動する必要があります。詳細については、「Amazon VPC ユーザーガイド」の「NAT ゲートウェイ」を参照してください。インバウンドのネットワークアクセスは、プライベート IP アドレスを使用する VPC 内からのものか、その VPC からロードバランサーを経由させルーティングされたものである必要があります。パブリックサブネット内で起動されたタスクは、インターネットにアクセスできません。

docs.aws.amazon.com

つまり、ECSタスクがLBを介さずにVPC外部と通信できるのかできないのかに着目して表にすると以下の様になる。

networkMode VPCサブネットの種別 EC2のタスク Fargateのタスク
awsvpc パブリック 外部通信できない 外部通信できる
awsvpc プライベート 外部通信できる 外部通信できる
bridge,host パブリック 外部通信できる (起動できない)
bridge,host プライベート 外部通信できる (起動できない)

パブリックサブネットにタスクを配置する場合、EC2とFargateでnetworkModeを別にしなければならない。あまりないかもしれないが、もしパブリックサブネットでEC2/Fargateが混在する環境ではタスク定義を別々にしなければならず不便を強いられる。パブリックIPアドレスは課金されるようになったことも考慮すると、基本的にはプライベートサブネットを利用するべきだろう。