Azure BICEP部署虚拟网络时如何保留已存在的独立创建子网
Bicep部署虚拟网络不删除外部创建子网的解决方法
你遇到的问题是Bicep部署虚拟网络时的默认行为导致的:如果在virtualNetwork.main.bicep的VNet资源属性中显式定义了subnets数组,Azure会将这个数组作为该VNet下子网的全量期望状态,部署时会自动删除所有不在这个数组里的子网资源。
解决方法
方法1:主VNet模板中不声明subnets属性(最推荐)
这是实现VNet全局管控和子网独立创建的最优方案,你只需要在主VNet模板中定义VNet的核心全局配置,完全省略subnets字段即可,此时部署VNet不会对子网生命周期做任何管控,自然不会删除外部创建的子网。
示例virtualNetwork.main.bicep代码:
param location string = resourceGroup().location param vnetAddressPrefix string = '10.0.0.0/16' resource mainVnet 'Microsoft.Network/virtualNetworks@2023-09-01' = { name: 'global-main-vnet' location: location properties: { addressSpace: { addressPrefixes: [ vnetAddressPrefix ] } // 全局管控配置,例如DNS、DDos保护、加密等,完全不写subnets属性 dhcpOptions: { dnsServers: [ '10.0.0.10', '10.0.0.11' ] } enableDdosProtection: false } } // 输出VNet信息供子网部署模板引用 output vnetId string = mainVnet.id output vnetName string = mainVnet.name
独立子网部署模板subnet.main.bicep示例:
param location string = resourceGroup().location param vnetName string param subnetName string = 'business-app-subnet' param subnetAddressPrefix string = '10.0.1.0/24' // 引用已存在的主VNet resource mainVnet 'Microsoft.Network/virtualNetworks@2023-09-01' existing = { name: vnetName } // 独立创建子网,作为VNet的子资源 resource appSubnet 'Microsoft.Network/virtualNetworks/subnets@2023-09-01' = { parent: mainVnet name: subnetName properties: { addressPrefix: subnetAddressPrefix // 可自定义NSG、路由表、服务端点等配置 } }
方法2:主模板单独声明需管控的核心子网
如果需要在主VNet模板中部署部分必须全局管控的子网(例如网关子网、防火墙子网),不要把这些子网配置放到VNet的subnets数组中,而是单独作为子资源声明,不会影响其他独立创建的子网。
在上述主VNet模板基础上补充网关子网声明的示例:
// 单独声明网关子网,不影响其他外部创建的子网 resource gatewaySubnet 'Microsoft.Network/virtualNetworks/subnets@2023-09-01' = { parent: mainVnet name: 'GatewaySubnet' properties: { addressPrefix: '10.0.255.0/24' } }
方法3:动态合并现有子网配置
如果必须在主VNet模板的subnets数组中声明配置,可在部署前通过Azure CLI/资源 Graph 读取当前VNet下已存在的所有子网配置,作为参数传入主模板,和你需要管控的子网数组合并后再赋值给subnets属性,即可避免删除已有子网。
注意事项
- 部署时必须使用增量部署模式,不要使用完整部署模式,完整部署模式会删除资源组内所有未在模板中声明的资源
- 不要在VNet资源的
properties中显式定义空的subnets数组,空数组会被识别为期望该VNet下无任何子网,同样会删除已有子网
内容的提问来源于stack exchange,提问作者user11455801
相关产品推荐
相关产品推荐

