从ARM模板之外的资源访问存储帐户密钥

时间:2018-11-02 11:17:48

标签: arm azure-storage

我在我们的项目中使用了几个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"
                          }

有任何线索吗?

感谢和问候。

1 个答案:

答案 0 :(得分:0)

问题出在provider('Microsoft.Storage','storageAccounts')。apiVersions [0]中,以获取listkeys需要作为参数的API版本。直接将参数设置为2018-07-01就可以了