ARM - 如何从存储帐户获取访问密钥以便稍后在模板中的AppSettings中使用?

时间:2015-10-19 23:36:06

标签: azure-storage azure-resource-manager

我创建了一个Azure Resource Manager模板,用于实例化多个资源,包括Azure存储帐户和带有Web App的Azure App Service。

我希望能够从新创建的存储帐户中捕获主要访问密钥(或完整连接字符串,无论哪种方式都可以),并将其用作其中一个AppSettings的值网络应用程序。

这可能吗?

4 个答案:

答案 0 :(得分:47)

使用listkeys帮助程序功能。

"appSettings": [
    {
      "name": "STORAGE_KEY",
      "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value]"
    }
]

这个快速入门做了类似的事情:

https://azure.microsoft.com/en-us/documentation/articles/cache-web-app-arm-with-redis-cache-provision/

答案 1 :(得分:31)

自接受其他答案以来,语法已更改。您现在遇到的错误是'Template language expression property 'key1' doesn't exist, available properties are 'keys'

键现在表示为键数组,语法现在是:

"StorageAccount": "[Concat('DefaultEndpointsProtocol=https;AccountName=',variables('StorageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('StorageAccountName')), providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value)]",

请参阅:http://samcogan.com/retrieve-azure-storage-key-in-arm-script/

答案 2 :(得分:4)

我两次面对这个问题。 2015年第一次,2017年5月最后一次。 我需要向WebApp添加连接字符串 - 我希望在ARM模板部署期间从生成的资源中自动添加字符串。稍后可以帮助不手动添加此值。

我第一次使用旧版本的函数listKeys(看起来旧版本返回结果不是作为对象而是作为值):

"AzureWebJobsStorage": {
                        "type": "Custom",
                        "value": "[concat(variables('storageConnectionString'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2015-05-01-preview').key1)]"
                    },

今天工作模板的最后一个版本是:

"resources": [
    {
      "apiVersion": "2015-08-01",
      "type": "config",
      "name": "connectionstrings",
      "dependsOn": [
        "[resourceId('Microsoft.Web/Sites/', parameters('webSiteName'))]"
      ],
      "properties": {
        "DefaultConnection": {
          "value": "[concat('Data Source=tcp:', reference(resourceId('Microsoft.Sql/servers/', parameters('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', parameters('databaseName'), ';User Id=', parameters('administratorLogin'), '@', parameters('sqlserverName'), ';Password=', parameters('administratorLoginPassword'), ';')]",
          "type": "SQLServer"
        },
        "AzureWebJobsStorage": {
          "type": "Custom",
          "value": "[concat(variables('storageConnectionString'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2016-01-01').keys[0].value)]"
        },
        "AzureWebJobsDashboard": {
          "type": "Custom",
          "value": "[concat(variables('storageConnectionString'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2016-01-01').keys[0].value)]"
        }
      }
    },

感谢。

答案 3 :(得分:2)

下面是向ADLA添加存储帐户的示例

"storageAccounts": [
                  {
                    "name": "[parameters('DataLakeAnalyticsStorageAccountname')]",
                    "properties": {
                      "accessKey": "[listKeys(variables('storageAccountid'),'2015-05-01-preview').key1]"
                    }
                }
            ],

在变量中你可以保留

"variables": {
        "apiVersion": "[providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]]",
         "storageAccountid": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', parameters('DataLakeAnalyticsStorageAccountname'))]"
    },