引用共享父main.bicep的Bicep模块资源时遇ID属性不存在错误
问题原因
当跨资源组部署模块时,直接输出整个资源对象并传递到其他模块,Bicep会对资源对象进行序列化处理,丢失了id这类直接访问的属性,导致VNet模块中访问ddosProtectionPlan.id时触发属性不存在的错误。
解决方案
推荐采用直接输出资源ID的方式传递,这是最简洁且避免跨scope序列化问题的方案:
1. 修改 ddosProtectionPlan.bicep,输出资源ID而非整个对象
param name string resource ddosProtectionPlan 'Microsoft.Network/ddosProtectionPlans@2021-05-01' = { name: name location: resourceGroup().location } // 输出资源ID字符串,而非整个资源对象 output ddosProtectionPlanId string = ddosProtectionPlan.id
2. 修改 main.bicep,传递ID参数给VNet模块
module ddosProtectionPlanModule 'ddosProtectionPlan.bicep' = { name: 'de-ddos-qa-01' scope: resourceGroup('00000000-0000-0000-0000-000000000000','QA-01') params: { name: 'ddos-qa-01' } } module vnet 'vnet.bicep' = { name: 'VNet-dev-01' params: { // 传递ID而非整个对象 ddosProtectionPlanId: ddosProtectionPlanModule.outputs.ddosProtectionPlanId } }
3. 修改 vnet.bicep,接收ID参数并使用
param appTitle string = 'test' param environment string = 'Dev' // 将参数类型改为字符串ID param ddosProtectionPlanId string param vlanName string = '${appTitle}-vlan-${environment}-99' param location string = resourceGroup().location resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-11-01' = { name: vlanName location: location properties: { addressSpace: { addressPrefixes: [ '10.70.0.0/24' ] } enableDdosProtection: true ddosProtectionPlan: { // 直接使用传入的ID id: ddosProtectionPlanId } } } resource subnet_01 'Microsoft.Network/virtualNetworks/subnets@2023-11-01' = { parent: virtualNetwork name: 'default' properties: { addressPrefixes: [ '10.70.0.0/24' ] serviceEndpoints: [ { service: 'Microsoft.Storage' } { service: 'Microsoft.Sql' } ] } } output virtualNetworkObject object = virtualNetwork
备选方案(需传递多属性时)
如果需要传递DDoS防护计划的多个属性,可以在模块中输出自定义对象:
// ddosProtectionPlan.bicep 输出自定义对象 output ddosProtectionPlanDetails object = { id: ddosProtectionPlan.id name: ddosProtectionPlan.name location: ddosProtectionPlan.location }
之后在main.bicep传递该对象,vnet.bicep中通过ddosProtectionPlanDetails.id访问即可。
内容的提问来源于stack exchange,提问作者Curtis Gray
相关产品推荐
相关产品推荐

