如何在Bicep中输出资源ID 创建子网时如何获取对应输出字符串
Bicep内嵌子网场景下输出子网ID的方法
推荐方案:直接引用VNet资源属性
Bicep中已经定义的VNet资源会自动解析所有内嵌子网的属性,你可以直接通过virtualNetwork.properties.subnets数组获取每个子网的ID,不需要手动拼接,天然带依赖校验不会出错,也不用额外记忆资源类型拼写。
示例1:按下标输出指定子网ID
如果你的子网顺序固定,可以直接通过数组下标取值:
// 输出第一个子网subnetpoc-1的ID output subnetpoc1Id string = virtualNetwork.properties.subnets[0].id // 输出第二个子网subnetnetpoc-2的ID output subnetpoc2Id string = virtualNetwork.properties.subnets[1].id
示例2:按子网名匹配输出ID
如果担心后续子网顺序调整导致下标失效,可以用filter函数按名字匹配,适配性更强:
// 按名称匹配获取子网ID,不受数组顺序影响 output subnetpoc1Id string = filter(virtualNetwork.properties.subnets, subnet => subnet.name == 'subnetpoc-1')[0].id
备选方案:用resourceId函数手动生成
如果你需要脱离现有VNet资源引用来生成ID,可以用内置的resourceId函数拼接:
// 格式:resourceId('资源类型', VNet名称, 子网名称) output subnetpoc1Id string = resourceId('Microsoft.Network/virtualNetworks/subnets', virtualNetwork.name, 'subnetpoc-1')
完整可运行示例
param vnetName string = 'vnet-poc' resource virtualNetwork 'Microsoft.Network/virtualNetworks@2019-11-01' = { name: vnetName location: resourceGroup().location properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } subnets: [ { name: 'subnetpoc-1' properties: { addressPrefix: '10.0.3.0/24' } } { name: 'subnetnetpoc-2' properties: { addressPrefix: '10.0.4.0/24' } } ] } } // 按名称匹配输出子网ID output subnetpoc1Id string = filter(virtualNetwork.properties.subnets, s => s.name == 'subnetpoc-1')[0].id output subnetpoc2Id string = filter(virtualNetwork.properties.subnets, s => s.name == 'subnetnetpoc-2')[0].id // 输出所有子网的ID数组 output allSubnetIds array = [for s in virtualNetwork.properties.subnets: s.id]
内容的提问来源于stack exchange,提问作者cloudcop
相关产品推荐
相关产品推荐

