Terraform无配置变更执行apply时误删Azure资源原因咨询
问题根因及解决方案
核心原因
- AzureRM Provider存在明确的使用限制:azurerm_virtual_network 资源内嵌的
subnet配置块,与独立的azurerm_subnet资源完全互斥,禁止混合使用。Provider会将VNet内嵌的subnet块作为该VNet下子网的唯一期望状态,所有未出现在内嵌块中的子网,即便单独定义了azurerm_subnet资源,都会被判定为非预期资源执行删除操作。 - 本次操作的触发逻辑:修改NSG后执行
terraform apply时,触发了全量资源的状态比对校验,Provider检测到当前VNet下关联的3个业务子网、1个Bastion子网均未在VNet内嵌的subnet块中声明,因此直接删除了所有非预期子网,仅保留了内嵌定义的GatewaySubnet,该结果与此前执行的taint操作无直接关联。 - 额外风险点:若两次apply之间
var.subnetcount变量值发生变更,也会导致基于count索引创建的子网、NSG资源出现偏移,触发批量删除/重建,但该问题并非本次故障的主因。
修复方案
- 推荐方案:删除
azurerm_virtual_network资源中所有内嵌的subnet块,包括GatewaySubnet,所有子网统一使用独立的azurerm_subnet资源定义。该方式灵活性更高,支持单独配置每个子网的关联规则、属性变更,符合AzureRM Provider的官方最佳实践。 - 备选方案:若需保留VNet内嵌
subnet块的写法,需将所有子网(3个业务子网、Bastion子网、GatewaySubnet)全部定义在VNet的subnet块中,完全弃用独立的azurerm_subnet资源。
内容的提问来源于stack exchange,提问作者Anshul Srivastava
相关产品推荐
相关产品推荐

