Amazon ECS徹底解説:GKE・AKS・Cloud Run / Container Apps と比べて分かる“ちょうどいい”コンテナ基盤設計
はじめに(要点サマリー)
- 本記事の主役は Amazon Elastic Container Service(Amazon ECS)。
ECSは、コンテナ化されたアプリケーションを簡単にデプロイ・管理・スケールできるフルマネージドのコンテナオーケストレーションサービス です。 - ECSは EC2 / Fargate / ECS Anywhere という3種類の実行・起動タイプをサポートし、クラウド・オンプレ・エッジまで一貫した運用ができるのが特徴です。
- GCPの世界では GKE(Google Kubernetes Engine) がマネージドKubernetesとして、Azureでは AKS(Azure Kubernetes Service) が同じポジションを担います。どちらも「Kubernetesそのものをマネージドで運用する」サービスです。
- さらに一段上の抽象度として、
- AWS:App Runner
- GCP:Cloud Run
- Azure:Azure Container Apps
といった「サーバレスなコンテナ実行基盤」もあり、ECSとの住み分けがポイントになります。
- 想定読者は、
- これからコンテナを本番で使いたい Web/バックエンド開発者
- ECS / GKE / AKS の違いを整理したい SRE・インフラエンジニア
- どのレイヤー(ECS or App Runner / Cloud Run / Container Apps)を採用するか迷っている 技術リーダー・アーキテクト
のみなさまです。
- 読み終わるころには、
- 「このユースケースなら ECS がちょうどいい」
- 「ここまで抽象化したいなら App Runner / Cloud Run / Container Apps を選ぶ」
- 「Kubernetesが必要なら GKE / AKS / EKS を選ぶ」
といった 判断軸が自分の言葉で説明できる状態 を目指しますね。
1. Amazon ECSとは:AWSに最適化された“ちょうどいい”オーケストレーション
1.1 ECSの立ち位置
Amazon ECS は、AWSが提供する フルマネージドのコンテナオーケストレーションサービス です。コンテナ化されたアプリケーションを、AWS上で効率よく配置・スケーリング・監視するための“司令塔”の役割を担います。
ざっくり言うと:
- ECS
- AWSに最適化されたクローズドなオーケストレーション
- IAM / VPC / ALB / CloudWatch などとの統合が非常にシンプル
- EKS(参考)
- OSSの Kubernetes をAWSでマネージド運用
- “Kubernetesネイティブ”な設計をしたい場合の選択肢
- GKE / AKS
- どちらもマネージドKubernetesサービス
- KubernetesそのもののAPI・エコシステムを軸にする世界観
ECSはKubernetesではありませんが、そのぶん 概念が少なくシンプル で、「AWSだけで完結するシステムならまず候補に挙がる」存在だと思ってもらうとイメージしやすいです。
1.2 ECSの主なユースケース
- Web API / バックエンド(マイクロサービス)
- バッチ処理・ジョブ実行
- キューを消化するワーカー(SQS / Kinesisなど)
- ゲームサーバー・リアルタイム処理
- 機械学習の推論・前処理
要するに、“常時起動 or 継続的に動くコンテナ” はだいたいECSで扱えます。
2. ECSの基本概念:クラスター・タスク定義・サービス
ECSは、いくつかの基本部品の組み合わせで成り立っています。用語に慣れてしまえば、そんなに難しくありません。
2.1 クラスター(Cluster)
- コンテナを実行する 論理的な“箱”
- 中には、
- EC2インスタンス(EC2起動タイプ)
- Fargateの実行環境(Fargate起動タイプ)
- ECS Anywhereで登録したオンプレノード
などが含まれます。
2.2 タスク定義(Task Definition)
- 「どのイメージを、どんなリソースで、どんな環境変数で動かすか」という コンテナ実行のひな型
- 1つのタスク定義の中に、複数のコンテナを含めることもできます(Sidecarパターンなど)。
2.3 タスク(Task)
- タスク定義を元に起動された コンテナ群の実体。
- “1タスク=1Pod相当”とイメージすると、Kubernetes経験者には分かりやすいかもしれません。
2.4 サービス(Service)
- 「このタスクを常に N個以上動かしておいて」とお願いする仕組みです。
- サービスを作ると、
- タスクの ヘルスチェック・再起動
- オートスケーリング(ECS Service Auto Scaling)
- ALB / NLB との連携(ターゲット登録)
などをECSが自動的にやってくれます。
この4つを押さえておけば、基本的なECS構成はだいたい読み解けるようになります。
3. ECSの起動タイプと類似サービスとの位置づけ
3.1 EC2 / Fargate / Anywhere の3つの起動タイプ
ECSでコンテナを動かす方法(起動タイプ)は大きく3つです。
- EC2起動タイプ
- 自分で用意したEC2インスタンス群の上でコンテナを動かす。
- OSやミドルウェア、ディスク構成を細かくチューニングしたいときに向きます。
- Fargate起動タイプ
- コンテナ実行基盤(EC2)を意識せず、“vCPUとメモリを指定するだけ” で動かせるサーバレス実行環境。
- インスタンスのパッチ・スケール・容量管理から解放される代わりに、EC2より単価はやや高めになりがちです。
- ECS Anywhere
- オンプレや他クラウドのノードをECSクラスターに登録し、同じコントロールプレーンで管理する ための仕組み。
シンプルに言えば、
- とにかくインフラ管理を減らしたい → Fargate
- コスト最適化や特殊な要件がある → EC2
- ハイブリッド/エッジまで一元管理したい → ECS Anywhere
というイメージで使い分けます。
3.2 Kubernetes系との位置づけ(ECS vs GKE / AKS)
- ECS
- AWSの独自オーケストレーション。学ぶべき概念は少なめ。
- GKE(GCP)・AKS(Azure)
- どちらも マネージドKubernetes。Kubernetes API・マニフェスト・Helmなど、OSSのエコシステムをフルに使えます。
Kubernetesに強いチームであれば、
- AWS:EKS
- GCP:GKE
- Azure:AKS
で揃える方が学習コストが少ない場合もありますが、AWSに閉じたシステムで、KubernetesそのものにこだわりがないならECSの方がシンプル というケースもかなり多いです。
3.3 “さらに上”のサーバレスコンテナとの比較
ECSの一段上には、
- AWS App Runner:ソースまたはコンテナイメージを指定すると、自動でビルド・デプロイ・スケーリングまでやってくれるフルマネージドコンテナアプリサービス。
- GCP Cloud Run:HTTP/イベント駆動のコンテナをサーバレスで実行。スケールtoゼロが得意。
- Azure Container Apps:サーバレスなコンテナ実行基盤。HTTP・イベント・CPU/メモリ負荷に応じてスケールし、KEDAベースのスケーラを利用可能。
という“PaaS寄り”のサービス群があります。
ざっくりした目安としては、
- インフラやクラスタ運用は極力触りたくない → App Runner / Cloud Run / Container Apps
- VPCやALB、細かいネットワーク制御、自前のジョブ制御が必要 → ECS / GKE / AKS
という分け方で考えると整理しやすいです。
4. ECSのアーキテクチャ例:Web API・バッチ・イベント駆動
ここでは、ECSを使った代表的な構成を3パターンほど簡単にイメージしてみますね。
4.1 Fargateで動かすシンプルなWeb API
- VPC内に、ALB+ECS(Fargate)クラスターを構成
- ALB → ECSサービス(複数タスク)
- タスク定義には
- Dockerイメージ(ECRからpull)
- 0.25 vCPU / 0.5GB のようなリソース
- 環境変数(DB接続情報はSecrets Manager参照)
開発者は Dockerfileとアプリケーションコードに集中し、デプロイはCI/CDから ecs deploy するだけ、という運用がしやすくなります。
4.2 バッチ・ジョブ処理
- ECSクラスターを共有しつつ、
- 常駐Webサービス用のサービス
- バッチ用の “スケジュールドタスク(EventBridge + RunTask)”
を共存させる構成がよく使われます。
- 例えば「毎時 S3 からファイルを取り込み、ETLしてRDSにロード」などを、ECSタスクとして1回実行させるイメージです。
GCPなら GKE Job / Cloud Run Job、Azureなら AKSのJob / Container Appsのジョブ機能 が近い役割になります。
4.3 イベント駆動ワーカー(SQS / Kinesis)
- SQSキューをポーリングするワーカーをECSで動かし、
- メッセージ数に応じて Service Auto Scalingでタスク数を増減
というパターンも定番です。
- メッセージ数に応じて Service Auto Scalingでタスク数を増減
- GCPでは Cloud Run + Pub/Sub push、GKE + Pub/Subサブスク、Azureでは Container Apps + Event Hub / Service Bus などで同様の構成が可能です。
5. 簡単なタスク定義サンプル(イメージを掴む用)
細かいところは環境に依存しますが、ざっくりしたFargate用タスク定義のイメージを載せておきますね。
{
"family": "sample-api",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123456789012:role/app-task-role",
"containerDefinitions": [
{
"name": "app",
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/sample-api:latest",
"portMappings": [{ "containerPort": 8080 }],
"essential": true,
"environment": [
{ "name": "APP_ENV", "value": "prod" }
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/sample-api",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "app"
}
}
}
]
}
- ApplicationのIAM権限は
taskRoleArnに付ける - CloudWatch Logsへログ送信
- ALBターゲットグループではポート8080を指定
このタスク定義を元に、ECSサービスを作成して「常に最低2タスク起動」などと指定すれば、負荷や障害に応じてECSがよしなに面倒を見てくれます。
6. ネットワーク・セキュリティ:VPC・IAM・ログ連携
6.1 VPCとALB/NLB
ECS(特にFargate)は、VPC内で動くことを前提とした設計です。
- ALB/NLB → ECSサービス(awsvpcモード)
- セキュリティグループで通信を制御
- Private Subnetにタスクを配置し、Public SubnetのALB経由で外部公開
このあたりの“型”は、GKEなら VPCネイティブクラスタ+Internal/External Load Balancer、AKSならVNet統合+Azure Load Balancer / Application Gateway でほぼ同じ考え方で組めます。
6.2 IAMロールとタスクロール
- ECSでは、タスクごとにIAMロール(タスクロール)を割り当てることができます。
- 例えば、S3からファイルを読む権限だけを持つロールをタスクに付けてあげれば、
- EC2インスタンスや他リソースにはその権限を付けず
- 「このアプリだけがS3を読める」という最小権限設計ができます。
GCPならWorkload Identity + サービスアカウント、AzureならマネージドIDを使うイメージが近いです。
6.3 ログとメトリクス
- 標準では、アプリログをCloudWatch Logs に送る設定がよく使われます。
- CPU / メモリ利用率などはCloudWatchメトリクスとして自動収集され、
- Auto Scalingのトリガー
- アラーム
- ダッシュボード
に活用できます。
GKEなら Cloud Logging / Cloud Monitoring、AKSなら Log Analytics / Azure Monitor を使う形になり、どのクラウドでも「コンテナのログ・メトリクスをマネージド監視サービスに投げる」という構図は同じです。
7. CI/CDとデプロイ戦略:ECR・CodePipelineとGCP/Azureの比較
7.1 典型的なECSデプロイパイプライン
- Git push
- CI(GitHub Actions / CodeBuildなど)でコンテナイメージをビルド
- Amazon ECR にpush
aws ecs update-serviceでタスク定義のリビジョンを切り替え- ECSサービスのローリングデプロイ(最小稼働数を保ちつつタスク入れ替え)
AWS CodePipeline/CodeDeployを使えば、ブルーグリーンデプロイやカナリアリリース も比較的簡単に構成できます。
7.2 GCP / Azure の場合
- GCP:Cloud Build でビルド → Artifact Registry → GKE / Cloud Run へデプロイ。Cloud Deploy を組み合わせると、マルチ環境への段階的デリバリがしやすくなります。
- Azure:Azure DevOps / GitHub Actions → Azure Container Registry → AKS / Container Appsへデプロイ、という流れが典型です。
どのクラウドでも、「レジストリにpush → オーケストレーションサービスに新しいバージョンを適用」という基本パターンは共通です。
8. コストとスケーリング:Fargate vs EC2とGKE/AKSとの違い
8.1 FargateとEC2のトレードオフ
- Fargate
- インスタンス管理不要。
- 少数のサービス・スパイクのある負荷・夜は止めたい開発環境などに向く。
- EC2
- 自分でインスタンスサイズ・台数・ライフサイクルを管理。
- 長時間連続稼働・大規模トラフィックなら、リザーブドインスタンスやSavings Plansと組み合わせてコスト最適化しやすい。
GKEでも、
- Standardモード + 自前ノード と
- Autopilotモード(よりサーバレス寄り)
があり、AKSでもVirtual Nodesやサーバレスオプションが存在していて、「インフラ管理の楽さ」と「単価」のバランスをどこに置くか が共通の悩みどころです。
8.2 スケーリング戦略
- ECSサービスオートスケーリング
- CPU / メモリ利用率、ALBのリクエスト数、SQSのメッセージ数などをトリガーにタスク数を自動調整。
- GKE / AKS
- HPA(Horizontal Pod Autoscaler)やCluster AutoscalerでPod数・ノード数を調整。
- App Runner / Cloud Run / Container Apps
- 「リクエスト数」「イベント数」「CPU/メモリ負荷」に応じて完全サーバレスでスケールし、空負荷時はゼロまで縮むことも可能。
ECSを選ぶ場合も、「コンテナ単位でどこまで細かくスケーリングさせるか」 を設計しておくと、コストと性能のバランスが取りやすくなります。
9. 誰がどう嬉しい?読者タイプ別のメリット
9.1 アプリケーション開発者(Web API・バックエンド)
- Dockerでアプリは作っているけれど、Kubernetesはちょっと重く感じる…
そんな方には、ECS(Fargate) + ALB がとても扱いやすいと思います。 - タスク定義さえ覚えてしまえば、
- 既存のDockerイメージをそのままECSに載せられ、
- ログ・メトリクス・スケーリング・WAF連携まで一気に整えやすいです。
9.2 SRE / インフラエンジニア
- AWS中心の組織であれば、
- ECS + Fargate / EC2
- IAM / VPC / CloudWatch / X-Ray / WAF
を組み合わせて「コンテナアプリ用の標準基盤テンプレート」を作りやすくなります。
- Kubernetesにフルコミットしない選択肢として、ECSはとてもバランスが良いです。
9.3 技術リーダー・アーキテクト
- マルチクラウドまで見据えるなら、
- AWS:ECS or EKS
- GCP:GKE or Cloud Run
- Azure:AKS or Container Apps
といった “オーケストレーションレイヤーの地図” を頭の中に描いておく必要があります。
- ECSの記事を通じてその1ピースをしっかり理解しておけば、他クラウドを検討するときも「どのレイヤーと対応しているか」を冷静に比較しやすくなります。
10. 設計チェックリスト(最初の1〜2週間で固めたいこと)
- どのレイヤーを使うかを決める
- ECSか? それとも App Runner / Cloud Run / Container Apps まで抽象化するか?
- 起動タイプの選定
- Fargate / EC2 / Anywhere のどれをメインにするか。
- クラスター構成
- 本番・検証・開発でクラスターを分けるか? アカウントやVPCの分割方針は?
- タスクロール設計
- 各アプリがどのAWSリソースに何をするのか(S3 GetObjectだけ、DynamoDB PutItemだけ…など)。
- ネットワークとALB/NLB構成
- Public/Private Subnet、インターネット公開の要否、WAFとの連携。
- ログ・メトリクス・トレース
- CloudWatch Logsグループの命名・保持期間、メトリクスアラーム、X-Rayや他APMの導入。
- デプロイ戦略
- ローリング / ブルーグリーン / カナリアのどれを採用するか。
- スケーリングポリシー
- CPU/メモリ基準か、ビジネス指標(キュー長・リクエスト数)基準にするか。
- セキュリティ・アップデート方針
- ベースイメージの更新、脆弱性スキャン、ECRのライフサイクル。
- 将来のマルチクラウド戦略との整合
- Kubernetesベースに移行したくなったとき、どこからどこまでをECS→EKS/GKE/AKSに持っていくか、ざっくり想像しておく。
11. 今日からできる3ステップ
- 既存のコンテナアプリを1つ選ぶ
- まずは小さめのアプリを対象に、「これをECS(Fargate)に載せるとどうなるか?」を紙に書き出してみてください。
- タスク定義を1つ書いてみる
- GUIでもCLIでも良いので、ECRのイメージ・ポート・環境変数・ログ設定を含んだタスク定義を作ってみる。
- GKE / AKS / Cloud Run / Container Apps との対応表を作る
- 「ECSクラスターはGKEクラスタ」「タスクはPod」「サービスはDeployment + Service」「FargateはGKE Autopilot的なもの…」という表を自分なりに作ると、クラウドが変わっても迷いにくくなります。
12. まとめ:ECSは“AWSネイティブなコンテナ基盤”の第一候補
ここまで見てきたように、Amazon ECSは
- AWSに深く統合された フルマネージドのオーケストレーション であり、
- EC2 / Fargate / Anywhere により、
- 従来のIaaS
- サーバレスコンテナ
- ハイブリッド・エッジ
までを一つのコントロールプレーンで扱える懐の広さを持ちます。
一方で、GKE / AKS / EKS のようなKubernetes世界、App Runner / Cloud Run / Container Apps のようなサーバレス世界も魅力的で、それぞれに強みがあります。大切なのは、
- 「運用をどこまで自分たちで握りたいか」
- 「どこまでベンダー依存を許容できるか」
- 「自分たちのチームが得意なのはどのレイヤーか」
を正直に見つめたうえで、ECSを含む“レイヤーの地図”を描いてから選ぶこと だと思います。
次に別のAWSサービスに進むときも、
「このサービスはGCPだと何に近い? Azureだと?」とマッピングしながら読んでいただくと、マルチクラウド時代でも通用する“共通の頭の使い方”がどんどん育っていきます。
今日のところは、ここまで読んでくださったご自身を、ぜひねぎらってあげてくださいね。ゆっくりお茶でも飲みながら、「うちのチームならどこまで抽象化したいかな?」と、ECSと他サービスの距離感をイメージしてみてください。
参考資料(タイトルのみ)
- Amazon Elastic Container Service とは
- Launch types and capacity providers in Amazon ECS
- Google Kubernetes Engine Overview / Product Page
- Azure Kubernetes Service (AKS) とは / Core concepts
- AWS App Runner とは
- Cloud Run documentation / Product Page
- Azure Container Apps overview / documentation
※具体的な料金や制限値、最新機能は必ず公式ドキュメント・料金ページをご確認ください。
