如何配置Terraform资源创建销毁顺序?Azure CDN场景示例
Terraform 资源执行顺序配置方案
可以通过Terraform的显式依赖声明和生命周期(lifecycle)配置组合实现你需求的执行顺序,以下针对Azure CDN自定义域名与CNAME记录的场景给出具体实现方案:
核心配置逻辑
- 创建顺序:通过
depends_on让资源B(CDN自定义域名)依赖资源A(CNAME记录),确保A先创建完成后再启动B的创建流程。 - 销毁顺序:默认依赖关系会导致销毁顺序为B→A,要反转顺序,需借助中间触发资源(如
null_resource)调整销毁优先级,确保A先于B销毁。 - 替换顺序:禁用
create_before_destroy(默认状态)并严格绑定依赖关系,让Terraform在替换时先销毁旧的A和B,再创建新实例。
具体配置示例
# 资源A:CNAME记录 resource "azurerm_dns_cname_record" "cdn_custom" { name = "cdn" zone_name = azurerm_dns_zone.example.name resource_group_name = azurerm_resource_group.example.name ttl = 300 record = azurerm_cdn_endpoint.example.hostname lifecycle { # 禁用先建后删,保证替换时先销毁旧实例再创建新实例 create_before_destroy = false } # 依赖中间触发资源,确保销毁时A先于B被删除 depends_on = [null_resource.destroy_trigger] } # 中间触发资源:调整销毁顺序的核心 resource "null_resource" "destroy_trigger" { # 依赖CDN自定义域名,确保销毁流程先处理A,再触发此资源,最后销毁B depends_on = [azurerm_cdn_custom_domain.example] provisioner "local-exec" { when = destroy command = "echo 'CNAME cleanup triggered before CDN domain destruction'" } } # 资源B:CDN自定义域名 resource "azurerm_cdn_custom_domain" "example" { name = "cdn-custom-domain" cdn_endpoint_id = azurerm_cdn_endpoint.example.id host_name = "cdn.${azurerm_dns_zone.example.name}" # 显式依赖CNAME记录,确保创建时A已存在 depends_on = [azurerm_dns_cname_record.cdn_custom] lifecycle { create_before_destroy = false } }
执行顺序验证
- 创建:Terraform会先创建
azurerm_dns_cname_record.cdn_custom,再创建azurerm_cdn_custom_domain.example,最后创建null_resource.destroy_trigger,满足A→B的创建顺序。 - 销毁:销毁时会先删除
azurerm_dns_cname_record.cdn_custom,再执行中间资源的销毁脚本,最后删除azurerm_cdn_custom_domain.example,实现A→B的销毁顺序。 - 替换:当配置变更触发资源替换时,Terraform会按「删除旧A→删除旧B→创建新A→创建新B」的链式顺序执行,完全匹配需求。
注意事项
- 避免配置循环依赖,确保所有依赖关系为单向绑定。
- 若CDN自定义域名启用了HTTPS证书,需额外配置证书资源的依赖顺序,避免销毁或替换时出现验证错误。
内容的提问来源于stack exchange,提问作者stena
相关产品推荐
相关产品推荐

