在 ARM 模板中使用访问密钥检索在 Azure 容器上装载 Azure 文件共享

Posted

技术标签:

【中文标题】在 ARM 模板中使用访问密钥检索在 Azure 容器上装载 Azure 文件共享【英文标题】:Mount Azure File Share on Azure Container with access key retrieval in ARM Template 【发布时间】:2021-09-08 05:07:48 【问题描述】:

我正在使用 ARM 模板创建文件共享和容器实例,我需要将此创建的文件共享挂载到容器中。我有以下模板-


  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json",
  "contentVersion": "1.0.0.0",
  "parameters": 
    "storageAccountType": 
      "type": "string",
      "defaultValue": "Standard_GRS",
      "metadata": 
        "description": "Storage Account type"
      
    ,
    "storageAccountName": 
      "type": "string",
      "defaultValue": "[concat('storage', uniquestring(resourceGroup().id))]",
      "metadata": 
        "description": "Name of the Azure Storage account."
      
    ,
    "sharePrefix": 
      "type": "string",
      "defaultValue": "files",
      "metadata": 
        "description": "Specifies the prefix of the file share names."
      
    ,
    "location": 
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": 
        "description": "Location for all resources."
      
    ,
    .....
  ,
  "variables": 
    "ContainerGroupName": "[concat('my-cg',uniquestring(resourceGroup().id))]",
    "storageAccountId": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
    "ContainerName": "my-container"
  ,
  "resources": [
    
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[parameters('storageAccountName')]",
      "apiVersion": "2019-06-01",
      "location": "[parameters('location')]",
      "kind": "Storage",
      "sku": 
        "name": "[parameters('storageAccountType')]"
      
    ,
    
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2019-06-01",
      "name": "[concat(parameters('storageAccountName'), '/default/', parameters('sharePrefix'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
      ]
    ,
    
      "name": "[variables('ContainerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2018-10-01",
      "location": "[parameters('location')]",
      "properties": 
        "containers": [
          
            "name": "[variables('ContainerName')]",
            "properties": 
              "image": "imageNameinACR",
              "resources": 
                "requests": 
                  "memoryInGB": 14,
                  "cpu": 4
                
              ,
              "volumeMounts": [
                
                  "name": "filesharevolume",
                  "mountPath": "/app"
                
              ]
            
          
        ],
        "imageRegistryCredentials": [
          ....
        ],
        "restartPolicy": "OnFailure",
        "osType": "Linux",
        "volumes": [
          
            "name": "filesharevolume",
            "azureFile": 
              "shareName": "[concat(parameters('storageAccountName'), '/default/', parameters('sharePrefix'))]",
              "storageAccountName": "[parameters('storageAccountName')]",
              "storageAccountKey": "[listKeys(parameters('storageAccountName'), '2019-06-01').keys[0].value]"
            
          
        ]
      ,
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts/fileServices/shares', parameters('storageAccountName'), 'default', parameters('sharePrefix'))]"
      ]
    
  ],
  "outputs": 


但是,这是抛出错误

“错误”: "code": "CannotAccessStorageAccount", "message": "无法访问卷 'filesharevolume' 中的 Azure 存储帐户 'storage6x2un3wwsta6u': '远程服务器 返回错误:(400)错误请求。'。这可能是由 Azure 存储帐户密钥或 Azure 存储防火墙不正确。”

我也尝试使用 resourceId 来检索如下所示的秘密,但它会引发相同的错误。

"storageAccountKey": "[listKeys(variables('storageAccountId'), '2019-06-01').keys[0].value]"

我是否遗漏了模板中的任何内容?我参考了各种示例,这些示例展示了这种在 ARM 模板中检索访问密钥的方法。

在容器映像的 DOCKERFILE 中,我正在运行 运行 MKDIR /App

会不会是挂载路径有问题?我的假设是文件共享将挂载在这个目录中 - /app/filesharevolume。

【问题讨论】:

【参考方案1】:

我没有看到变量storageAccountId 的定义,但是模板函数listkeys 确实适用于资源Id。所以我给出了适合我的代码:

"storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]"

并且如果存储账户和容器组不在同一个资源组,那么可以在获取资源Id的时候加上存储账户的组名:

"storageAccountKey": "[listKeys(resourceId(variables('resourceGroupName'), 'Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]

Here 就是一个例子。

更新:

而且容器组的volumes有问题。您需要将文件共享名称更改为:

"volumes": [
          
            "name": "filesharevolume",
            "azureFile": 
              "shareName": "[parameters('sharePrefix')]",
              "storageAccountName": "[parameters('storageAccountName')]",
              "storageAccountKey": "[listKeys(parameters('storageAccountName'), '2019-06-01').keys[0].value]"
            
          
        ]

【讨论】:

谢谢查尔斯。我在上面的变量中以相同的方式定义了 storageAccountId,并且我在参数中有 storageAccountName - "storageAccountId": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]", 两个容器group 和 storage account 在这个 arm 模板中创建,它们将在同一个资源组中。但是,当我尝试使用变量 storageAccountId 时,即使像您上面建议的那样使用 resourceId 也会为我抛出相同的 400 错误。 @KrutiJoshi 也许您可以尝试将volumes 中的shareName 更改为parameters('sharePrefix') 谢谢查尔斯。我相信这就是问题所在。我现在有以下内容,并且运行良好。你能更新你的答案让我接受吗? "azureFile": "shareName": "[parameters('sharePrefix')]", "storageAccountName": "[variables('storageAccountName')]", "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/ storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]" @KrutiJoshi 当然。做到了。

以上是关于在 ARM 模板中使用访问密钥检索在 Azure 容器上装载 Azure 文件共享的主要内容,如果未能解决你的问题,请参考以下文章

如何将Azure管道变量传递给AzureResourceManagerTemplateDeployment @ 3任务使用的ARM模板?

如何使用 Azure ARM 模板将 VM 部署到资源组“A”并引用资源组“B”中的现有密钥保管库?

使用 terraform 输出恢复 Azure ARm 模板的输出值

如何将 Azure 管道变量传递给 AzureResourceManagerTemplateDeployment@3 任务使用的 ARM 模板?

如何将 Azure Policy 与 Azure DevOps 集成?

使用 ARM 模板对 Azure 存储帐户容器设置合法保留