You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中修改AWS自定义域名endpoint_configuration的实现问题

问题解答

核心功能可行性

完全可行。虽然AWS不允许原地更新aws_api_gateway_domain_name的endpoint_configuration属性,但可以通过条件化资源定义+分阶段执行Terraform操作实现端点类型的切换。

具体解决方案

1. 双资源结构+分两步执行切换

你定义的双资源(edge/regional)逻辑是正确的,但Terraform默认并行处理资源操作,导致新资源创建时旧资源未完成销毁,触发域名冲突。解决方法是拆分执行步骤:

  • 第一步:销毁旧类型域名资源
    修改domain_type变量为目标类型后,先执行命令销毁旧资源:
    # 示例:从REGIONAL切换到EDGE时,先销毁regional资源
    terraform apply -destroy-target=module.example_api.aws_api_gateway_domain_name.regional_custom_domain
    
  • 第二步:创建新类型域名资源
    旧资源销毁完成后,执行常规terraform apply即可正常创建新资源。

2. 自动化执行顺序(进阶)

如果想避免手动分步骤,可以借助null_resource和local-exec强制控制销毁顺序(需注意权限与状态一致性):

resource "null_resource" "destroy_old_domain" {
  count = local.domain_type == "EDGE" ? length(aws_api_gateway_domain_name.regional_custom_domain) : length(aws_api_gateway_domain_name.edge_custom_domain)

  provisioner "local-exec" {
    command = <<EOT
      terraform destroy -target=${local.domain_type == "EDGE" ? "aws_api_gateway_domain_name.regional_custom_domain" : "aws_api_gateway_domain_name.edge_custom_domain"} -auto-approve
    EOT
  }

  triggers = {
    domain_type = local.domain_type
  }
}

resource "aws_api_gateway_domain_name" "edge_custom_domain" {
  count           = local.create_domain && local.domain_type == "EDGE" ? 1 : 0
  domain_name     = local.custom_domain
  certificate_arn = aws_acm_certificate.edge_domain_cert[0].arn

  endpoint_configuration {
    types = ["EDGE"]
  }

  security_policy = "TLS_1_2"

  depends_on = [
    aws_acm_certificate.edge_domain_cert,
    aws_route53_record.cert_validation_record,
    null_resource.destroy_old_domain,
  ]
}

resource "aws_api_gateway_domain_name" "regional_custom_domain" {
  count           = local.create_domain && local.domain_type == "REGIONAL" ? 1 : 0
  domain_name     = local.custom_domain
  regional_certificate_arn = aws_acm_certificate.regional_domain_cert[0].arn

  endpoint_configuration {
    types = ["REGIONAL"]
  }

  security_policy = "TLS_1_2"

  depends_on = [
    aws_acm_certificate.regional_domain_cert,
    aws_route53_record.cert_validation_record,
    null_resource.destroy_old_domain,
  ]
}

该方案会在类型切换时,先通过local-exec销毁旧资源,再创建新资源。

附加问题解答

1. 能否让两个域名资源互相depends_on?

不能直接设置互相依赖,这会触发循环依赖错误,Terraform无法解析这种关系。上述null_resource方案是间接实现“等待旧资源销毁”的替代方式。

2. 有没有Terraform风格的endpoint_configuration更新方式?

没有。因为AWS API Gateway本身不支持修改域名的端点类型,Terraform也无法突破这个限制实现原地更新,必须通过销毁旧资源、创建新资源的方式完成切换。AWS文档建议的“先创建新配置再删除旧配置”在Terraform中无法自动实现——同一个域名不能同时存在两个API Gateway域名资源,必须先销毁旧的才能创建新的。

内容的提问来源于stack exchange,提问作者Callum Evans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:50:16