0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

方法

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

マネジメントコンソールなどでカスタムドメイン名の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のカスタムドメインの対応はまだ新しい機能なので色々なところに齟齬があるのかと思います。
将来的には解消されるかと思いますが、現状の参考にしてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?