我在 RG1 中有一个现有的 vnet 和路由表。所有其他资源都在 RG2 中。
我正在创建一个子网二头肌,它将被称为模块,并且它必须与 vnet 和路由表关联。
子网二头肌
//parameters
//variables
resource vnetRef 'Microsoft.Network/virtualNetworks@2023-09-01' = {
name: vnetId
}
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-09-01' = {
name: subnetName
parent: vnetRef
properties: {
addressPrefix: subnetPrefix
routeTable: {
id: routeTableId
}
}
}
output subnetId string = subnet.id
主要二头肌
resource vnet 'Microsoft.Network/virtualNetworks@2023-09-01' existing = {
name: '${appAcronym}-${subscriptionName}-vnet'
scope: resourceGroup(sharedScopeRG)
}
resource routeTable 'Microsoft.Network/routeTables@2023-09-01' existing = {
name: routeTableName
scope: resourceGroup(sharedScopeRG)
}
module subnetModule '../AnotherRepo/subnet.bicep' = {
name: 'subnetModule'
scope: resourceGroup(rgName)
params: {
name: subnetName
subnetPrefix: subnetAddressSpace
vnetId: vnet.id
routeTableId: routeTable.id
//other params for subnet bicep
}
}
失败,并显示“Microsoft.Network/virtualNetworks”类型的模板资源“/subscriptions/subid/resourceGroups/RG1/providers/Microsoft.Network/virtualNetworks/myVnet”在“1”行和“1739”列的段长度不正确。嵌套资源类型的段数必须与其资源名称相同。根资源类型的段长度必须比其资源名称大一。请参阅 https://aka.ms/arm-syntax-resources 了解使用详情。'.
然后,我在调用子网 bicep 时传递了 vnet.name 而不是 vnet.id,然后收到以下错误:策略不允许资源“myVnet”。错误类型:PolicyViolation,策略定义名称:允许的位置,策略分配名称:.
这意味着在调用子网模块时它正在尝试创建 vnet。我尝试了多种推荐方式,但都没有成功。
首先,您应该在 vnet 资源内部署子网。 否则,如果重新运行 vnet 模块,则 vnet 模块中未定义的现有子网将被销毁(请参阅相关帖子)。
在子网模块中,您需要使用
existing
关键字来引用现有的 vnet:
// subnet.bicep
param vnetName string
param subnetName string
param subnetPrefix string
param routeTableId string
resource vnetRef 'Microsoft.Network/virtualNetworks@2023-09-01' existing = {
name: vnetName
}
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-09-01' = {
parent: vnetRef
name: subnetName
properties: {
addressPrefix: subnetPrefix
routeTable: {
id: routeTableId
}
}
}
output subnetId string = subnet.id
从主文件调用子网模块时,该模块的范围必须是 vnet 资源组的范围:
param appAcronym string
param subscriptionName string
param sharedScopeRG string
param routeTableName string
param subnetName string
param subnetAddressSpace string
resource vnet 'Microsoft.Network/virtualNetworks@2023-09-01' existing = {
name: '${appAcronym}-${subscriptionName}-vnet'
scope: resourceGroup(sharedScopeRG)
}
resource routeTable 'Microsoft.Network/routeTables@2023-09-01' existing = {
name: routeTableName
scope: resourceGroup(sharedScopeRG)
}
module subnetModule 'subnet.bicep' = {
name: 'subnetModule'
scope: resourceGroup(sharedScopeRG) // scope should be the scope of the vnet resource group
params: {
subnetName: subnetName
vnetName: vnet.name
subnetPrefix: subnetAddressSpace
routeTableId: routeTable.id
}
}
resource vnet 'Microsoft.Network/virtualNetworks@2023-09-01' existing = {
name: '${appAcronym}-${subscriptionName}-vnet'
scope: resourceGroup(myRG)
}
module subnetModule '/subnet.bicep' = {
name: '${prefixRName}-snetModule'
scope: resourceGroup(myRG)
params: {
name:
subnetPrefix:
vnetName: vnet.name
}
}
param name string
param vnetName string
var subnetName = '${vnetName}/${name}'
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-09-01' = {
name: subnetName
properties: {
addressPrefix: //param for address
}
}
output subnetId string = subnet.id