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

Azure ARM模板:如何引用使用参数设置名称的资源,azure,parameters,reference,azure-resource-manager,Azure,Parameters,Reference,Azure Resource Manager,我有一个Azure资源管理器模板来启动存储帐户,它的名称是使用一个参数设置的,如下所示: "resources": [ { "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", 我想输出资源的详细信息,但看不到引用存储帐户的方法,因为大多数示例都是按名称引用资源 我试过这个: "outputs": { "stor

我有一个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文件设置的,我该如何引用该资源呢?

我找到了答案。内部方括号是不必要的:

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

有效。

只是为了补充现有的答案,这个答案很好,但不完整。更好的方法是使用resourceId函数:

reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), 'api-version-goes-here')
这有几个原因

这是引用资源的通用方法。您可以使用此方法引用另一个资源组\另一个订阅中的资源,而不仅仅是同一部署中的资源。对于同一部署中的资源,可以删除“api版本到此为止” 如果您有两个或多个不同类型但名称相同的资源(如存储帐户和虚拟机),现有的答案将失败,因为它无法确定您的目标资源
另外,dependsOn也是一样,您可以只使用名称,但我发现使用resourceId总是更好\更可靠,尤其是在大型\复杂的模板中。

建议使用resourceId

查看MS文档:


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

感谢您的回答,它非常有用。所以resourceId本质上是资源Id的查找?也就是说,要查找的对象的lookuptype,要查找的对象的名称甚至不查找,它只是构造它,因为它是众所周知的给定resourceType\resourceName。参考人会去查的