初投稿です。
ECS + EC2 で動いているサービスをECS + Fargate に変える際に
ネットワークモードとFargateについて覚えることがあり、備忘録も兼ねて書き残します。
この記事で書く事
- ネットワークモードはどこで設定するか?
- ネットワークモードの種類とそれぞれの説明
- Fargateとは?awsvpcしか選べない理由
この記事で書かない事
- ECS/ECR/Docker周りの詳しい記述
- タスク定義を完了させるまでの全フロー
ネットワークモードはどこで設定するか?
2019/3/29現在、ECSで新規タスク定義を作ろうとすると、
コンテナの起動させる場所としてFargateかEC2にするかを選ぶ画面が出現します。
「EC2」 を選択して次に進むと、ネットワークモードを選択するセレクターが出てきます。
< default > は bridge と同じですので、実質4つの選択肢となります。
ネットワークモードの種類とそれぞれの説明
bridge(ブリッジ)
bridgeはDockerコンテナと外のネットワークを繋ぐ最もオーソドックスな手段です。
DockerコンテナがEC2インスタンスの中にある時、ネットワークはまずEC2インスタンスに接続し、
その後、宛先のDockerコンテナのポートを探して接続します。
DockerコンテナがEC2インスタンスに1つだけなら、そう難しく考える必要はありませんが
複数のDockerコンテナがEC2インスタンスの中で動く場合、ポートの管理(ポートマッピング)が発生します。
例えば2つのWebサーバDockerコンテナを同じEC2インスタンス内で動かそうとすると、
両方をDockerコンテナに80番ポートと設定(エクスポート)したとしても、
EC2インスタンス側で片方を8080番ポートで繋ぐ等の工夫をしなければいけません。
host(ホスト)
hostはDockerで設定(エクスポート)したポート番号とEC2インスタンス側のポートを番号を同じにします。
ゆえに、2つのWebサーバDockerコンテナを同じEC2インスタンス内で動かそうとする場合、
両方に「同じポート」と設定することはできません。
つまり、両方を「80番ポート」にすることができないということです。
ですから片方のDockerコンテナを8080番等の別のポートにする変更が必要になります。
そして、外部ネットワークから接続する時も8080番ポートに接続することで
そのDockerコンテナにアクセスできるようになります。
bridgeに比べるとポート管理(ポートマッピング)が必要ありませんが、
コンテナを作る時からポートを考えなければいけないため、使い分けが必要と言えます。
awsvpc
awsvpcはDockerコンテナ自体にENIという、AWS内のネットワークインターフェイス(IPアドレスやMACアドレス)を与えます。
これにより、bridgeやhostで抱えていた「Dockerコンテナ間のポートの競合」問題が無くなります。
このネットワークモードはタスク定義をする際、
「起動タイプの互換性の選択」時に 「Fargate」 を選ぶと、
このネットワークモードが 自動的 に選択されます。これに関しては後に説明いたします。
なし
外部のネットワークと接続できなくなります。
Fargateとは?awsvpcしか選べない理由
Fargateは、これまでのDockerコンテナがEC2インスタンスの中で動いていたのに対し、
EC2インスタンスを省いて、Dockerコンテナだけ でサービスが動くようにしたものです。
したがって、これまでENIを保持していたEC2インスタンスが無くなった為、
Dockerコンテナ自身でENIを持たなくてはいけません。
これが理由によりFargateを選ぶとawsvpcのネットワークモードが自動的に選ばれる事になります。
まとめ
awsvpcはポート管理がいらない魅力的なネットワークモードです。
また、それを使用するFargateも魅力的なサービスです。
新規でECSでサービスを作ろうと考えている方がいらっしゃれば
こちらのネットワークモードやサービスの使用を検討される事をおすすめします。
参考:
Amazon EC2 Container Service(ECS)の概念整理
(この記事では「Task=Dockerコンテナ」と致しましたので、こちらをお読みになられる事をおすすめします)
https://qiita.com/NewGyu/items/9597ed2eda763bd504d7
Amazon ECS(EC2 Container Service)についての簡単なメモ
(上の記事より簡単に概念がわかります)
https://qiita.com/mokemokechicken/items/d45144dcd1979c10e336
Elastic Network Interface(ENI)
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_ElasticNetworkInterfaces.html
ECSでEC2インスタンスを利用する際のネットワークモードについて調べてみた
(こちらの記事の方がネットワークモードについて専門用語などが正しく使われています。一読される事をおすすめします)
https://dev.classmethod.jp/etc/ecs-networking-mode/