azure - ARM 模板:如何引用使用参数设置名称的资源
问题描述
我有一个 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 文件设置的,我该如何引用该资源呢?
解决方案
只是为了添加到现有答案(这很好,但不完整)。更好的方法是使用以下resourceId()
功能:
reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), 'api-version-goes-here')
有几个原因。
- 这是引用资源的通用方式。您可以使用此方法引用另一个资源组\另一个订阅中的资源(而不仅仅是同一部署中的资源)。您可以为同一部署中的资源删除“api-version-goes-here”
- 如果您有 2 个或更多不同类型但具有相同名称的资源(例如存储帐户和虚拟机),则现有答案将失败,因为它无法确定您的目标资源
附言。也一样dependsOn
,你可以只用名字就可以逃脱,但我发现它总是更好\更可靠的使用resourceId()
,尤其是在大\复杂的模板中。