なんのこっちゃ
という話だけど、以下のようなパターン。
- 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_service の capacity_provider_strategy |
ECS サービス単位の 明示的な設定 | 最優先 (aws_ecs_cluster_capacity_providers で上書き可能 |
個別サービスごとに FARGATE_SPOT や FARGATE の比率を細かく制御する |
具体的な使い分けは以下。
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 柔軟に設定できるし、最初からそのようにしたほうが具合よさそう。)