ogiogidayo
記事一覧へ戻る
AWSECSInfrastructureDocker

ECS on EC2 で Public IP が使えない?ネットワークモードを理解する!

2025-12-258 分で読めます

はじめに

サイバーエージェント 26 卒内定者 Advent Calendar の 25 日目(最終日)の記事です。 バックエンドエンジニアとして26卒で入社予定の 荻原 です。

本記事では ECS のネットワーク周りの構成をコストの観点から比較していきたいと思います。

調べようと思った経緯

AI を活用したアプリケーションを作成しており、ECS on Fargate でアプリケーションを動かす構成で運用していました。AI サービスの API を invoke するため、アウトバウンド通信で Public IP が必要となります。

開発環境であったこともあり NAT Gateway のコストを節約するために、ECS を Public Subnet に置いて、Fargate タスクに付与される Public IP(有効にする必要あり)を使用して通信を行っていました。

コスト最適化のために ECS on EC2 に移行しようとしたところ、Fargate 同様にサービス作成時(または RunTask 時)の networkConfigurationassignPublicIp を enable にするノリでは設定できないらしいので、EC2 で動かす際のネットワーク設定モードについて調べてみようと思ったのがきっかけです。

ちなみに ECS on EC2 では awsvpcbridgehostnone の4つのネットワークモードを選択できます。Fargate では awsvpc のみです。この記事では、コストを抑えながら外部通信を実現する方法を探っていきます。

なぜ NAT Gateway を避けたのか

Private Subnet に配置したリソースからインターネットにアクセスする場合、NAT Gateway を経由するのが一般的です。しかし開発環境では、Public Subnet + Public IP の構成を選びました。

NAT Gateway 経由の構成

NAT Gateway を使うと、タスクの送信元 IP は NAT Gateway に割り当てた Elastic IP になります。セキュリティ的にはタスクを Private Subnet に隠蔽できますが、NAT Gateway の料金が発生します。

Public IP 経由の構成

Public Subnet にタスクを配置し、Public IP を直接付与すると、Internet Gateway が 1:1 NAT(Public IPv4 ↔ Private IPv4 の変換)を提供してくれます。NAT Gateway を経由しないため、その分のコストがかかりません。

コスト比較 (東京リージョン、2025年12月時点)

項目 NAT Gateway 構成 Public IP 構成
NAT Gateway $0.062/h(約 $45/月) 不要
データ処理 $0.062/GB 不要
Public IPv4 $0.005/h(約 $3.65/月)※EIP分 $0.005/h(約 $3.65/月)
月額目安 $49+ $3.65

※ 2024年2月1日より、Public IPv4 アドレスには $0.005/IP/時 が課金されます。NAT Gateway に割り当てる EIP も課金対象です。

開発環境で月額 $49+ と $3.65 の差は大きいです。本番環境ではセキュリティ要件に応じて NAT Gateway を使うべきですが、開発環境なら Public IP で十分です。なお、本番環境では可用性のために AZ ごとに NAT Gateway を配置することが多く、その場合はさらにコストが増加します。

ECS のネットワークモードを詳しく見る

各モードの概要

モード 概要 タスクに Public IP 付与
awsvpc タスクごとに専用 ENI を割り当て ❌(EC2 の場合)
bridge Docker bridge 経由でホストと通信 ✅ ホストの IP を継承
host ホストのネットワーク名前空間を直接使用 ✅ ホストの IP を継承
none ネットワークなし

awsvpc モードでも NAT Gateway を使えば外部通信は可能ですが、タスクに直接 Public IP を付与することはできません。NAT Gateway のコストを避けたい場合は bridgehost を選ぶ必要があります。

awsvpc モードの罠

Fargate での挙動

Fargate では awsvpc モードでサービスを作成する際に networkConfigurationassignPublicIp = ENABLED を設定すると、タスクの ENI に Public IP が付与されます。ホスト EC2 という概念がなく、タスク ENI が直接ネットワークに接続されるためです。

EC2 での挙動

ECS on EC2 で awsvpc モードを使うと、タスクごとに専用の ENI が作成されて EC2 インスタンスにアタッチされます。ここで重要なのは、この ENI には Public IP を付与できず、Public Subnet に配置してもインターネットにアクセスできないという点です。

AWS の公式ドキュメントでも「Public Subnet に起動したタスクはインターネットにアクセスできない」と明記されています。

EC2 インスタンス自体は Public IP を持っていても、タスクとは別の ENI を使って通信するため、ホストの Public IP を使えません。結果として、awsvpc モードで外部通信するには NAT Gateway か VPC Endpoint が必要になります。

また、ECS が管理する Task ENI はユーザー側で変更できないため、Public IP や EIP を付与する運用は前提にできません(少なくともサポートされていません)。

bridge モード

bridge モードを使えば、タスクはホスト EC2 の Public IP を経由して外部通信できます。

bridge モードの仕組み

コンテナは Docker の bridge ネットワーク上で動作し、外向き通信は iptables で NAT されてホストの Public IP から出ていきます。インバウンド通信は動的ポートマッピングで処理されます。

bridge モードの設定

タスク定義では networkModebridge に設定し、hostPort を 0 にすることで動的ポートマッピングを有効にします。EC2 インスタンスは Public Subnet に配置し、Public IP を付与します。

セキュリティグループでは動的ポート範囲(32768-65535)へのインバウンドを許可する必要がありますが、許可する送信元は ALB のセキュリティグループに限定したほうがいいです。0.0.0.0/0 に開放すると、意図しないアクセスを許可してしまう危険があります。

ALB との連携

動的ポートマッピングを使う場合、ALB のターゲットグループで target_typeinstance に設定します。ECS サービスがタスクを起動すると、自動的にインスタンスと動的ポートの組み合わせがターゲットグループに登録されます。

host モード

host モードはさらにシンプルで、コンテナがホストのネットワーク名前空間を直接使用します。

ポートマッピングが不要でシンプルですが、同じポートを使うコンテナは1つしか動かせません。開発環境で1タスクしか動かさないなら十分な選択肢です。

各モードの比較

観点 awsvpc bridge host
タスクに Public IP 付与(EC2)
NAT Gateway なしで外部通信
タスク単位の SG
同一ポート複数タスク ✅(動的ポート)
ENI 制限 あり なし なし

コスト比較(東京リージョン、2025年12月時点)

t3.small 相当のタスクを24時間動かす場合の月額コストを試算してみました。

※ EC2 Spot および Fargate Spot の価格は需給や AZ によって変動します。最新価格は AWS Pricing Calculator で確認してください。

ECS on Spot EC2 + bridge モード

この構成が最もコストを抑えられます。

項目 価格
t3.small Spot 約 $0.008/h → 約 $5.84/月
Public IPv4 $0.005/h → 約 $3.65/月
合計 約 $9.49/月

ECS on Spot EC2 + awsvpc + NAT Gateway

awsvpc モードで外部通信するには NAT Gateway が必要です。

項目 価格
t3.small Spot 約 $5.84/月
NAT Gateway $0.062/h → 約 $45.26/月
NAT Gateway 用 EIP 約 $3.65/月
合計 約 $55+/月

bridge モードの約6倍のコストになります。

Fargate Spot + awsvpc

Fargate Spot なら awsvpc モードでも Public IP を付与できます。

Fargate では vCPU とメモリの組み合わせに制約があり、2 vCPU の場合は最小 4GB のメモリが必要です。t3.small(2 vCPU + 2GB)と同じ vCPU 数で比較するため、2 vCPU + 4GB で試算します。

項目 価格
Fargate Spot (2vCPU + 4GB) 約 $26/月
Public IPv4 約 $3.65/月
合計 約 $30/月

どれを選ぶべきか

コスト最優先なら ECS on Spot EC2 + bridge モード が最安です。ただし、EC2 の管理(パッチ適用、AMI 更新など)が必要になります。

運用の手間を減らしたいなら Fargate Spot も検討の価値があります。月額で数ドル程度の差なら、EC2 管理から解放されるメリットは大きいです。

タスク単位でセキュリティグループを設定したい、または awsvpc モードの機能が必要な場合は、NAT Gateway のコストを受け入れるか、Fargate に移行するかの判断になります。

自分の場合は Fargate Spot を選びました。主な理由は設定の変更差分が一番少なく、今後 EC2 Instance を運用していくコストの方が高いと感じたためです。また、Bridge モードだと、タスク単位で Security Group の設定ができないのも難点でした。

まとめ

ECS on EC2 で awsvpc モードを使うと、タスクに Public IP を付与できず、Public Subnet に配置してもインターネットにアクセスできません。Fargate と同じ感覚で assignPublicIp を設定しても動作しないので注意が必要です。

開発環境で NAT Gateway のコストを避けたい場合は、bridge または host モードを使ってホストの Public IP を経由させる必要があります。

参考リンク

  1. Amazon ECS task networking options for EC2 - ネットワークモードの公式ドキュメント
  2. Task networking with the awsvpc network mode - awsvpc モードの制限事項
  3. Amazon VPC Pricing - NAT Gateway, Public IPv4 の価格
  4. AWS Fargate Pricing - Fargate の価格
  5. Amazon EC2 Spot Instances Pricing - EC2 Spot の価格
X でシェア