はじめに
Amazon ECSでコンテナアプリケーションを本番運用する際、ネットワーク設計とロードバランサー連携は避けて通れない重要なテーマです。適切に設計されたネットワーク構成は、セキュリティ、可用性、パフォーマンスのすべてに直結します。
しかし、ECSのネットワークモード(awsvpc)の理解、VPCとサブネットの役割分担、セキュリティグループの設計、ALBとの連携設定など、考慮すべき要素が多く、初めて構築する際は戸惑うことも少なくありません。
本記事では、ECSサービスのネットワーク設計とALB連携について、全体像から具体的な設定手順まで体系的に解説します。
この記事を読むことで、以下のことが理解できるようになります。
- ECSのawsvpcネットワークモードの仕組みと特徴
- ECS向けVPC・サブネット設計のベストプラクティス
- ALB、ターゲットグループ、セキュリティグループの連携設定
- パブリック/プライベート構成のユースケース別設計パターン
ECSネットワーク設計の全体像
awsvpcネットワークモードとは
Fargateを使用するECSでは、awsvpcネットワークモードが必須です。このモードでは、各タスクにElastic Network Interface(ENI)が割り当てられ、VPC内の他のリソースと同様にIPアドレスを持ちます。
flowchart TB
subgraph VPC["VPC (10.0.0.0/16)"]
subgraph PublicSubnet["パブリックサブネット"]
ALB["ALB<br/>ENI"]
end
subgraph PrivateSubnet["プライベートサブネット"]
subgraph Task1["タスク1"]
ENI1["ENI<br/>10.0.11.15"]
Container1["コンテナ"]
end
subgraph Task2["タスク2"]
ENI2["ENI<br/>10.0.12.28"]
Container2["コンテナ"]
end
end
end
Internet((インターネット)) --> ALB
ALB --> ENI1
ALB --> ENI2awsvpcモードの主な特徴は以下のとおりです。
| 特徴 | 説明 |
|---|---|
| タスクごとのENI | 各タスクが独自のネットワークインターフェースを持つ |
| VPCレベルのネットワーク | セキュリティグループやNACLをタスク単位で適用可能 |
| プライベートIPの割り当て | タスクにVPC内のプライベートIPアドレスが付与される |
| ポートマッピングの簡素化 | コンテナポートがそのままホストポートとして公開される |
ネットワーク構成の設計パターン
ECSサービスのネットワーク構成は、大きく2つのパターンに分類されます。
パターン1: パブリックサブネット構成
タスクをパブリックサブネットに配置し、パブリックIPを割り当てる構成です。
flowchart TB
subgraph VPC["VPC"]
IGW["インターネット<br/>ゲートウェイ"]
subgraph PublicSubnet["パブリックサブネット"]
ALB["ALB"]
Task1["タスク<br/>パブリックIP付与"]
Task2["タスク<br/>パブリックIP付与"]
end
end
Internet((インターネット)) --> IGW
IGW --> ALB
ALB --> Task1
ALB --> Task2
Task1 -.->|外部API呼び出し| IGW| 項目 | 内容 |
|---|---|
| 用途 | 開発環境、小規模システム |
| メリット | 構成がシンプル、NAT Gatewayコスト不要 |
| デメリット | タスクがインターネットに直接公開される可能性 |
| assignPublicIp | ENABLED |
パターン2: プライベートサブネット構成(推奨)
タスクをプライベートサブネットに配置し、ALBのみをパブリックサブネットに配置する構成です。
flowchart TB
subgraph VPC["VPC"]
IGW["インターネット<br/>ゲートウェイ"]
NAT["NAT Gateway"]
subgraph PublicSubnet["パブリックサブネット"]
ALB["ALB"]
end
subgraph PrivateSubnet["プライベートサブネット"]
Task1["タスク"]
Task2["タスク"]
end
end
Internet((インターネット)) --> IGW
IGW --> ALB
ALB --> Task1
ALB --> Task2
Task1 -.->|外部API呼び出し| NAT
NAT --> IGW| 項目 | 内容 |
|---|---|
| 用途 | 本番環境、セキュリティ要件が厳しいシステム |
| メリット | タスクがインターネットから隔離される |
| デメリット | NAT Gatewayのコストが発生 |
| assignPublicIp | DISABLED |
本番環境では、パターン2のプライベートサブネット構成を推奨します。
VPCとサブネットの設計
ECS向けVPCの要件
ECSサービスをデプロイするVPCには、以下の要件があります。
| 要件 | 説明 |
|---|---|
| DNS解決の有効化 | enableDnsSupport: true(ECRやCloudWatchへのアクセスに必要) |
| DNSホスト名の有効化 | enableDnsHostnames: true(VPCエンドポイント利用時に必要) |
| 十分なIPアドレス空間 | タスクごとにIPを消費するため、余裕を持った設計が必要 |
サブネット設計のベストプラクティス
CIDR設計の考慮点
ECSのawsvpcモードでは、タスクごとにIPアドレスを1つ消費します。サブネットのCIDRは、想定される最大タスク数を考慮して設計します。
| サブネットサイズ | 利用可能IP数 | 推奨用途 |
|---|---|---|
| /24 | 251個 | 中規模サービス |
| /23 | 507個 | 大規模サービス |
| /22 | 1019個 | 複数サービスを配置 |
AWSでは各サブネットで5つのIPアドレスが予約されるため、実際に利用可能なIP数は2^(32-プレフィックス) - 5となります。
マルチAZ構成
可用性を確保するため、複数のアベイラビリティゾーン(AZ)にサブネットを配置します。
flowchart TB
subgraph VPC["VPC (10.0.0.0/16)"]
subgraph AZa["AZ-a"]
PublicA["パブリック<br/>10.0.1.0/24"]
PrivateA["プライベート<br/>10.0.11.0/24"]
end
subgraph AZc["AZ-c"]
PublicC["パブリック<br/>10.0.2.0/24"]
PrivateC["プライベート<br/>10.0.12.0/24"]
end
subgraph AZd["AZ-d"]
PublicD["パブリック<br/>10.0.3.0/24"]
PrivateD["プライベート<br/>10.0.13.0/24"]
end
endECSサービスの設定で複数のサブネットを指定すると、タスクは自動的に各AZに分散配置されます。
ルートテーブルの設定
パブリックサブネットとプライベートサブネットでは、ルートテーブルの設定が異なります。
パブリックサブネット用ルートテーブル
| 送信先 | ターゲット | 説明 |
|---|---|---|
| 10.0.0.0/16 | local | VPC内通信 |
| 0.0.0.0/0 | igw-xxxxx | インターネットへのルート |
プライベートサブネット用ルートテーブル
| 送信先 | ターゲット | 説明 |
|---|---|---|
| 10.0.0.0/16 | local | VPC内通信 |
| 0.0.0.0/0 | nat-xxxxx | NAT Gateway経由のインターネットアクセス |
セキュリティグループの設計
ECSとALBを連携させる場合、最低3種類のセキュリティグループを設計します。
セキュリティグループの全体構成
flowchart LR
Internet((インターネット)) --> SG_ALB
subgraph SG_ALB["ALB用SG"]
ALB["ALB"]
end
subgraph SG_ECS["ECSタスク用SG"]
Task1["タスク1"]
Task2["タスク2"]
end
subgraph SG_DB["DB用SG"]
RDS["RDS"]
end
SG_ALB -->|ポート8080| SG_ECS
SG_ECS -->|ポート5432| SG_DBALB用セキュリティグループ
ALBはインターネットからのトラフィックを受け付けるため、HTTPSポートを開放します。
インバウンドルール
| タイプ | プロトコル | ポート | ソース | 説明 |
|---|---|---|---|---|
| HTTPS | TCP | 443 | 0.0.0.0/0 | インターネットからのHTTPS |
| HTTP | TCP | 80 | 0.0.0.0/0 | HTTPSリダイレクト用 |
アウトバウンドルール
| タイプ | プロトコル | ポート | 送信先 | 説明 |
|---|---|---|---|---|
| カスタムTCP | TCP | 8080 | sg-ecs-tasks | ECSタスクへのヘルスチェックとトラフィック |
ECSタスク用セキュリティグループ
ECSタスクはALBからのトラフィックのみを受け付けます。ソースにALBのセキュリティグループIDを指定することで、ALB以外からのアクセスを遮断します。
インバウンドルール
| タイプ | プロトコル | ポート | ソース | 説明 |
|---|---|---|---|---|
| カスタムTCP | TCP | 8080 | sg-alb | ALBからのトラフィック |
アウトバウンドルール
| タイプ | プロトコル | ポート | 送信先 | 説明 |
|---|---|---|---|---|
| HTTPS | TCP | 443 | 0.0.0.0/0 | ECR、CloudWatch、外部APIへのアクセス |
| PostgreSQL | TCP | 5432 | sg-database | RDSへのアクセス |
データベース用セキュリティグループ
データベースはECSタスクからのアクセスのみを許可します。
インバウンドルール
| タイプ | プロトコル | ポート | ソース | 説明 |
|---|---|---|---|---|
| PostgreSQL | TCP | 5432 | sg-ecs-tasks | ECSタスクからのDB接続 |
セキュリティグループ設計のベストプラクティス
-
セキュリティグループIDを参照する
- IPアドレス範囲ではなく、セキュリティグループIDをソース/送信先に指定
- リソースの追加・削除時にルール変更が不要
-
最小権限の原則
- 必要最小限のポートのみを開放
- 0.0.0.0/0は避け、可能な限り限定的なソースを指定
-
命名規則の統一
- 環境(dev/stg/prod)、用途(alb/ecs/db)を含む命名
- 例:
prod-webapp-alb-sg、prod-webapp-ecs-sg
ALBの構成とターゲットグループ設定
ALBの作成
ECSサービスと連携するALBを作成します。
ALB基本設定
| 設定項目 | 値 | 説明 |
|---|---|---|
| スキーム | internet-facing | インターネットからアクセス可能 |
| IPアドレスタイプ | IPv4 | IPv4のみ使用 |
| VPC | 対象のVPC | ECSと同じVPC |
| サブネット | パブリックサブネット(複数AZ) | 最低2つのAZを選択 |
| セキュリティグループ | ALB用SG | 前述のセキュリティグループ |
リスナー設定
本番環境では、HTTPSリスナーを設定し、HTTPはHTTPSへリダイレクトします。
flowchart LR
Client[クライアント] -->|HTTPS:443| Listener443[HTTPSリスナー]
Client -->|HTTP:80| Listener80[HTTPリスナー]
Listener443 -->|転送| TG[ターゲットグループ]
Listener80 -->|リダイレクト| Listener443HTTPリスナーのリダイレクト設定:
| 設定項目 | 値 |
|---|---|
| アクションタイプ | リダイレクト |
| プロトコル | HTTPS |
| ポート | 443 |
| ステータスコード | HTTP_301 |
ターゲットグループの作成
ECSサービスと連携するターゲットグループを作成します。ターゲットタイプはipを選択します。
基本設定
| 設定項目 | 値 | 説明 |
|---|---|---|
| ターゲットタイプ | IP | Fargate/awsvpcモードでは必須 |
| プロトコル | HTTP | コンテナへの転送プロトコル |
| ポート | 8080 | コンテナが公開するポート |
| VPC | 対象のVPC | ECSと同じVPC |
| プロトコルバージョン | HTTP1 | または HTTP2/gRPC |
ヘルスチェック設定
ヘルスチェックはコンテナの正常性を監視し、異常なタスクへのトラフィック転送を停止します。
| 設定項目 | 推奨値 | 説明 |
|---|---|---|
| プロトコル | HTTP | ヘルスチェック用プロトコル |
| パス | /health | アプリケーションのヘルスエンドポイント |
| 正常のしきい値 | 2 | 正常判定に必要な連続成功回数 |
| 異常のしきい値 | 3 | 異常判定に必要な連続失敗回数 |
| タイムアウト | 5秒 | レスポンス待機時間 |
| 間隔 | 30秒 | ヘルスチェック実行間隔 |
| 成功コード | 200 | 正常と判定するHTTPステータス |
ヘルスチェックパスには、アプリケーションの軽量なエンドポイントを指定します。データベース接続確認を含める場合は、タイムアウト値を適切に設定してください。
ターゲットグループの属性設定
| 属性 | 推奨値 | 説明 |
|---|---|---|
| 登録解除の遅延 | 30秒 | ターゲット削除前の待機時間 |
| スロースタート | 0秒(無効) | 新規ターゲットへのトラフィック増加時間 |
| スティッキーセッション | 無効 | セッション状態をサーバーに持たない設計を推奨 |
登録解除の遅延(Deregistration Delay)は、タスク停止時に進行中のリクエストを完了させるための猶予時間です。アプリケーションの処理時間に応じて調整します。
ECSサービスとALBの連携
サービス作成時のネットワーク設定
ECSサービスを作成する際、ネットワーク設定とロードバランサー設定を行います。
flowchart TB
subgraph ECSService["ECSサービス設定"]
Network["ネットワーク構成<br/>VPC / サブネット / SG"]
LB["ロードバランサー<br/>ALB / ターゲットグループ"]
Task["タスク定義<br/>コンテナ / ポート"]
end
subgraph Resources["AWSリソース"]
VPC["VPC"]
Subnet["サブネット"]
SG["セキュリティグループ"]
ALB["ALB"]
TG["ターゲットグループ"]
end
Network --> VPC
Network --> Subnet
Network --> SG
LB --> ALB
LB --> TGネットワーク構成パラメータ
|
|
| パラメータ | 説明 |
|---|---|
| subnets | タスクを配置するサブネット(複数AZ推奨) |
| securityGroups | タスクに適用するセキュリティグループ |
| assignPublicIp | パブリックIP割り当て(プライベートサブネットではDISABLED) |
ロードバランサー構成パラメータ
|
|
| パラメータ | 説明 |
|---|---|
| targetGroupArn | 連携するターゲットグループのARN |
| containerName | トラフィックを受けるコンテナ名(タスク定義内の名前) |
| containerPort | コンテナが公開するポート番号 |
AWS CLIでのサービス作成例
|
|
重要パラメータの解説
| パラメータ | 説明 | 推奨値 |
|---|---|---|
| health-check-grace-period-seconds | サービス開始後、ヘルスチェックを猶予する時間 | 60-120秒 |
| scheduling-strategy | タスク配置戦略 | REPLICA |
| maximumPercent | デプロイ時の最大タスク数(%) | 200 |
| minimumHealthyPercent | デプロイ時の最小稼働タスク数(%) | 100 |
health-check-grace-period-secondsは、コンテナの起動時間を考慮して設定します。この期間中はALBのヘルスチェック失敗がサービスの異常としてカウントされません。
プライベートサブネット構成の詳細
NAT Gateway経由のインターネットアクセス
プライベートサブネットに配置したECSタスクが外部サービスにアクセスする場合、NAT Gatewayを経由します。
flowchart TB
subgraph VPC["VPC"]
subgraph PublicSubnet["パブリックサブネット"]
NAT["NAT Gateway"]
IGW["インターネット<br/>ゲートウェイ"]
end
subgraph PrivateSubnet["プライベートサブネット"]
Task["ECSタスク"]
end
end
Task -->|ECRイメージ取得| NAT
Task -->|CloudWatchログ送信| NAT
Task -->|外部API呼び出し| NAT
NAT --> IGW
IGW --> Internet((インターネット))NAT Gatewayは各AZに1つずつ配置することで、可用性を確保します。
VPCエンドポイントによるコスト最適化
NAT Gateway経由のトラフィックにはデータ処理料金が発生します。AWSサービスへのアクセスはVPCエンドポイントを使用することで、コストを削減できます。
flowchart LR
subgraph PrivateSubnet["プライベートサブネット"]
Task["ECSタスク"]
end
subgraph Endpoints["VPCエンドポイント"]
ECR_API["ecr.api"]
ECR_DKR["ecr.dkr"]
S3["s3"]
Logs["logs"]
Secrets["secretsmanager"]
end
Task --> ECR_API
Task --> ECR_DKR
Task --> S3
Task --> Logs
Task --> SecretsECSで推奨されるVPCエンドポイント:
| エンドポイント | タイプ | 用途 |
|---|---|---|
| com.amazonaws.region.ecr.api | Interface | ECR API呼び出し |
| com.amazonaws.region.ecr.dkr | Interface | Dockerイメージ取得 |
| com.amazonaws.region.s3 | Gateway | ECRイメージレイヤー取得 |
| com.amazonaws.region.logs | Interface | CloudWatch Logsへのログ送信 |
| com.amazonaws.region.secretsmanager | Interface | シークレット取得 |
VPCエンドポイントを使用する場合、エンドポイント用のセキュリティグループも適切に設定する必要があります。
トラフィックの流れと動作確認
リクエストの流れ
ユーザーからのリクエストがECSタスクに到達するまでの流れを確認します。
sequenceDiagram
participant User as ユーザー
participant DNS as Route 53
participant ALB as ALB
participant TG as ターゲットグループ
participant Task as ECSタスク
User->>DNS: example.com を解決
DNS->>User: ALBのDNS名を返却
User->>ALB: HTTPSリクエスト
ALB->>ALB: SSL終端
ALB->>TG: ターゲット選択
TG->>Task: HTTPリクエスト転送
Task->>Task: アプリケーション処理
Task->>ALB: HTTPレスポンス
ALB->>User: HTTPSレスポンス動作確認のポイント
サービスデプロイ後、以下のポイントを確認します。
1. タスクの起動確認
|
|
期待される状態:
- lastStatus: RUNNING
- healthStatus: HEALTHY
2. ターゲットグループのヘルスチェック確認
|
|
期待される状態:
- State: healthy
3. ALB経由のアクセス確認
|
|
トラブルシューティング
よくある問題と対処法を以下にまとめます。
| 症状 | 原因 | 対処法 |
|---|---|---|
| タスクがPENDINGのまま | サブネットのIP枯渇 | サブネットのCIDRを拡張 |
| タスクがSTOPPED | イメージ取得失敗 | VPCエンドポイントまたはNAT Gatewayを確認 |
| ターゲットがunhealthy | セキュリティグループの設定ミス | ALBからECSタスクへのポート許可を確認 |
| 接続タイムアウト | ルートテーブルの設定ミス | サブネットのルートテーブルを確認 |
本番環境向けのベストプラクティス
可用性の確保
-
マルチAZ配置
- ALBは最低2つのAZのパブリックサブネットに配置
- ECSタスクは複数AZのプライベートサブネットに分散
-
適切なタスク数の設定
- 最小タスク数は2以上を推奨(1AZ障害時も継続稼働)
- Auto Scalingで負荷に応じたスケーリングを設定
-
ヘルスチェックの最適化
- アプリケーションの起動時間を考慮した猶予期間の設定
- 適切なしきい値で迅速な異常検知と誤検知防止のバランス
セキュリティの強化
-
最小権限の原則
- セキュリティグループは必要最小限のポートのみ開放
- タスクロールにはアプリケーションに必要な権限のみ付与
-
通信の暗号化
- ALBでSSL/TLS終端を実施
- 必要に応じてALB-ECS間もHTTPS化
-
プライベートサブネットの活用
- コンテナはプライベートサブネットに配置
- インターネットからの直接アクセスを遮断
コスト最適化
-
VPCエンドポイントの活用
- ECR、CloudWatch Logs、S3へのアクセスはエンドポイント経由
- NAT Gatewayのデータ処理料金を削減
-
適切なサイジング
- タスクのCPU/メモリは実際の使用量に基づいて設定
- 過剰なリソース割り当てを避ける
-
NAT Gatewayの構成
- 開発環境では1AZに集約することも検討
- 本番環境では各AZに配置して可用性を確保
まとめ
本記事では、ECSサービスのネットワーク設計とALB連携について解説しました。主要なポイントは以下のとおりです。
- awsvpcネットワークモードにより、タスクごとにENIが割り当てられ、VPCレベルのネットワーク制御が可能
- プライベートサブネット構成を採用し、ECSタスクをインターネットから隔離することでセキュリティを強化
- セキュリティグループはALB用、ECSタスク用、DB用を分離し、セキュリティグループIDを参照して連携
- ターゲットグループはターゲットタイプをIPに設定し、適切なヘルスチェックを構成
- VPCエンドポイントを活用してNAT Gatewayのコストを最適化
適切なネットワーク設計は、ECSサービスの可用性、セキュリティ、運用性のすべてに影響します。本記事の内容を参考に、要件に応じた最適な構成を検討してください。