使用 Bicep 将 API 管理私有 IP 地址提供给私有 DNS 条目时,不需要模板函数“引用”

问题描述

我想在私有 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...