ECS / Fargate — マネージドコンテナ
概要
Amazon ECS (Elastic Container Service) は AWS のコンテナオーケストレーションサービス。 Docker コンテナを「Task」という単位で実行・管理してくれます。 実行環境は 2 種類: EC2 起動タイプ(自分で EC2 を持つ)と Fargate 起動タイプ(サーバ管理不要のサーバレスコンテナ)。
Fargate はコンテナ用の「ノード管理しない実行基盤」で、Lambda の制約(15 分・10GB)を超える長時間 / 大容量処理にも対応。 Lambda → Fargate → EKS の順で運用負荷が上がります。 用途と規模で適切な選択をするのが現代的な AWS の作法です。
主な機能
- Cluster — Task の論理的なグループ。1 つのアカウントに複数作れる。
- Task Definition — Docker image / CPU / メモリ / 環境変数 / IAM Role / ロギング設定の定義。バージョン管理あり。
- Task — Task Definition から起動した実行インスタンス。Lambda の関数呼び出し相当。
- Service — 「Task を常に N 個動かす」管理単位。ALB / NLB と連携、Auto Scaling 可能。
- Fargate — サーバレス実行モード。CPU / メモリを指定すれば AWS が裏で実行。
- Capacity Provider — Fargate / Fargate Spot / EC2 を混在させて起動先を選択。
- ECR (Elastic Container Registry) — Docker image の AWS 公式リジストリ。ECS と統合。
- App Mesh / Service Connect — マイクロサービス間通信の制御。
EKS との比較
| 観点 | ECS / Fargate | EKS |
|---|---|---|
| API | AWS 独自 | Kubernetes 標準 |
| 学習コスト | 低 (AWS の他サービスと同じ) | 高 (Kubernetes 全体) |
| クロスクラウド可搬性 | 無し | 高い |
| Control Plane 料金 | 無料 | $73/月 (固定) |
| OSS エコシステム | 限定的 | 豊富 (Helm, Argo, Istio 等) |
| マイクロサービス向き | ○ (中規模まで) | ◎ (大規模 + 複雑) |
迷ったら ECS Fargate を第一候補。Kubernetes 必須案件 / 既存知識を活かしたい場合に EKS。
使うべきパターン
- Lambda 制約を超える処理 — 15 分超 / 10GB 超メモリ / 常駐デーモン。
- 既存 Docker 化されたアプリ — 複数言語 / レガシー / OSS をそのまま動かす。
- マイクロサービス(中規模) — Service Connect で内部通信、ALB で外部公開。
- バッチ処理 — Spot Fargate で安く動かす。
使わない方が良いパターン
- イベント駆動の小さい関数 — Lambda の方が安く運用も楽。
- 静的サイト配信 — S3 + CloudFront で 1 桁安い。
- コンテナ化されてない単発スクリプト — Lambda + Layer or Step Functions の方が早い。
- 大規模 K8s 既存資産あり — EKS の方が学習コスト無し。
Terraform 最小サンプル(Fargate Service)
resource "aws_ecs_cluster" "main" {
name = "myapp"
}
resource "aws_iam_role" "task_exec" {
name = "ecs-task-exec"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "ecs-tasks.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "task_exec" {
role = aws_iam_role.task_exec.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
resource "aws_ecs_task_definition" "web" {
family = "web"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = "256" # 0.25 vCPU
memory = "512" # 512 MB
execution_role_arn = aws_iam_role.task_exec.arn
container_definitions = jsonencode([{
name = "web"
image = "${var.ecr_repo}:latest"
portMappings = [{ containerPort = 80 }]
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = "/ecs/web"
awslogs-region = "ap-northeast-1"
awslogs-stream-prefix = "ecs"
}
}
}])
}
resource "aws_ecs_service" "web" {
name = "web"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.web.arn
desired_count = 2
launch_type = "FARGATE"
network_configuration {
subnets = var.private_subnet_ids
security_groups = [var.app_sg_id]
assign_public_ip = false
}
}
用語集
- Cluster
- ECS の Task をまとめる論理単位。アカウント内に複数作成可。
- Task Definition
- image / CPU / メモリ / 環境変数 / IAM Role の定義。バージョン管理されたテンプレ。
- Task
- Task Definition から起動された実行インスタンス。Lambda の関数呼び出し相当。
- Service
- 「Task を常に N 個動かす」管理単位。ALB / NLB と統合可能。
- Fargate
- サーバレスコンテナ実行環境。EC2 ノードを管理せずに Task を動かせる。
- Capacity Provider
- Fargate / Fargate Spot / EC2 の起動先を割り当てる仕組み。
- ECR
- Elastic Container Registry。AWS 公式の Docker registry。
- EKS
- AWS のマネージド Kubernetes。Control Plane $73/月、より複雑だが OSS エコシステムが豊富。
- App Mesh / Service Connect
- マイクロサービス間の通信制御を提供する機能。