Terraform无脚本变更执行apply提示外部变更且误删子网问题求助
问题根因
- 混用了两种Azure VNet子网的管理方式:在
azurerm_virtual_network资源中显式声明subnet = [],同时又使用独立的azurerm_subnet资源创建子网,两种配置存在冲突。
用独立资源创建子网后,Azure云侧会自动将子网信息同步到VNet的subnet属性中,而Terraform状态文件中VNet的subnet值是空数组,第二次执行计划时会判定为“资源在Terraform外部被修改”,进而执行覆盖操作清空VNet的子网列表,触发子网删除。 - 子网资源的
service_endpoint_policy_ids、service_endpoints属性未显式配置,Azure侧默认返回空数组,Terraform会判定为外部变更,属于常见的配置漂移场景。
解决方法
- 修改VNet资源定义,移除显式的
subnet = []配置,同时添加lifecycle配置块忽略subnet属性的变更,避免后续VNet配置更新时影响子网:
resource "azurerm_virtual_network" "vnet" { name = var.vnet_name resource_group_name = data.azurerm_resource_group.rg.name location = data.azurerm_resource_group.rg.location address_space = var.vnet_address_space dns_servers = var.dns_servers lifecycle { ignore_changes = [subnet] } }
- 可选:如果不需要管理子网的服务端点、服务端点策略属性,可以在子网资源的
lifecycle块中添加对应忽略规则,消除漂移提示:
resource "azurerm_subnet" "subnet" { name = var.subnet_name resource_group_name = var.resource_group_name virtual_network_name = var.vnet_name address_prefixes = var.subnet_address_space enforce_private_link_endpoint_network_policies = var.enforce_private_link_endpoint_network_policies lifecycle { ignore_changes = [ service_endpoint_policy_ids, service_endpoints ] } }
- 配置修改完成后执行一次
terraform apply,更新状态文件中的VNet生命周期规则,后续执行计划就不会再出现子网删除的变更提示。
内容的提问来源于stack exchange,提问作者Morariu
相关产品推荐
相关产品推荐

