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

Azure Bicep部署VNet/子网报AnotherOperationInProgress错误排查

问题根因

部署随机失败、依赖看似不生效是两个典型问题叠加导致的:

  • 子网并行部署触发Azure网络资源提供程序的操作锁:使用for循环批量创建资源时,Bicep默认会并行启动所有循环实例的部署。但Azure的Microsoft.Network资源提供程序对同一虚拟网络下的所有子网写操作(创建/修改/删除)强制串行执行,同一时间仅允许一个操作运行。并行发起多个子网创建请求时,未抢到操作锁的请求会直接返回AnotherOperationInProgress错误,这也是部署结果随机的原因:请求时序刚好错开就成功,撞锁就失败,重试次数多了总有一次能撞上串行时序。
  • 跨模块依赖绑定强度不足:子网模块中通过existing关键字引用VNet时,仅传入了VNet名称字符串,没有直接关联VNet模块输出的资源实例。虽然手动添加了dependsOn: [vnetsym],但该配置仅保证VNet模块的部署作业标记为完成,没有绑定到VNet资源本身的最终可用状态,极端情况下VNet刚完成创建还在做状态同步时,子网请求就会被发出。此外三个文件中VNet、子网资源使用的API版本不一致,也会加剧状态同步的延迟问题。
修复方案

按以下步骤调整即可稳定部署:

  1. 给子网循环部署添加串行执行配置,强制Bicep一次只部署一个子网,等前一个子网完全创建成功后再启动下一个,从根源避免并行操作冲突。
  2. 调整跨模块传参逻辑,不再传递VNet名称字符串,改为直接传递VNet模块输出的资源ID,在子网模块中通过资源ID引用现有VNet,让Bicep自动建立强隐式依赖,无需手动配置dependsOn。
  3. 统一所有网络资源使用的API版本,避免不同版本间的资源状态判定不一致。

修改后的代码

vnet.bicep

统一API版本,新增资源ID输出:

param name string
param location string
param addressPrefixes array
param tags object

// 统一使用2021-08-01版本API,和子网资源版本对齐
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: name
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: addressPrefixes
    }
  }
  tags: tags
}

// 输出VNet资源ID供子网模块引用
output id string = virtualNetwork.id

subnet.bicep

调整入参为VNet资源ID,通过ID引用现有VNet:

param parentVnetId string
param name string
param addressPrefix string

// 传入资源ID引用现有VNet,Bicep会自动识别依赖关系
resource parentVnet 'Microsoft.Network/virtualNetworks@2021-08-01' existing = {
  name: last(split(parentVnetId, '/'))
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-08-01' = {
  name: name
  parent: parentVnet
  properties: {
    addressPrefix: addressPrefix
  }
}

根部署文件

调整子网模块传参,添加串行部署配置,移除冗余的手动依赖声明:

param location string = 'uksouth'

param vnet object = {
  name: 'vnet'
  addressPrefixes: [
    '10.0.0.0/16'
  ]
  subnets: [
    {
      name: 'subnet1'
      addressPrefix: '10.0.1.0/24'
    }
    {
      name: 'subnet2'
      addressPrefix: '10.0.2.0/24'
    }
  ]
}

targetScope = 'subscription'

resource rg 'Microsoft.Resources/resourceGroups@2021-01-01' = {
  name: 'rg'
  location: location
  tags: {}
}

module vnetsym 'modules/vnet.bicep' = {
  scope: rg
  name: vnet.name
  params: {
    name: vnet.name
    location: location
    addressPrefixes: vnet.addressPrefixes
    tags: {}
  }
}

module subnetsym 'modules/subnet.bicep' = [for subnet in vnet.subnets: {
  scope: rg
  name: subnet.name
  params: {
    name: subnet.name
    addressPrefix: subnet.addressPrefix
    // 直接引用VNet模块输出的资源ID,自动建立隐式依赖
    parentVnetId: vnetsym.outputs.id
  }
  // 强制单批次串行部署子网,避免并行操作撞锁
  batchSize: 1
}]

补充说明:后续如果要给子网关联NSG、路由表,或者做其他子网修改操作,只要操作对象属于同一个VNet,都建议保持串行部署,或者通过dependsOn显式指定操作顺序,避免触发网络资源提供程序的操作锁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:18:15