terraform-provider-aws v3.74.0 以降で "aws_ecs_cluster" の "capacity_providers", "default_capacity_provider_strategy" を定義する場合は "aws_ecs_cluster_capacity_providers" を利用しましょう


## はじめに

Terraform AWS provider (terraform-provider-aws) の更新を日々行えていますでしょうか
Terraform AWS provider v4.0.0 時点で deprecated の定義が追加された "aws_ecs_cluster" の "capacity_providers" 等の定義を置き換えるために必要な情報をまとめました

## Terraform AWS provider について

本記事では、 Terraform AWS provider の説明は省略します README や Docs を参照してください

https://github.com/hashicorp/terraform-provider-aws

https://registry.terraform.io/providers/hashicorp/aws/latest/docs

## Resource `aws_ecs_cluster_capacity_providers` について

Resource `aws_ecs_cluster_capacity_providers` は v3.74.0 で追加されました。

https://github.com/hashicorp/terraform-provider-aws/pull/22672

その後、 `aws_ecs_cluster` の `capacity_providers` や `default_capacity_provider_strategy` を使用すると、意図しない依存関係が作られてしまい、リソースの削除などが実施出来ない等が明らかになり、 resource `aws_ecs_cluster_capacity_providers` を使用するよう v4.0.0 で warning を出力する定義が追加されました

https://github.com/hashicorp/terraform-provider-aws/issues/22754

https://github.com/hashicorp/terraform-provider-aws/pull/22783

そのため、 v4.0.0 に更新した後、 `terraform apply` 等を実行すると以下のような warning が出力されるようになりました

```sh
╷
│ Warning: Argument is deprecated
│
│   with aws_ecs_cluster.resource_name,
│   on aws_ecs_cluster.tf line 1, in resource "aws_ecs_cluster" "resource_name":
│    1: resource "aws_ecs_cluster" "resource_name" {
│
│ Use the aws_ecs_cluster_capacity_providers resource instead
│
```

## 解決方法について

`CHANGELOG.md` にも記載されている通り、 `aws_ecs_cluster_capacity_providers` を使うように修正する必要があります

> resource/aws_ecs_cluster: The `capacity_providers` and `default_capacity_provider_strategy` arguments have been deprecated. Use the `aws_ecs_cluster_capacity_providers` resource instead. ([#22783](https://github.com/hashicorp/terraform-provider-aws/issues/22783))

https://github.com/hashicorp/terraform-provider-aws/blob/main/CHANGELOG.md#400-february-10-2022

v3.74.0 以前では、 以下のように定義していました

```tf
resource "aws_ecs_cluster" "example" {
  name               = "example"
  capacity_providers = [aws_ecs_capacity_provider.example.name]

  default_capacity_provider_strategy {
    base              = 1
    weight            = 100
    capacity_provider = aws_ecs_capacity_provider.example.name
  }
}

resource "aws_ecs_capacity_provider" "example" {
  name = "example"

  auto_scaling_group_provider {
    auto_scaling_group_arn = aws_autoscaling_group.example.arn
  }
}

# aws_autoscaling_group の定義は省略...
```

https://registry.terraform.io/providers/hashicorp/aws/3.73.0/docs/resources/ecs_cluster

https://registry.terraform.io/providers/hashicorp/aws/3.73.0/docs/resources/ecs_capacity_provider

しかし、非推奨となった今は、 `aws_ecs_cluster_capacity_providers` を利用し以下のように定義する必要があります

```tf
resource "aws_ecs_cluster" "example" {
  name = "example"
}

resource "aws_ecs_cluster_capacity_providers" "example" {
  cluster_name       = aws_ecs_cluster.example.name
  capacity_providers = [aws_ecs_capacity_provider.example.name]

  default_capacity_provider_strategy {
    base              = 1
    weight            = 100
    capacity_provider = aws_ecs_capacity_provider.example.name
  }
}

resource "aws_ecs_capacity_provider" "example" {
  name = "example"

  auto_scaling_group_provider {
    auto_scaling_group_arn = aws_autoscaling_group.example.arn
  }
}

# aws_autoscaling_group の定義は省略...
```

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_cluster#example-with-capacity-providers

## Reference

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_cluster

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_capacity_provider

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_cluster_capacity_providers

https://github.com/hashicorp/terraform-provider-aws/blob/main/CHANGELOG.md#400-february-10-2022

https://github.com/hashicorp/terraform-provider-aws/pull/22783