BICEP部署虚拟网络按条件跳过NSG关联出现MissingJsonReferenceId错误如何解决
问题根因
该报错是因为当VNetSettings.subnets[j].unique == true时,你仍为子网的networkSecurityGroup属性传入了一个结构存在但id为空的对象。Azure资源管理器校验资源属性时,只要检测到networkSecurityGroup对象存在,就会要求其id字段必须填写有效值,哪怕你想表达不关联NSG也不能仅将id设为null。
修复方案
你需要调整条件判断的范围:不需要关联NSG时,直接把整个networkSecurityGroup属性设为null,而不是仅把属性下的id设为null,这样Azure资源管理器会直接忽略该属性,不会触发id校验。
同时你原有代码中混用BICEP语法和ARM模板表达式的写法也不规范,BICEP原生支持resourceId函数和字符串插值,不需要额外用json()包裹ARM表达式。
修改后的子网配置示例参考:
subnets: [for j in range(0, length(VNetSettings.subnets)): { name: VNetSettings.subnets[j].name properties: { addressPrefix: VNetSettings.subnets[j].addressPrefix // 其他子网属性... networkSecurityGroup: !VNetSettings.subnets[j].unique ? { id: resourceId('Microsoft.Network/networkSecurityGroups', 'nsg-snet-${vNetName}-${VNetSettings.subnets[j].name}') } : null } }]
如果你的NSG是在同一个BICEP文件中部署的,还可以直接引用NSG资源的id属性,比手动拼接resourceId更不容易出错。
内容的提问来源于stack exchange,提问作者user11455801
相关产品推荐
相关产品推荐

