SJ blog
backend
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

ECS Fargateネットワーキング — awsvpcモード、ENI、セキュリティグループ設計

ECS Fargateのawsvpcネットワークモード、タスクごとのENI割り当て、セキュリティグループ設計、VPCサブネット選択、Service Connectによるサービスディスカバリーを解説。

一言結論

Fargateはawsvpcモードのみサポートしタスクごとに独立したENIとセキュリティグループが割り当てられるため細かな通信制御が可能だが、プライベートサブネットに配置する場合はECR・CloudWatch等へのVPCエンドポイントまたはNATゲートウェイが必須となることを忘れがちだ。

ECS ネットワークモードの比較

モード対応説明
awsvpcEC2 / FargateタスクごとにENIを割り当て、独立したIPを持つ
bridgeEC2のみDockerのブリッジネットワーク、ポートマッピング必要
hostEC2のみホストのネットワークを直接使用
noneEC2のみネットワークなし

Fargateはawsvpcモードのみサポートする。

awsvpcモードの仕組み

awsvpcモードの特徴:
  → タスクごとに1つのENIが割り当てられる
  → ENIはVPCのサブネットに配置される
  → タスクはVPC内のプライベートIPアドレスを持つ
  → セキュリティグループをタスクレベルで設定できる

従来のbridgeモードとの違い:
  bridge: EC2インスタンスのENIを共有、ポート競合の問題
  awsvpc: タスクに独自ENI、EC2と同様のネットワーク設定が可能

タスク定義のネットワーク設定

{
  "family": "my-fargate-task",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512",
  "containerDefinitions": [
    {
      "name": "app",
      "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest",
      "portMappings": [
        {
          "containerPort": 8080,
          "protocol": "tcp"
        }
      ]
    }
  ]
}

サービス設定のネットワーク設定

# Fargateサービスのネットワーク設定
aws ecs create-service \
  --cluster my-cluster \
  --service-name my-service \
  --task-definition my-fargate-task:1 \
  --desired-count 2 \
  --launch-type FARGATE \
  --network-configuration '{
    "awsvpcConfiguration": {
      "subnets": ["subnet-private-aaa", "subnet-private-bbb"],
      "securityGroups": ["sg-fargate-tasks"],
      "assignPublicIp": "DISABLED"
    }
  }' \
  --load-balancers '[{
    "targetGroupArn": "arn:aws:elasticloadbalancing:...:targetgroup/my-tg/xxx",
    "containerName": "app",
    "containerPort": 8080
  }]'
assignPublicIp:
  ENABLED: タスクにパブリックIPを割り当て(インターネット経由でECRに接続等)
  DISABLED: パブリックIP なし(ECR接続にはVPCエンドポイントまたはNATが必要)

プライベートサブネット + assignPublicIp: DISABLED の場合:
  ECR/S3/CloudWatch等へのアクセスには以下が必要:
  - VPCエンドポイント(推奨)または
  - NATゲートウェイ

ENI Trunking(高密度タスク)

awsvpcモードではタスクごとにENIが1つ必要で、EC2起動タイプの場合はEC2のENI上限に注意が必要だ。

EC2インスタンスあたりのENI上限(例):
  t3.small: 3 ENI → タスク2つ(ホスト用1 ENI + タスク用2 ENI)
  m5.xlarge: 4 ENI → タスク3つ
  
ENI Trunkingを有効化(Nitroインスタンスのみ):
  → タスクあたりのENI消費を削減
  → 1 ENIに複数のタスクIPを割り当て可能
  → より多くのタスクを1インスタンスで実行可能

Fargateの場合: ENI制限はAWSが管理するため気にする必要なし

セキュリティグループ設計パターン

3層アーキテクチャのSG設計:

ALB SG:
  インバウンド: 443(0.0.0.0/0)
  アウトバウンド: 8080 → Fargate Task SG

Fargate Task SG:
  インバウンド: 8080 → ALB SGから
  アウトバウンド: 5432 → RDS SG、443 → VPCエンドポイント

RDS SG:
  インバウンド: 5432 → Fargate Task SGから
  アウトバウンド: なし
# セキュリティグループの作成例
aws ec2 create-security-group \
  --group-name fargate-task-sg \
  --description "Security group for Fargate tasks" \
  --vpc-id vpc-xxx

# ALBからのインバウンドのみ許可
aws ec2 authorize-security-group-ingress \
  --group-id sg-fargate-tasks \
  --protocol tcp \
  --port 8080 \
  --source-group sg-alb

Service Connect(サービスディスカバリー)

ECS Service Connectを使ってサービス間通信をシンプルに設定する。

# Service Connectを有効にしたサービス作成
aws ecs create-service \
  --cluster my-cluster \
  --service-name backend-service \
  --task-definition backend-task:1 \
  --desired-count 2 \
  --launch-type FARGATE \
  --network-configuration '{"awsvpcConfiguration": {"subnets": ["subnet-xxx"], "securityGroups": ["sg-xxx"]}}' \
  --service-connect-configuration '{
    "enabled": true,
    "namespace": "my-namespace",
    "services": [{
      "portName": "http",
      "clientAliases": [{
        "port": 8080,
        "dnsName": "backend"
      }]
    }]
  }'
Service Connectの利点:
  → サービス名でDNS解決(backend:8080 等)
  → 自動ロードバランシング
  → トラフィックメトリクスの自動収集
  → Cloud Mapとの統合

試験頻出ポイント

シナリオ回答
FargateタスクのネットワークモードAawsvpcのみ
プライベートサブネットFargateからECR接続VPCエンドポイントまたはNAT Gateway
タスクレベルのセキュリティグループawsvpcモードで可能
多数タスクでEC2のENI枯渇ENI Trunking(Nitroインスタンス)を有効化
サービス間の名前解決Service Connect または Cloud Map

まとめ

Fargateはawsvpcモードのみをサポートし、タスクごとに独立したENIとIPアドレスが割り当てられる。プライベートサブネットへの配置時はECR/CloudWatch等へのVPCエンドポイント設定が重要だ。