イメージを push してサービスを作成しても、最初のタスクが RUNNING に到達しません。ResourceInitializationError で停止し、unable to pull secrets or registry auth と表示されます。イメージに問題はありません。タスクが置かれたプライベートサブネットには Amazon ECR や Secrets Manager へのルートがなく、Fargate がタスクを起動できないのです。
ECS on Fargate の問題の多くは、これに似ています。コンテナは動くのに、その周囲のネットワーク、ロール、ロードバランサーの設定が動かないのです。この記事では、Amazon ECS と AWS Fargate で動く本番 Web サービスを、ネットワークとロードバランシングから IAM、スケーリング、デプロイ、ECS と EKS の比較まで、コピーできる図とともに順に見ていきます。
ECS の概念を 1 つの表で
| 概念 | 内容 | この例では |
|---|---|---|
| クラスター | サービスとタスクの論理的なグループ | prod |
| タスク定義 | バージョン管理されたひな形:イメージ、CPU、メモリ、ポート、ロール、シークレット、ログ | orders-api:42 |
| タスク | タスク定義の実行中のコピー。Fargate では専用のカーネル、メモリ、ネットワークインターフェースを持つ | 2 から 10 個 |
| サービス | 希望するタスク数を維持し、タスクをロードバランサーに登録し、デプロイを実行する | orders-api |
| キャパシティプロバイダー | タスクの実行先:FARGATE、FARGATE_SPOT、EC2 Auto Scaling グループ、ECS Managed Instances |
FARGATE と FARGATE_SPOT |
クラスターはネットワークの境界ではありません。タスクは、指定したサブネット内で、タスク専用のセキュリティグループに守られて動きます。ECS はオーケストレーションに課金しません。Fargate は各タスクの vCPU、メモリ、ストレージを秒単位で課金し、最低 1 分です。
ネットワーク:タスクごとに 1 つの ENI
Fargate のタスクは常に awsvpc ネットワークモードを使います。各タスクは専用の Elastic Network Interface(ENI)、サブネットのプライベート IP、専用のセキュリティグループを受け取ります(Fargate のタスクネットワーク)。これには 3 つの影響があります。
- サブネットには余裕が必要です。 タスクごとに IP を 1 つ使い、AWS はサブネットごとに 5 つを予約します。2 つの AZ に 60 タスクなら 1 サブネットあたり 30 で、200% のローリングデプロイでは一時的に 60 が必要です。/24(利用可能 251)なら収まりますが、/27(利用可能 27)では足りません。
- セキュリティグループはタスク単位で働きます。 コンテナのポートはロードバランサーのグループにだけ、データベースのポート 5432 はタスクのグループにだけ開けます。
- タスクには AWS API への経路が必要です。 コードが動く前に、Fargate はタスクの ENI を通してイメージを取得し、シークレットを取得し、ログの送信を始めます。
プライベートサブネットからは、この経路は NAT ゲートウェイか VPC エンドポイントになります(US East の料金、執筆時点の 2026 年 11 月)。
| 経路 | 作成するもの | コスト | トレードオフ |
|---|---|---|---|
| NAT ゲートウェイ | AZ ごとに 1 つ、またはリージョナル NAT ゲートウェイ 1 つ | AZ あたり 1 時間 $0.045 と 1 GB あたり $0.045 | サードパーティの API にも到達できる |
| VPC エンドポイント | インターフェースエンドポイント ecr.api、ecr.dkr、logs、secretsmanager と、S3 ゲートウェイエンドポイント |
エンドポイントと AZ あたり 1 時間 $0.01 と 1 GB あたり $0.01。S3 ゲートウェイは無料 | インターネットへの経路がまったくない |
S3 ゲートウェイエンドポイントは省かないでください。ECR はイメージレイヤーを S3 に保存しています(ECR のインターフェースエンドポイント)。2 つの AZ に 4 つのインターフェースエンドポイントを置くと、データ料金を除いて月に約 $58 かかります(8 × $0.01 × 730 時間)。これは $66 の NAT ゲートウェイ 2 つに近い額です。したがって、データ料金とプライバシーではエンドポイントが、到達範囲では NAT が勝ります。2025 年 11 月以降、リージョナル NAT ゲートウェイは AZ をまたいで自動的に動作し、パブリックサブネットも不要です。タスクにパブリック IP を付ける方法も使えますが、すべてのタスクがセキュリティグループのルール 1 つでインターネットに露出します。AWS VPC 図では、ルートと NAT の配置を扱っています。
ロードバランサー:ターゲットグループとヘルスチェック
ALB には少なくとも 2 つの AZ のサブネットが必要で、それぞれ /27 以上で空きアドレスが 8 つ必要です。awsvpc のタスクは EC2 インスタンスではなく ENI なので、ターゲットグループのタイプは ip にします。ターゲットグループはサービスごとに 1 つ使い、タスクの登録と登録解除は ECS が行います。
| 設定 | デフォルト | 検討する値 |
|---|---|---|
| ヘルスチェック間隔 | 30 秒 | サービスが 10 秒未満で起動するなら 5 秒(AWS の推奨) |
| 異常しきい値 | 2 回 | 失敗するタスクは約 1 分で切り離される |
| 正常しきい値 | 5 回 | 新しいターゲットは 1 回の成功で足りる |
| 登録解除の遅延(deregistration delay) | 300 秒 | 短いリクエストなら 30 秒以下。古いタスクはこの間ドレインされうる |
healthCheckGracePeriodSeconds |
0 | 起動時間をカバーする。さもないと起動の遅いタスクが繰り返し置き換えられる |
2025 年 11 月以降、ECS Express Mode はコンテナイメージから、この ALB、HTTPS、スケーリングの構成を作成できます。ロードバランサー図では、ヘルスチェックとドレインを一般的な形で扱っています。
IAM:実行ロールとタスクロール
ロールは 2 つあり、役割が異なります。
- タスク実行ロールを使うのは、コードではなく ECS と Fargate エージェントです。イメージを取得し、ログを書き込み、タスク定義に書かれたシークレットを読みます(タスク実行ロール)。
AmazonECSTaskExecutionRolePolicyは ECR とログをカバーします。secretsmanager:GetSecretValueは自分で追加し、カスタマーマネージドキーにはkms:Decryptも追加します。 - タスクロールは、コードが AWS SDK を通じて S3 や SQS に使うロールで、ECS Exec にも必要です。
シークレットは環境変数として渡されます。
"secrets": [{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-1:111122223333:secret:prod/orders/db-AbCdEf:password::"
}]
ECS はコンテナの起動時に値を読み取ります。ローテーションされたシークレットは実行中のタスクには届かないため、ローテーション後に再デプロイするか、アプリにタスクロールでシークレットを読ませてください。上のように JSON のキーを 1 つ選ぶには、現在の LATEST であるプラットフォームバージョン 1.4.0 が必要です。
スケーリング:ターゲット追跡と Fargate Spot
Service Auto Scaling では、まず ECSServiceAverageCPUUtilization、ECSServiceAverageMemoryUtilization、ALBRequestCountPerTarget のいずれかでターゲット追跡を使います。スケールアウトは速く、スケールインは遅く、デプロイ中はスケールインを一時停止します。複数のポリシーがある場合は、すべてが同意したときだけスケールインします。AZ ごとに少なくとも 1 つのタスクを維持してください。
Fargate Spot は最大 70% 安くなります。AWS が容量を回収するとき、タスクには 2 分間の警告が、停止コード SpotInterruption の EventBridge イベントと SIGTERM として届きます(Fargate のキャパシティプロバイダー)。stopTimeout の上限は 120 秒で、Fargate が自動的に通常の容量へ切り替わることはないため、base を設定します。
"capacityProviderStrategy": [
{ "capacityProvider": "FARGATE", "base": 2, "weight": 1 },
{ "capacityProvider": "FARGATE_SPOT", "weight": 1 }
]
最初の 2 つのタスクは常に通常の Fargate で動き、残りは 1 対 1 に分かれます。Spot 上のタスクが 1 つだけのサービスは、容量が戻るまで停止します。
デプロイ:ローリング、blue/green、linear、canary
ローリングがデフォルトです。minimumHealthyPercent が 100、maximumPercent が 200 なら、ECS は古いタスクを止める前に新しいタスクを起動します。ロールバック付きの deployment circuit breaker を有効にしてください。デフォルトでは、失敗したタスクが希望数の半分(最小 3、最大 200)に達するとデプロイを失敗にします。CloudWatch アラームでも同じロールバックを起動できます。
2025 年 7 月以降、ECS は CodeDeploy なしで blue/green デプロイを自分で実行し、2025 年 10 月以降は linear と canary も実行します。新しいリビジョンを 2 つ目のターゲットグループの背後で起動し、リスナーのトラフィックを移し、古いタスクをベイクタイムのあいだ残すので、ロールバックはトラフィックの切り替えで済みます。
| 戦略 | トラフィックの移行 | ロールバック | 追加容量 |
|---|---|---|---|
| Rolling | タスクをバッチで置き換える | 再デプロイ | maximumPercent まで |
| Blue/green | 任意のテストトラフィックの後、一度にすべて | 切り戻す | 2 倍 |
| Linear | 数分ごとに 10% など、等しいステップ | 切り戻す | 2 倍 |
| Canary | まず少量、その後に残り | 切り戻す | 2 倍 |
Lambda や一時停止のフックで、各ステージにゲートを設けられます。ALBRequestCountPerTarget に対するターゲット追跡は blue/green ではサポートされません。デプロイ戦略図でパターンを比較しています。
オブザーバビリティ
awslogs ドライバーには awslogs-group、awslogs-region が必要で、Fargate では awslogs-stream-prefix も必要です。2025 年 6 月 25 日以降、デフォルトは 10 MB のバッファを持つ non-blocking モードです。CloudWatch の不調でアプリが固まることはなくなりましたが、バッファが満杯になると行が失われます。拡張オブザーバビリティ付きの Container Insights、シェル用の ECS Exec、タスクの状態変更に対する EventBridge ルールを追加してください。停止理由(stopped reason)を見れば、タスクが終了した理由が分かります。トレースには、OpenTelemetry Collector をタスク内のサイドカーとして動かします。これは OpenTelemetry で扱うログ、メトリクス、トレースのパイプラインにおけるエージェント層です。
ECS と EKS
| Amazon ECS | Amazon EKS | |
|---|---|---|
| コントロールプレーン | 無料 | クラスターあたり 1 時間 $0.10、月に約 $73 |
| API | AWS のタスク定義とサービス | Kubernetes、Helm、オペレーター |
| コンピュート | Fargate、EC2、ECS Managed Instances | Fargate、EC2 ノードグループ、EKS Auto Mode |
| アップグレード | コントロールプレーンには不要 | Kubernetes バージョンごとに 14 か月の標準サポート、その後はクラスターあたり 1 時間 $0.60 |
| 組み込みのデプロイ | Rolling、blue/green、linear、canary | Rolling。ほかは Argo Rollouts などのツールで |
料金は、執筆時点(2026 年 11 月)の EKS の料金ページによります。Kubernetes のポータビリティやエコシステムが必要なら EKS を選びます。その構成は Kubernetes アーキテクチャ図で見られます。短時間で終わるイベント駆動の処理なら、Lambda ベースのサーバーレス構成には常時稼働のサービスがまったく要りません。
ECS on Fargate の図
ダイアグラムの内容
- VPC
- Public subnet · AZ a
- Public subnet · AZ b
- Private subnet · AZ a
- Private subnet · AZ b
- Application Load Balancer
- orders-api task
- RDS for PostgreSQL
- VPC endpoints
- Users
- Amazon ECR
- Secrets Manager
- CloudWatch Logs
- HTTPS 443
- HTTP 8080
- SQL 5432
- image pull
- secrets at start
- awslogs
図の読み方は次のとおりです。
- AZ は行です。 各 AZ にパブリックとプライベートのサブネットが 1 つずつあります。ALB、RDS、エンドポイントは行の間にあります。どれも両方の AZ にまたがるためです。各パブリックサブネットに ALB ノードがあり、データベースには Multi-AZ のスタンバイがあります。
- 青の実線はリクエストの経路です:ALB への HTTPS、AZ ごとに 1 つのタスクへの HTTP 8080、ポート 5432 の SQL。
- 紫の破線はプラットフォームのトラフィックです:イメージの取得、シークレット、ログで、Fargate がタスク実行ロールを使って VPC エンドポイント経由で送ります。
- 0.0.0.0/0 をインターネットゲートウェイにルーティングするのはパブリックサブネットだけです。
- Markdown ブロックにはサービスの設定を一覧にしています。
ECS の図を分かりやすく描く
- タスクは AZ ごとのサブネットの中に置きます。 すべてを囲む「ECS クラスター」の枠は、タスクがどこで動き、何に到達できるかを隠してしまいます。
- AZ ごとに 1 つのタスクを描き、その横にスケーリングの範囲を書きます。
- ECR、Secrets Manager、CloudWatch Logs への経路を示します。 経路が欠けているのは、タスクが起動しない一般的な原因です。
- ALB のエッジにはポートとターゲットタイプを付け、破線のエッジの背後にあるロールは凡例で名前を示します。
- 省くもの: サイドカー、CI/CD、DNS レコード。図の主題でない限り描きません。
AWS 3 層アーキテクチャのテンプレートは、EC2 で同じ VPC 構成を使っています。
Archboard で作る
- Google または GitHub でサインインし、ダイアグラムを作成します。
- ネットワークパックから VPC を追加し、その中に サブネット ノードを 4 つ、各 AZ にパブリックとプライベートを 1 つずつ置きます。
- クラウドパックから クラウドロードバランサー をパブリックサブネットの間に追加し、パブリックサブネットにはルートと ALB ノード用の テキスト ノートを追加します。
- クラウドパックから コンピューティング ノードを各プライベートサブネットに追加し、タスクのサイズをインスタンスタイプのフィールドに入力します。
- プライベートサブネットの間に、高可用性をオンにした マネージドデータベース と、VPC エンドポイント用の クラウドリソース を追加します。どちらもクラウドパックのものです。
- VPC の外に、ネットワークパックから インターネット、Docker パックから レジストリ、セキュリティパックから ボールト、DevOps パックから ログ を追加します。
- ラベル付きのエッジを描き、プラットフォームのトラフィックは破線にして、基本パックから設定を書いた Markdown ブロックを追加します。
CloudFormation からダイアグラムと Terraform からダイアグラムのツールを使うと、既存のスタックのコードから最初のたたき台を作れます。Terraform からサービスを図にするときは、たたき台を絞り込み、リクエストの経路を手で書き足します。
この例で使うダイアグラムノードは 15 個で、Free プランの範囲に収まります。
よくある質問
Fargate には awsvpc ネットワークモードが必須ですか?
はい。Fargate の各タスクは専用のネットワークインターフェースとプライベート IP アドレスを受け取るため、ターゲットグループにはターゲットタイプ ip を使う必要があります。
ECS のタスクロールとタスク実行ロールの違いは何ですか? 実行ロールは、ECS がタスクを起動するためのものです。イメージの取得、シークレットの取得、ログの送信を行います。タスクロールは、アプリケーションのコードが自分の AWS 呼び出しに使うものです。
プライベートサブネットの Fargate タスクに NAT ゲートウェイは必要ですか? AWS サービスに対しては不要です。ECR、CloudWatch Logs、Secrets Manager のインターフェースエンドポイントと、S3 ゲートウェイエンドポイントがあれば足ります。NAT が必要なのは、インターネットに到達するときだけです。
ECS は CodeDeploy なしで blue/green デプロイをサポートしていますか? はい。ECS は 2025 年 7 月から blue/green を、2025 年 10 月から linear と canary をネイティブに実行しており、ベイクタイム、ライフサイクルフック、アラームに基づくロールバックにも対応しています。
ECS は EKS より安いですか? コントロールプレーンについては安いです。ECS にはオーケストレーション料金がなく、EKS クラスターは標準サポートで 1 時間 $0.10 かかります。Fargate と EC2 インスタンスの料金は、どちらでも同じです。