You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会判定为外部变更,属于常见的配置漂移场景。

解决方法

  1. 修改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]
  }
}
  1. 可选:如果不需要管理子网的服务端点、服务端点策略属性,可以在子网资源的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
    ]
  }
}
  1. 配置修改完成后执行一次terraform apply,更新状态文件中的VNet生命周期规则,后续执行计划就不会再出现子网删除的变更提示。

内容的提问来源于stack exchange,提问作者Morariu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:36:04