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
相关产品推荐
相关产品推荐

