AWS ECSのネットワークモードの違いを調べてみた
AWS ECS network modeの違いを調べてみたのでメモです。
AWS ECSには下記3つのネットワークモードがあります。
Fargateの場合は、AWS-VPCネットワークモードしか選択できません。
なのでここではECS(on EC2)の場合の話です。
Host
Hostを図にすると下記のようなイメージです。
「EC2:コンテナ=1:N」の関係としてコンテナがデプロイされます。
1:Nの関係をポート番号で区分するため、異なるコンテナで同一ポート番号を利用できません。
また複数のコンテナが1つのネットワークインターフェースを共同利用するため、NW帯域も共同で分ける形となります。
上記から、下記のような要件とは相性が悪いです。
- 複数の同一ポートを利用したいコンテナが存在する
- コンテナ毎にアクセスポートを制限する
Bridge
Bridgeを図にすると下記のようなイメージです。
DockerはそもそもLinuxのcgroupの考え方が元となっていますが、
ネットワークの名前空間を分離するのが、このBridgeの考え方のようです。
ネットワークの名前空間を分離し、自作したネットワーク空間内であればIP直接でなく
自分で付与した名前で各コンテナにアクセスできます。
個人的には、ECSの場合はサービス機能があるため、
あまり込み入った作りでない限り、このモードは必要ないように感じます。
AWS-VPC
AWS-VPCを図にすると下記のようなイメージです。
こちらは説明のためにALBも関連した図としています。
AWS-VPCモードの場合、各コンテナはENIを持つことができます。
ENIにはセキュリティグループを持つことができます。
つまり、1コンテナ毎にセキュリティグループを割り当てることができます。
- コンテナ毎に解放ポートを調整できる
- ENIが分離するため各コンテナへの通信は干渉しない
デメリットとしては、1つのEC2あたりのENI数に制限があるため、
1つのEC2に多くのコンテナをデプロイできないことです。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
上記の比較から、制限に達しない限りはセキュリティ、NW速度の観点から
細かい制限事項がない限りはAWS-VPCモードを使うのがおすすめです。