在 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 模板?