Bicep 模块输出错误的资源 ID
Bicep module outputs wrong resource id
我有订阅范围的二头肌部署,包括一些为资源组创建内容的模块。在一个模块中,我创建了 VNET 并尝试取回其资源 ID output vnetId string = vnet.id
,在另一个模块中我想使用该值,并且我已正确设置 dependsOn。但是有问题,似乎输出 ID 不包含资源组部分 /subscriptions/<subs>/providers/Microsoft.Network/virtualNetworks/vnet-weu/subnets/portal
它与使用订阅级部署有关系吗? (az deployment sub create ...
)
UPDATE:我刚找到这个remark,它确实解释了缺少的资源组部分,但没有解释为什么 vnet.id
in module with targetScope = 'resourceGroup'
returns 订阅资源 ID 而不是“完整”资源 ID。
更新 - 代码
network.bicep
targetScope = 'resourceGroup'
param vnetName string
param location string = resourceGroup().location
resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' = {
name: vnetName
location: location
...
}
output vnetId string = vnet.id
main.bicep
targetScope = 'subscription'
module networkRgResources 'network.bicep' = {
name: 'networkRgResources'
scope: resourceGroup(networkRg.name)
params: {
location: location
vnetName: vnetName
}
}
module sharedRgResources 'shared.bicep' = {
name: 'sharedRgResources'
scope: resourceGroup(sharedRg.name)
params: {
vnetId: networkRgResources.outputs.vnetId
}
dependsOn: [
networkRgResources
]
}
在共享模块中,vnetId 没有资源组
更新 2
我无法模拟这个,但我的代码中似乎有一些奇怪的竞争条件,现在它似乎工作正常。
• 使用“resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks', vnetName)”可能是一种解决方案。如果你想尝试不同的方法,那么你可以使用类似下面的方法:-
Vnetdeploy.bicep
targetScope = 'subscription'
resource rg 'Microsoft.Resources/resourceGroups@2021-01-01' existing = {
name: 'xxxxx-xxxxxx'
}
module vnet './vnet.bicep' = {
name: 'vnetdeployment'
scope: rg
params: {
vnetname: 'vnet2'
}
}
output vnetID string = vnet.outputs.virtualNetworkID
vnet.bicep。即 VNET 模块
param vnetname string
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-08-01' = {
name: vnetname
location: 'EastUS'
properties: {
addressSpace: {
addressPrefixes: [
'10.0.2.0/24'
]
}
subnets: [
{
name: 'subnet1'
properties: {
addressPrefix: '10.0.2.0/27'
}
}
]
}
}
output virtualNetworkID string = virtualNetwork.id
输出:-
我有订阅范围的二头肌部署,包括一些为资源组创建内容的模块。在一个模块中,我创建了 VNET 并尝试取回其资源 ID output vnetId string = vnet.id
,在另一个模块中我想使用该值,并且我已正确设置 dependsOn。但是有问题,似乎输出 ID 不包含资源组部分 /subscriptions/<subs>/providers/Microsoft.Network/virtualNetworks/vnet-weu/subnets/portal
它与使用订阅级部署有关系吗? (az deployment sub create ...
)
UPDATE:我刚找到这个remark,它确实解释了缺少的资源组部分,但没有解释为什么 vnet.id
in module with targetScope = 'resourceGroup'
returns 订阅资源 ID 而不是“完整”资源 ID。
更新 - 代码
network.bicep
targetScope = 'resourceGroup'
param vnetName string
param location string = resourceGroup().location
resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' = {
name: vnetName
location: location
...
}
output vnetId string = vnet.id
main.bicep
targetScope = 'subscription'
module networkRgResources 'network.bicep' = {
name: 'networkRgResources'
scope: resourceGroup(networkRg.name)
params: {
location: location
vnetName: vnetName
}
}
module sharedRgResources 'shared.bicep' = {
name: 'sharedRgResources'
scope: resourceGroup(sharedRg.name)
params: {
vnetId: networkRgResources.outputs.vnetId
}
dependsOn: [
networkRgResources
]
}
在共享模块中,vnetId 没有资源组
更新 2 我无法模拟这个,但我的代码中似乎有一些奇怪的竞争条件,现在它似乎工作正常。
• 使用“resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks', vnetName)”可能是一种解决方案。如果你想尝试不同的方法,那么你可以使用类似下面的方法:-
Vnetdeploy.bicep
targetScope = 'subscription'
resource rg 'Microsoft.Resources/resourceGroups@2021-01-01' existing = {
name: 'xxxxx-xxxxxx'
}
module vnet './vnet.bicep' = {
name: 'vnetdeployment'
scope: rg
params: {
vnetname: 'vnet2'
}
}
output vnetID string = vnet.outputs.virtualNetworkID
vnet.bicep。即 VNET 模块
param vnetname string
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-08-01' = {
name: vnetname
location: 'EastUS'
properties: {
addressSpace: {
addressPrefixes: [
'10.0.2.0/24'
]
}
subnets: [
{
name: 'subnet1'
properties: {
addressPrefix: '10.0.2.0/27'
}
}
]
}
}
output virtualNetworkID string = virtualNetwork.id
输出:-