系统分配的托管标识的 Azure ARM 角色分配第一次运行失败

Posted

技术标签:

【中文标题】系统分配的托管标识的 Azure ARM 角色分配第一次运行失败【英文标题】:Azure ARM role assignment for System Assigned Managed Identity fails the first run 【发布时间】:2021-07-27 13:22:58 【问题描述】:

我的目标是部署一个具有系统管理身份的逻辑应用该身份的角色分配。最好在一个 ARM 模板中完成。

我的安装程序第一次运行失败,但连续运行成功。如果我错了,请纠正我,但我认为其原因是角色分配的部署发生在逻辑应用的托管标识“准备就绪”之前,因此我第一次部署时出现以下错误模板。我第二次部署模板时没有收到此错误,可能是因为当时身份已经存在。


  "code": "DeploymentFailed",
  "message": "At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.",
  "details": [
    
      "code": "PrincipalNotFound",
      "message": "Principal *** does not exist in the directory ***."
    
  ]

我的模板(为简洁起见,删除了逻辑应用定义)。在这种情况下,逻辑应用的标识需要访问位于另一个资源组中的存储帐户。


    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": 
        "logicAppName": 
            "type": "string"
        ,
        "storageAccountResourceGroup": 
            "type": "String"
        ,
        "storageAccountName": 
            "type": "String"
        
    ,
    "variables": 
        "logicAppResourceId": "[resourceId('Microsoft.Logic/workflows', parameters('logicAppName'))]",
        "Storage Blob Data Contributor": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]"
    ,
    "resources": [
        
            "type": "Microsoft.Logic/workflows",
            "apiVersion": "2017-07-01",
            "name": "[parameters('logicAppName')]",
            "location": "[resourceGroup().location]",
            "identity": 
                "type": "SystemAssigned"
            ,
            "properties": 
                "state": "Enabled",
                "definition": 
                    ...    
                
            
        ,
        
            "type": "Microsoft.Resources/deployments",
            "name": "[concat('RoleAssignment-', parameters('logicAppName'))]",
            "apiVersion": "2020-06-01",
            "resourceGroup": "[parameters('storageAccountResourceGroup')]",
            "subscriptionId": "[subscription().subscriptionId]",
            "dependsOn": [
                "[parameters('logicAppName')]"
            ],
            "properties": 
                "mode": "Incremental",
                "template": 
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        
                            "apiVersion": "2018-09-01-preview",
                            "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
                            "name": "[concat(parameters('storageAccountName'), '/Microsoft.Authorization/', guid(subscription().subscriptionId, parameters('logicAppName')))]",
                            "properties": 
                                "roleDefinitionId": "[variables('Storage Blob Data Contributor')]",
                                "principalId": "[reference(variables('logicAppResourceId'), '2019-05-01', 'Full').identity.principalId]"
                            
                        
                    ]
                
            
        
    ]

正如您在模板中看到的,我在逻辑应用本身上添加了一个dependsOn。然而,这似乎还不够。

有人对此有解决方案吗?

谢谢!

【问题讨论】:

试试看docs.microsoft.com/en-us/azure/role-based-access-control/… @KenWMSFT 以及它将如何提供帮助? 首先类型应该是“type”:“Microsoft.Authorization/roleAssignments”,而不是“type”:“Microsoft.Storage/storageAccounts/providers/roleAssignments”。用户似乎正在尝试更新存储帐户而不是创建新的角色分配。 该类型将作为“Microsoft.Storage/storageAccounts/providers/roleAssignments”工作 - 这是扩展资源(此 roleAssignment 是)的一种允许语法。使用范围属性也可以:github.com/Azure/azure-quickstart-templates/blob/master/… 【参考方案1】:

我在这里找到了答案:https://docs.microsoft.com/en-us/azure/role-based-access-control/role-assignments-template#new-service-principal

添加"principalType": "ServicePrincipal"后,部署工作始终如一

【讨论】:

以上是关于系统分配的托管标识的 Azure ARM 角色分配第一次运行失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Azure 托管标识分配给 Azure 存储帐户?

具有用户分配的托管标识的 Azure SQL 数据库连接池

无法在Azure中使用系统分配的托管身份读取Azure Key Vault秘密值

具有托管标识(用户分配)的 Azure SQL 无法针对 AAD 使用

可以将系统分配的托管服务标识添加到 AAD 组吗?

使用自动化帐户中用户分配的托管标识连接到 Azure 存储帐户(使用 Azure RM 模块)