ECS / Fargate — マネージドコンテナ

概要

Amazon ECS (Elastic Container Service) は AWS のコンテナオーケストレーションサービス。 Docker コンテナを「Task」という単位で実行・管理してくれます。 実行環境は 2 種類: EC2 起動タイプ(自分で EC2 を持つ)と Fargate 起動タイプ(サーバ管理不要のサーバレスコンテナ)。

Fargate はコンテナ用の「ノード管理しない実行基盤」で、Lambda の制約(15 分・10GB)を超える長時間 / 大容量処理にも対応。 Lambda → Fargate → EKS の順で運用負荷が上がります。 用途と規模で適切な選択をするのが現代的な AWS の作法です。

主な機能

EKS との比較

観点ECS / FargateEKS
APIAWS 独自Kubernetes 標準
学習コスト低 (AWS の他サービスと同じ)高 (Kubernetes 全体)
クロスクラウド可搬性無し高い
Control Plane 料金無料$73/月 (固定)
OSS エコシステム限定的豊富 (Helm, Argo, Istio 等)
マイクロサービス向き○ (中規模まで)◎ (大規模 + 複雑)

迷ったら ECS Fargate を第一候補。Kubernetes 必須案件 / 既存知識を活かしたい場合に 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
マイクロサービス間の通信制御を提供する機能。