ARM模板:如何引用使用参数设置了名称的资源

时间:2019-05-10 13:00:49

标签: azure parameters reference azure-resource-manager

我有一个Azure资源管理器模板可以启动一个存储帐户,并且其名称是使用参数设置的,例如:

"resources": [
    {
        "name": "[parameters('storageAccountName')]",
        "type": "Microsoft.Storage/storageAccounts",

我想输出资源的详细信息,但是看不到引用存储帐户的方法,因为大多数示例中我都可以通过名称来引用资源。

我已经尝试过:

    "outputs": {
    "storageKey": {
        "type": "string",
        "value": "[reference([parameters('storageAccountName')])]"
    }
}

但是收到错误消息:

  

第49行和第23列的模板输出“ storageKey”无效:   无法解析语言表达式'reference([parameters('storageAccountName')])':预期标记'Identifier'和实际的'LeftSquareBracket'

那么,如果使用parameters.json文件设置了资源名称,该如何引用该资源?

3 个答案:

答案 0 :(得分:2)

仅用于添加到现有答案中(很好,但不完整)。更好的方法是使用resourceId()函数:

reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), 'api-version-goes-here')

有几个原因。

  1. 这是引用资源的通用方法。您可以使用此方法引用另一个资源组\另一个订阅中的资源(不仅限于同一部署中的资源)。您可以为同一部署中的资源删除“ api-version-goes-here”
  2. 如果您拥有2个或更多类型不同但名称相同的资源(例如存储帐户和虚拟机),则现有答案将失败,因为它无法确定您要定位的资源

ps。 dependsOn也是一样,您可以仅使用名称,但是我发现使用resourceId()总是更好\更可靠,尤其是在大\复杂模板中。

答案 1 :(得分:1)

我知道了。不需要内部方括号:

        "storageKey": {
        "type": "Object",
        "value": "[reference(parameters('storageAccountName'))]"
    }

有效。

答案 2 :(得分:0)

建议使用resourceId()。

检查MS文档: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-resource#resourceid

它返回资源的唯一标识符。当资源名称不明确或未在同一模板中设置资源名称时,可以使用此功能。