【问题标题】:Azure: Assign Roles via ARM Template to storage containerAzure:通过 ARM 模板将角色分配给存储容器
【发布时间】:2019-07-30 06:19:17
【问题描述】:

我正在尝试通过 arm 模板将角色“Storage Blob Data Contributor (Preview)”分配给特定的存储容器。但我就是想不出正确的语法。

这就是我所拥有的:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Contributor",
                "Reader",
                "StorageBlobDataContributor"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        }
    },
    "variables": {
        "apiVersion": "2017-05-01",
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
        "StorageBlobDataContributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]",
        "TestVariable": "[concat('STORAGEACCOUNTNAME','/Microsoft.Authorization/',guid(subscription().subscriptionId))]"
    },
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
            "apiVersion": "[variables('apiVersion')]",
            "name": "[variables('TestVariable')]",
            "properties": {
                "roleDefinitionId": "[variables('Reader')]",
                "principalId": "[parameters('principalId')]"
            }
        },
        {
            "type": "Microsoft.Storage/storageAccounts/STORAGEACCOUNTNAME/blobServices/containers/blobCONTAINERNAME/providers/Microsoft.Authorization/roleAssignments",
            "apiVersion": "[variables('apiVersion')]",
            "name": "STORAGEACCOUNTNAME/blobServices/containers/default/blobCONTAINERNAME/Microsoft.Authorization/NEW-GUID",
            "properties": {
                "roleDefinitionId": "[variables('StorageBlobDataContributor')]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ],
    "outputs": {}
}

我可以成功地将读者角色附加到存储帐户本身。 但是对于容器,我收到以下错误:

    new-AzResourceGroupDeployment : 09:21:24 - Error: Code=InvalidTemplate; Message=Deployment template validation failed: 'The template resource
'STORAGEACCOUNTNAME/blobServices/containers/CONTAINERNAME/Microsoft.Authorization/GUID' for type
'Microsoft.Storage/storageAccounts/STORAGEACCOUNTNAME/blobServices/default/containers/CONTAINERNAME/providers/Microsoft.Authorization/roleAssignments' at line '44' and column '9' has incorrect
segment lengths. A nested resource type must have identical number of segments as its resource name. A root resource type must have segment length one greater than its resource name. Please see
https://aka.ms/arm-template/#resources for usage details.'.

我尝试了很多方法来尝试附加角色,以至于我没有想法。 有人可以帮我吗?

【问题讨论】:

    标签: azure azure-blob-storage arm-template azure-storage-account


    【解决方案1】:

    使用Erik's answer above我当然赞成,谢谢 Erik!),我能够解决类似问题的 RBAC 权限使用 ARM 模板的存储帐户队列

    这是一个示例 ARM 模板,用于将发件人角色添加到存储帐户的单个队列...

    <..snip..>
    "parameters": {
        "PrincipalId": {
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "variables": {
        "SubscriptionId": "[concat('/subscriptions/', subscription().subscriptionId)]",
        "RoleDefinitions": "[concat(variables('SubscriptionId'), '/providers/Microsoft.Authorization/roleDefinitions/')]",
        "QueueSenderRole": "c6a89b2d-59bc-44d0-9896-0f6e12d7b80a"
    },
    "resources": [        
        {
            "type": "Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments",
            "name": "mystorageaccount/default/myqueue/Microsoft.Authorization/00000000-1234-0000-5678-000000000000", // NB example only; pick an idempotent but unique value
            "apiVersion": "2018-09-01-preview",
            "properties": {
                "roleDefinitionId": "[concat(variables('RoleDefinitions'), variables('QueueSenderRole'))]",
                "principalId": "[parameters('PrincipalId')]"
            }
        }
    ]
    

    【讨论】:

    • 非常感谢彼得,这就像一个魅力。但是我注意到,如果我重新运行部署,我会收到一个错误,即我无法“更新”角色分配。自然,我不想“更新”它。如果它是增量 ARM 部署,它应该能够容忍已经存在的资源并优雅地继续。我猜不是角色分配。你遇到过这个问题吗?如果有,你是怎么处理的?
    • 嗨,约翰,我想我做到了,是的。我认为关键是获得正确的名称,以便对于相同的角色分配它是相同的值。所以在我的真实版本中,我使用 ARM 函数 concat 和 guid 构建名称:` "name": "[concat('mystorageaccount','/default/','myqueue','/Microsoft.Authorization/', guid( ))]", // 仅 NB 示例;选择一个幂等但唯一的值 ` 对我来说,这些唯一的部分是存储帐户、队列名称(授予什么权限)、角色 ID 以及主体 ID。
    • 谢谢彼得。奇怪,我保持我的 guid(和全名)相同,它仍然给了我更新错误。好的,让我再次追溯我的步骤。顺便说一句,似乎有一种使用“Scope”的新语法,您是否尝试过使用它?
    【解决方案2】:

    你需要构造这样的东西:

    resourceId/Microsoft.Authorization/roleAssignments/NEW-GUID
    

    并且resourceId通常被构造为

    type: provider/namespace
    name: name
    
    provider/namespace/name
    

    例如,对于子网,它会是(注意它从每条线依次取 1 个段,除了第一个,第一个总是 2 个段):

    type: microsoft.network/virtualnetworks/subnets
    name: vnetName/subnetName
    
    microsoft.network/virtualnetworks/vnetName/subnets/subnetName
    

    如果可能的话,它看起来像这样:

    "type": "Microsoft.Storage/storageAccounts/blobServices/containers/providers/roleAssignments",
    "name": "STORAGEACCOUNTNAME/default/CONTAINERNAME/Microsoft.Authorization/NEW-GUID"
    
    Microsoft.Storage/storageAccounts/STORAGEACCOUNTNAME/containers/CONTAINERNAME/providers/Microsoft.Authorization/roleAssignments/NEW-GUID
    

    【讨论】:

      【解决方案3】:

      做了一些小调整:

      "type": "Microsoft.Storage/storageAccounts/blobServices/containers/providers/roleAssignments",
      "name": "STORAGEACCOUNTNAME/default/CONTAINERNAME/Microsoft.Authorization/NEW-GUID"
      

      这样我可以在容器本身上分配角色。感谢 4c74356b41 为我指明了正确的方向

      【讨论】:

      • 嗨,我和你有同样的问题,但我不断收到“BadRequestFormat”错误。知道为什么会这样吗?
      • 不确定哪些调整?完全一样的表达
      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 2021-06-23
      • 2020-09-28
      • 1970-01-01
      • 2020-06-02
      • 2022-10-04
      • 2022-08-14
      • 2021-12-28
      相关资源
      最近更新 更多