TerraformでプライベートAPI Gatewayのドメイン名アクセスの関連付け

# 方法
Terraformのawsプロバイダーには現状（バージョン5.81.0）ドメイン名アクセスの関連付けのためのリソースが用意されていないので aws_cloudcontrolapi_resource または awsccプロバイダーの awscc_apigateway_domain_name_access_association リソースを使いましょう。

```
resource "aws_cloudcontrolapi_resource" "aws_apigateway_domain_name_access_association" {
  type_name = "AWS::ApiGateway::DomainNameAccessAssociation"

  desired_state = jsonencode({
    AccessAssociationSource     = "vpce-00123456789abcdef"
    AccessAssociationSourceType = "VPCE"
    DomainNameArn               = "arn:aws:apigateway:ap-northeast-1:012345678901:/domainnames/api.example.com+abcdefghij"
    
    Tags = [
      {
        Key   = "environment"
        Value = "dev"
      }
    ]
  })
}
```
```
resource "awscc_apigateway_domain_name_access_association" "custom_domain" {
  access_association_source      = "vpce-00123456789abcdef"
  access_association_source_type = "VPCE"
  domain_name_arn                = "arn:aws:apigateway:ap-northeast-1:012345678901:/domainnames/api.example.com+abcdefghij"

  tags = [
    {
      key   = "environment"
      value = "dev"
    }
  ]
}
```

# ドメイン名アクセスの関連付けの際に Too Many Requests エラーになる場合
ドメイン名ARNが誤っています。Terraformのバージョンは1.8.2でした。
以下の様に aws_cloudcontrolapi_resource リソースの DomainNameArn に aws_api_gateway_domain_name リソースからの参照を設定した場合、設定されている値が正しくありません。

```
data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
locals {
  domain_name = "api.example.com"
}

# カスタムドメイン名
resource "aws_api_gateway_domain_name" "domain" {
  domain_name     = local.domain_name
  certificate_arn = "arn:aws:acm:ap-northeast-1:012345678901:certificate/00000000-aaaa-1234-bbbb-1234567890ab"
  security_policy = "TLS_1_2"

  endpoint_configuration {
    types = ["PRIVATE"]
  }

  policy = data.aws_iam_policy_document.custom_domain_resource_policy.json
}

# カスタムドメインのリソースポリシー
data "aws_iam_policy_document" "custom_domain_resource_policy" {
  # 省略
}

# ドメイン名アクセスの関連付け
resource "aws_cloudcontrolapi_resource" "aws_apigateway_domain_name_access_association" {
  type_name = "AWS::ApiGateway::DomainNameAccessAssociation"

  desired_state = jsonencode({
    AccessAssociationSource     = "vpce-00123456789abcdef"
    AccessAssociationSourceType = "VPCE"
    DomainNameArn               = aws_api_gateway_domain_name.domain.arn
    
    Tags = [
      {
        Key   = "environment"
        Value = "dev"
      }
    ]
  })
}

```

この場合、aws_api_gateway_domain_name.domain.arn に設定されている値は以下の様になっています。
```
arn:aws:apigateway:ap-northeast-1::/domainnames/api.example.com/abcdefghij
```
https://docs.aws.amazon.com/apigateway/latest/developerguide/arn-format-reference.html

マネジメントコンソールなどでカスタムドメイン名のARNを確認すると以下の様な値になっています。
```
arn:aws:apigateway:ap-northeast-1:012345678901:/domainnames/api.example.com+abcdefghij
```
* アカウントIDが含まれている
* ドメイン名とその後ろのランダムな文字列の区切りが / ではなく + 

そのため、補完や変換が必要になります。
私は雑に変換しました。

```
replace(aws_api_gateway_domain_name.domain.arn, "${data.aws_region.current.name}::/domainnames/${local.domain_name}/", "${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:/domainnames/${local.domain_name}+")
```


プライベートAPI Gatewayのカスタムドメインの対応はまだ新しい機能なので色々なところに齟齬があるのかと思います。
将来的には解消されるかと思いますが、現状の参考にしてください。