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

ARM template: How to reference a resource that has its name set using a parameter

我有一个 Azure 资源管理器模板来启动存储帐户,它的名称是使用参数设置的,如下所示:

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

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

我试过这个:

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

但是得到错误信息:

The template output 'storageKey' at line '49' and column '23' is not valid: Unable to parse language expression 'reference([parameters('storageAccountName')])': expected token 'Identifier' and actual 'LeftSquareBracket'

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

我明白了。内部方括号是不必要的:

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

有效。

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

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

有几个原因。

  1. 这是引用资源的通用方式。您可以使用此方法在另一个资源 group\another 订阅中引用资源(而不仅仅是同一部署中的资源)。您可以为同一部署中的资源删除 'api-version-goes-here'
  2. 如果您有 2 个或更多不同类型但名称相同的资源(比如存储帐户和虚拟机),现有答案将失败,因为它无法确定您的目标资源

ps。 dependsOn 也是如此,您可以只使用名称,但我发现使用 resourceId() 总是 better\more 可靠,尤其是在 big\complicated 模板中。

推荐使用resourceId()。

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

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