私の戦闘力は53万です

awsとgcpについて書きます

AWS ECSのネットワークモードの違いを調べてみた

AWS ECS network modeの違いを調べてみたのでメモです。

AWS ECSには下記3つのネットワークモードがあります。
Fargateの場合は、AWS-VPCネットワークモードしか選択できません。
なのでここではECS(on EC2)の場合の話です。

  1. Host
  2. Bridge
  3. AWS-VPC

Host

Hostを図にすると下記のようなイメージです。

f:id:remmemento:20191030021001p:plain
Host

「EC2:コンテナ=1:N」の関係としてコンテナがデプロイされます。
1:Nの関係をポート番号で区分するため、異なるコンテナで同一ポート番号を利用できません。
また複数のコンテナが1つのネットワークインターフェースを共同利用するため、NW帯域も共同で分ける形となります。
上記から、下記のような要件とは相性が悪いです。

  • 複数の同一ポートを利用したいコンテナが存在する
  • コンテナ毎にアクセスポートを制限する

Bridge

Bridgeを図にすると下記のようなイメージです。

f:id:remmemento:20191030021422p:plain
Bridge

DockerはそもそもLinuxのcgroupの考え方が元となっていますが、
ネットワークの名前空間を分離するのが、このBridgeの考え方のようです。
ネットワークの名前空間を分離し、自作したネットワーク空間内であればIP直接でなく
自分で付与した名前で各コンテナにアクセスできます。
個人的には、ECSの場合はサービス機能があるため、
あまり込み入った作りでない限り、このモードは必要ないように感じます。

AWS-VPC

AWS-VPCを図にすると下記のようなイメージです。

f:id:remmemento:20191030022257p:plain
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モードを使うのがおすすめです。

参考サイト

woshidan.hatenablog.com

Docker:Host,Bridge
success.docker.com