Terraform删除Azure DDOS保护计划报错,如何调整执行顺序?
解决Terraform删除Azure非生产环境DDOS保护计划的执行顺序问题
问题根源
Terraform默认执行顺序中,会优先尝试销毁azurerm_network_ddos_protection_plan资源,但此时关联的虚拟网络仍未解除DDOS保护配置,触发Azure API报错InUseDdosProtectionPlanCannotBeDeleted。
解决方案
方案1:分阶段执行(最直接可靠)
分两次执行Terraform命令,先解除VNet与DDOS计划的关联,再销毁DDOS计划:
- 第一步:单独更新虚拟网络,解除DDOS关联
修改虚拟网络资源配置,将enable_ddos_protection设为false,并将ddos_protection_plan_id设为null。执行以下命令单独更新VNet:
此步骤仅更新VNet,禁用DDOS保护并解除关联,不会触发DDOS计划的销毁。terraform apply -target=azurerm_virtual_network.your_non_prod_vnet - 第二步:完整执行销毁操作
执行常规的terraform apply命令,此时DDOS计划已无关联资源,可正常销毁。
方案2:通过资源配置调整强制执行顺序(适合自动化场景)
若需单次apply完成操作,需调整资源依赖并打破循环:
- 修改虚拟网络配置:移除所有关联DDOS计划的逻辑,明确禁用DDOS保护:
resource "azurerm_virtual_network" "non_prod_vnet" { name = "non-prod-vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.non_prod_rg.location resource_group_name = azurerm_resource_group.non_prod_rg.name enable_ddos_protection = false ddos_protection_plan_id = null # 清空关联ID } - 为DDOS计划添加依赖控制:在DDOS计划资源块中添加
depends_on,确保等待VNet更新完成后再销毁,同时移除VNet对DDOS计划的所有引用(避免循环依赖):resource "azurerm_network_ddos_protection_plan" "non_prod_ddos" { name = "non-prod-ddos-plan" location = azurerm_resource_group.non_prod_rg.location resource_group_name = azurerm_resource_group.non_prod_rg.name depends_on = [azurerm_virtual_network.non_prod_vnet] lifecycle { prevent_destroy = false } }
关键注意事项
- Terraform 0.13.7与AzureRM Provider 3.13.0的组合中,销毁顺序默认与创建顺序相反,直接添加
depends_on易引发循环依赖,必须先解除VNet对DDOS计划的引用。 - 分阶段执行无需调整复杂依赖,更适合临时清理操作;方案2需确保VNet配置完全脱离对DDOS计划的依赖,适合集成到自动化流水线中。
内容的提问来源于stack exchange,提问作者Maki
相关产品推荐
相关产品推荐

