使用嵌套的“ reference()”调用时发生InvalidTemplate错误

时间:2019-12-05 15:58:13

标签: azure azure-resource-manager

我正在尝试在ARM模板中获取专用链接的专用IP地址,这是部署专用链接端点及其对应的专用DNS条目的一部分。我能够找到与专用终结点关联的NIC的正确资源ID,但是当我尝试将该ID直接传递给对reference()的调用时,它将失败,并出现InvalidTemplate错误。 / p>

以下是演示问题的模板:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateEndpointName": {
            "type": "string"
        }
    },
    "variables": {
    },
    "resources": [
    ],
    "outputs": {
        "nic": {
            "type": "object",
            "value": "[reference(reference(resourceId('Microsoft.Network/privateEndpoints',parameters('privateEndpointName')), '2019-09-01').networkInterfaces[0].id, '2019-07-01')]"
        }
    },
    "functions": []
}

此操作失败,并显示以下信息:

The template output 'nic' at line '14' and column '16' is not valid: The template function 'reference' is not expected at this location. Please see https://aka.ms/arm-template-expressions for usage details...

2 个答案:

答案 0 :(得分:0)

使用嵌套的reference()调用将不起作用。

尽管未在文档中列出,但我自己的经验是,reference尝试在模板中使用时会立即自行解决。

这意味着当您使用reference(reference(resourceId()...)...)时,模板认为您正在尝试传递reference的{​​{1}}和resourceId,这显然是无效的。期望它以reference(resourceId(...)...)开头,而不是/subscriptions/

我确定您已经对其进行了测试,但是请尝试直接在模板中使用嵌套reference(NIC的reference)的结果以验证它确实是嵌套的resourceId,而不是引起问题的网卡reference

答案 1 :(得分:0)

您可以通过在收集器模式中使用嵌套模板来使其工作。

https://docs.microsoft.com/en-us/azure/architecture/building-blocks/extending-templates/collector

在此模型中,您可能需要两个嵌套的模板部署:

  1. 第一个模板将在私有终结点上执行引用并将其设置为输出。
  2. 第二个模板将使用专用端点的参数,然后执行第二个引用并将其设置为输出。
  3. 然后,在父模板中,您可以访问第二个嵌套模板的输出。

您可以用一个完成它,但是模板变得有点难以阅读。这是有关如何执行的粗略示例。您可能需要修复一些问题,但总体思路应保持不变。 (“ [[”告诉模板在第二个(嵌套)模板的上下文中解析模板函数,所有“ [”将在第一个模板的上下文中解析)。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateEndpointName": {
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2015-01-01",
            "name": "privateEndpointDeployment",
            "properties": {
                "mode": "Incremental",
                "parameters": {
                    "nicId": { "value": "[reference(resourceId('Microsoft.Network/privateEndpoints',parameters('privateEndpointName')), '2019-09-01').networkInterfaces[0].id]" }
                },
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {
                        "nicId": {
                            "type": "string"
                        }
                    },
                    "variables": {},
                    "resources": [],
                    "outputs": {
                        "nic": {
                            "type": "object",
                            "value": "[[reference(parameters('nicId'), '2019-07-01')]"
                        }
                    }
                }
            }
        }
    ],
    "outputs": {
        "nic": {
            "type": "object",
            "value": "[reference('privateEndpointDeployment', '2015-01-01').outputs.nic.value]"
        }
    }
}