みなさんこんにちは。マネージドサービス課の塩野です。
アプリケーションをコンテナ化して何か起こった際の影響範囲を限定させるためにAmazon Elastic Container Service(以下Amazon ECS)使いたいんだけど、「EC2とFargateどっち選べばいいの?」とか「ネットワークモードが色々あるけど、どれ選べばいいんだっけ?」こういう疑問、ありますよね。AWSのECSは自由度が高い分、最初の選択で迷うことが多いんです。今回は個人的にとっつきにくかった起動タイプとネットワークモードについて整理してみました。
目次
EC2とFargateの起動タイプの違い
まず大前提として、Amazon ECSには2つの起動タイプがあります。ざっくり言うと「自分でサーバー管理するか、しないか」の違いです。以下、起動タイプ別に比較してみました。
起動タイプ毎の比較表
| 項目 | EC2 | Fargate |
|---|---|---|
| 管理の手間 | サーバーのOS更新やパッチ適用が必要 | AWSが管理 |
| カスタマイズ | OSやカーネルを自由に触れる | OSには触れない |
| GPU | 使える | 使えない |
| Windows コンテナ | 使える | 使える |
| 適用場面 | 特殊な要件がある時 | 普通のアプリケーション |
※当比較表では、Amazon ECS Anywhere(オンプレミスのサーバーや仮想マシンなどの外部インスタンス)は省略
どっちを選んだらいいか?
正直なところ、特別な理由がなければFargateから始めるのが楽だと思います。 EC2タイプは自由度が高い反面メンテナンスに手間などもかかりますので、その条件じゃなきゃダメという事でない限りはFargateを使う事をオススメします。
| 利用シーン | おすすめ |
|---|---|
| とにかく早く始めたい | Fargate |
| サーバー管理したくない | Fargate |
| GPUを使いたい | EC2 |
| カーネルパラメータ触りたい | EC2 |
Amazon ECSのネットワークモードの違い
次にAmazon ECSのネットワークモードの違いについてですが、端的には「コンテナがVPC内でどう通信するか」を決める設定になります。それぞれのネットワークモードとその違いを見てみましょう。
ネットワークモード一覧
| モード | EC2(Linux) | EC2(Windows) | Fargate | 説明 |
|---|---|---|---|---|
| awsvpc | ○ | ○ | ○(必須) | タスクに専用のENIとIPアドレスを割り当て |
| bridge | ○ | × | × | ホストのポートとコンテナのポートをマッピング |
| host | ○ | × | × | ホストのネットワークを直接使用 |
| none | ○ | × | × | ネットワーク接続なし |
| default | × | ○ | × | WindowsのNATネットワーク(Windowsのデフォルト) |
ポイント
- Fargateを選んだ時点で、ネットワークモードは自動的に
awsvpcになります - EC2でWindowsコンテナを使う場合、
bridge、host、noneは使えません - EC2でLinuxコンテナを使う場合は色々な選択肢が選べます
各ネットワークモードの特徴
awsvpcモード
タスクごとに専用のENIがもらえます。つまり、コンテナがEC2インスタンスみたいに振る舞えるってことです。 そのためタスクに割り当てるIPアドレスの消費やホストインスタンスにマウントできるENI数に注意が必要になります。
| メリット | デメリット |
|---|---|
| ポート競合の心配なし | ENI数に上限がある(EC2の場合) |
| タスク単位でセキュリティグループ設定可能 | IPアドレスを消費する |
| VPC フローログで通信監視できる | - |
| 設定がシンプル | - |
awsvpcモードを使う場面
- セキュリティをしっかり管理したい
- タスクごとにアクセス制御したい
- 迷ったらとりあえずこれでOK
bridgeモード
Docker標準の仮想ブリッジネットワークを使います。1台のEC2に複数コンテナを効率よく詰め込めるのが特徴です。
| メリット | デメリット |
|---|---|
| 1台のEC2に大量のタスクを配置可能 | ポートマッピングが面倒 |
| IPアドレスを節約できる | 同じポートは使えない |
| ENI(Elastic Network Interface)数の制限を受けない | セキュリティグループはホスト単位 |
利用可能な環境
- EC2起動タイプ(Linuxコンテナのみ)
- Windowsコンテナでは使用できません(代わりに
awsvpcかdefaultモードを使用)
bridgeモードを使う場面
- コストを極限まで抑えたい
- 小さいコンテナをたくさん動かす
- IPアドレスやENI数の上限に引っかかる
hostモード
ホストのネットワークスタックをそのまま使います。 パフォーマンスは最高ですが、使いどころが限られます。
| メリット | デメリット |
|---|---|
| ネットワーク性能が最高 | ポート競合しやすい |
| ポートマッピング不要 | セキュリティリスク高め |
| 1ホストに同じタスク定義のタスクは1つだけ ※ |
※ポートが重複するようなタスクを同時に実行することはできません
hostモードを使う場面
- ネットワーク性能が超重要な場合
- かなり限定的な用途
noneモード:外部通信が不要な時
外部ネットワーク接続なしのモードです。 バッチ処理とか、ローカルで完結する処理向けですね。
結局どう選べばいい?ケース別早見表
Fargate vs EC2 どっち?
| 判断ポイント | 選ぶべきは |
|---|---|
| とりあえず始めたい | Fargate |
| 管理が面倒 | Fargate |
| GPUを使う | EC2 |
| OSをカスタマイズしたい | EC2 |
| 小〜中規模アプリ | Fargate |
| 大規模で最適化したい | EC2 |
EC2を選んだ場合のネットワークモードは?
Linuxコンテナの場合
| やりたいこと | おすすめモード |
|---|---|
| 普通のWebアプリ | awsvpc |
| セキュリティ重視 | awsvpc |
| コンテナ密度を上げたい | bridge |
| コストを極限まで抑える | bridge |
| 超高速通信が必要 | host |
| 外部通信不要なバッチ | none |
Windowsコンテナの場合
| やりたいこと | おすすめモード |
|---|---|
| 普通のWebアプリ | awsvpc |
| セキュリティ重視 | awsvpc |
| Windowsの標準設定で使う | default(NATモード) |
※Windowsコンテナではbridge、host、noneモードは使用できません。
まとめ
ざっくりとAmazon ECSの起動タイプとネットワークモードについてまとめてみました。 個人的にはコンテナといえばLinuxのイメージがありますが、Amazon ECSでWindowsコンテナに対応していたり、ネットワークモードの制約事項が思ったより多かったりと調べてみると学びが多かったです。
この記事がどなたかのお役に立てれば幸いです。
参考リンク
◆ 塩野 正人
◆ マネージドサービス部 所属
◆ X(Twitter):@shioccii
◆ 過去記事はこちら
前職ではオンプレミスで仮想化基盤の構築や運用に従事。現在は運用部隊でNew Relicを使ってサービス改善に奮闘中。New Relic User Group運営。