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 ネットワークモードの比較
| モード | 対応 | 説明 |
|---|---|---|
| awsvpc | EC2 / Fargate | タスクごとにENIを割り当て、独立したIPを持つ |
| bridge | EC2のみ | Dockerのブリッジネットワーク、ポートマッピング必要 |
| host | EC2のみ | ホストのネットワークを直接使用 |
| none | EC2のみ | ネットワークなし |
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タスクのネットワークモードA | awsvpcのみ |
| プライベートサブネットFargateからECR接続 | VPCエンドポイントまたはNAT Gateway |
| タスクレベルのセキュリティグループ | awsvpcモードで可能 |
| 多数タスクでEC2のENI枯渇 | ENI Trunking(Nitroインスタンス)を有効化 |
| サービス間の名前解決 | Service Connect または Cloud Map |
まとめ
Fargateはawsvpcモードのみをサポートし、タスクごとに独立したENIとIPアドレスが割り当てられる。プライベートサブネットへの配置時はECR/CloudWatch等へのVPCエンドポイント設定が重要だ。