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 EC2Linuxインスタンスで awsvpc ネットワークモードを使用するタスクをホストする場合、タスク ENI にはパブリック IP アドレスが付与されません。インターネットにアクセスするには、NAT ゲートウェイを使用するよう設定されたプライベートサブネットでタスクを起動する必要があります。詳細については、「AmazonVPCユーザーガイド」の「NAT ゲートウェイ」を参照してください。インバウンドのネットワークアクセスは、プライベート IP アドレスを使用する VPC内からのものか、その VPCからロードバランサーを経由させルーティングされたものである必要があります。パブリックサブネット内で起動されたタスクは、インターネットにアクセスできません。
つまり、ECSタスクがLBを介さずにVPC外部と通信できるのかできないのかに着目して表にすると以下の様になる。
networkMode | VPCサブネットの種別 | EC2のタスク | Fargateのタスク |
---|---|---|---|
awsvpc | パブリック | 外部通信できない | 外部通信できる |
awsvpc | プライベート | 外部通信できる | 外部通信できる |
bridge,host | パブリック | 外部通信できる | (起動できない) |
bridge,host | プライベート | 外部通信できる | (起動できない) |
パブリックサブネットにタスクを配置する場合、EC2とFargateでnetworkModeを別にしなければならない。あまりないかもしれないが、もしパブリックサブネットでEC2/Fargateが混在する環境ではタスク定義を別々にしなければならず不便を強いられる。パブリックIPアドレスは課金されるようになったことも考慮すると、基本的にはプライベートサブネットを利用するべきだろう。