我在我们的项目中使用了几个ARM模板,每个模板都用于一个不同的组件,并且还有一个Common ARM模板,其中包含大多数元素需要工作的所有资源,例如SqlServer,Storage Accounts,Redis缓存(所有元素仅此资源之一)
问题是,由于存储帐户位于单独的ARM模板(通用基础结构ARM模板)中,因此我无法从组件模板访问存储帐户密钥。我需要它来正确设置组件使用它的连接字符串的值。如果我将存储帐户资源包括在组件模板中,则可以通过以下方式访问它:
[concat('DefaultEndpointsProtocol=https;AccountName=',
variables('YFO.StorageAccount.Name'), ';AccountKey=',
listKeys(resourceId('Microsoft.Storage/storageAccounts',
variables('YFO.StorageAccount.Name')), providers('Microsoft.Storage',
'storageAccounts').apiVersions[0]).keys[0].value)]
但是当我从组件模板中删除它时,应该得到以下错误:
New-AzureRmResourceGroupDeployment:
错误:代码= InvalidTemplate;消息=部署模板验证失败:'模板引用'**********'无效:无法 查找具有此名称的模板资源或资源副本。请参阅 https://aka.ms/arm-template-expressions/#reference了解使用情况的详细信息。'
如果资源不在您要部署的模板之外,则listKeys似乎无法完成工作
对于AppInsights组件,我可以通过以下方式做到这一点:
[reference(concat('Microsoft.Insights/components/',
variables('AppInsightsName'))).InstrumentationKey]
即使AppInsights资源位于组件ARM模板之外,但我也无法使用存储帐户来执行此操作,因为在参考函数中为存储帐户返回的对象如下:
"networkAcls": {
"bypass": "AzureServices",
"virtualNetworkRules": [],
"ipRules": [],
"defaultAction": "Allow"
},
"supportsHttpsTrafficOnly": false,
"encryption": {
"services": {
"file": {
"enabled": true,
"lastEnabledTime": "2018-08-18T06:05:57.3069884Z"
},
"blob": {
"enabled": true,
"lastEnabledTime": "2018-08-18T06:05:57.3069884Z"
}
},
"keySource": "Microsoft.Storage"
},
"provisioningState": "Succeeded",
"creationTime": "2018-08-18T06:05:56.8228127Z",
"primaryEndpoints": {
"blob": "https://yfomormonttest.blob.core.windows.net/",
"queue": "https://yfomormonttest.queue.core.windows.net/",
"table": "https://yfomormonttest.table.core.windows.net/",
"file": "https://yfomormonttest.file.core.windows.net/"
},
"primaryLocation": "westeurope",
"statusOfPrimary": "available",
"secondaryLocation": "northeurope",
"statusOfSecondary": "available"
}
有任何线索吗?
答案 0 :(得分:0)
问题出在provider('Microsoft.Storage','storageAccounts')。apiVersions [0]中,以获取listkeys需要作为参数的API版本。直接将参数设置为2018-07-01就可以了