问题描述
我想在私有 DNS 区域 // string(14) "More Precise A"
// string(14) "More Precise B"
中为我的内部 API 管理实例以及 API 管理部署创建 DNS A 记录:
azure-api.net
但是在部署时会导致此错误:
var privateDnsZoneName = 'azure-api.net'
resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
name: privateDnsZoneName
location: 'Global'
}
resource privateDnsZoneEntry 'Microsoft.Network/privateDnsZones/A@2020-06-01' = {
name: apim.name
parent: privateDnsZone
properties: {
aRecords: [for addr in apim.properties.privateIPAddresses: {
ipv4Address: addr
}]
ttl: 3600
}
}
这个地方似乎不支持 Line |
57 | New-AzResourceGroupDeployment -ResourceGroupName $ResourceGroupName `
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 17:12:13 - Error: Code=InvalidTemplate; Message=Deployment template validation failed: 'The template resource
| '[format('{0}/{1}',variables('privateDnsZoneName'),parameters('apimName'))]' at line '221' and column '9' is not
| valid: The template function 'reference' is not expected at this location. Please see
| https://aka.ms/arm-template-expressions for usage details.. Please see https://aka.ms/arm-template-expressions for
| usage details.'.
函数(在 ARM 中):
reference()
尝试在两者之间使用变量会导致相同的错误 - 实际上生成了相同的 ARM JSON。
{
"type": "Microsoft.Network/privateDnsZones/A","apiVersion": "2020-06-01","name": "[format('{0}/{1}',parameters('apimName'))]","properties": {
"copy": [
{
"name": "aRecords","count": "[length(reference(resourceId('Microsoft.ApiManagement/service',parameters('apimName'))).privateIPAddresses)]","input": {
"ipv4Address": "[reference(resourceId('Microsoft.ApiManagement/service',parameters('apimName'))).privateIPAddresses[copyIndex('aRecords')]]"
}
}
],"ttl": 3600
},"dependsOn": [
"[resourceId('Microsoft.ApiManagement/service',"[resourceId('Microsoft.Network/privateDnsZones',variables('privateDnsZoneName'))]"
]
}
解决方法
我发现除了将私有 DNS 区域 + 记录创建拆分为 Bicep 模块并去掉 var privateDnsZoneName = 'azure-api.net'
resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
name: privateDnsZoneName
location: 'Global'
}
var apimPrivateIPAddresses = apim.properties.privateIPAddresses
resource privateDnsZoneEntry 'Microsoft.Network/privateDnsZones/A@2020-06-01' = {
name: apim.name
parent: privateDnsZone
properties: {
aRecords: [for addr in apimPrivateIPAddresses: {
ipv4Address: addr
}]
ttl: 3600
}
}
函数之外别无他法:
reference()
并将 param privateDnsZoneName string = 'azure-api.net'
param privateDnsARecordName string
param privateDnsARecordAddresses array
resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
name: privateDnsZoneName
location: 'Global'
}
resource privateDnsZoneEntry 'Microsoft.Network/privateDnsZones/A@2020-06-01' = {
name: privateDnsARecordName
parent: privateDnsZone
properties: {
aRecords: [for addr in privateDnsARecordAddresses: {
ipv4Address: addr
}]
ttl: 3600
}
}
数组传递给模块。
privateIPAddresses