AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Terraform で CapacityProvider を指定した時に参照される順序

なんのこっちゃ

という話だけど、以下のようなパターン。

  • aws_ecs_cluster_capacity_providers で (aws_ecs_service の) cluster_name を指定して default_capacity_provider_strategy を記述する場合
  • aws_ecs_service 内で capacity_provider_strategy でそれぞれ FARGATE, FARGATE_SPOT 設定を記述する場合

どうなる

この場合、おおむねこのようになるはず。

設定場所 目的 優先順位 備考
aws_ecs_cluster_capacity_providers ECS クラスタ全体の デフォルト設定 デフォルト クラスタに属するサービスが capacity_provider_strategy を指定しない場合に適用される
aws_ecs_servicecapacity_provider_strategy ECS サービス単位の 明示的な設定 最優先
(aws_ecs_cluster_capacity_providers で上書き可能
個別サービスごとに FARGATE_SPOTFARGATE の比率を細かく制御する

具体的な使い分けは以下。

ECS クラスタ全体で FARGATE_SPOT のみ使いたい場合

resource "aws_ecs_cluster_capacity_providers" "ecs_capacity_providers" {
  cluster_name = aws_ecs_cluster.ecs.name

  capacity_providers = [ "FARGATE", "FARGATE_SPOT" ]

  default_capacity_provider_strategy {
    capacity_provider = "FARGATE"
    weight            = 0
    base              = 0
  }

  default_capacity_provider_strategy {
    capacity_provider = "FARGATE_SPOT"
    weight            = 1
    base              = 1
  }
}

ECS サービス個別で変えたい場合

このようにすると、ECS クラスタのデフォルト設定を無視して、FARGATE が起動する。

resource "aws_ecs_service" "example" {
  name            = "example-service"
  cluster         = aws_ecs_cluster.ecs.name
  task_definition = aws_ecs_task_definition.example.arn
  desired_count   = 1

  capacity_provider_strategy {
    capacity_provider = "FARGATE"
    weight            = 1
    base              = 1
  }

  network_configuration {
    subnets          = [aws_subnet.public.id]
    security_groups  = [aws_security_group.ecs.id]
    assign_public_ip = true
  }
}

となるはず

ちょうどコスト最適化で構成を圧縮していて自分の整理を兼ねて書いているので、嘘だったらあとで修正します。

ちなみに aws_ecs_service に launch_type というオプションがあって、 capacity_provider_strategy を書いていない場合はこれを明示する必要があります。 launch_type = "FARGATE" のように。

ただし、 capacity_provider_strategy と launch_type はお互いに conflict するとのことで、上記のようにキャパシティプロバイダ関連の記述を予防的にでも実施する場合は launch_type は書かなくて大丈夫です。 (というかそのように作っておいた方が SPOT 柔軟に設定できるし、最初からそのようにしたほうが具合よさそう。)

registry.terraform.io