[英]The template function 'reference' is not expected when feeding API Management private IP addresses into private DNS entry with Bicep
我想在私有 DNS 區域azure-api.net
中為我的內部 API 管理實例創建 DNS A 記錄以及 ZDB974238714CA8ACE3FZ 管理部署:1714CA8ACE3FZA
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.'.
似乎這個地方不支持reference()
function(在ARM中):
{
"type": "Microsoft.Network/privateDnsZones/A",
"apiVersion": "2020-06-01",
"name": "[format('{0}/{1}', variables('privateDnsZoneName'), 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', parameters('apimName'))]",
"[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]"
]
}
嘗試在兩者之間使用變量會導致相同的錯誤 - 因為實際上生成了相同的 ARM JSON。
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
}
}
我發現除了將私有DNS區域 + 記錄創建拆分為二頭肌模塊並擺脫reference()
function 之外別無他法:
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
數組傳遞給模塊。
module privateDnsEntry './private-dns.bicep' = {
name: 'apim-private-dns'
params: {
privateDnsZoneName: 'azure-api.net'
privateDnsARecordName: apim.name
privateDnsARecordAddresses: apim.properties.privateIPAddresses
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.