带角色分配的ARM模板的增量重新部署抛出错误



如果我使用Azure管道来做包含角色分配的ARM模板的'增量' '资源组'范围部署,似乎我无法重新运行/重新部署管道而不会收到角色分配资源上的错误:

RoleAssignmentUpdateNotPermitted: Tenant ID, application ID, principal ID, and scope are not allowed to be updated.

这看起来像是一个明显的问题,必须有一个共同的解决方案?我是否需要将角色分配分解到一个单独的模板中,并且可能在每个部署中删除并重新创建角色分配?

带角色分配的ARM模板增量重新部署抛出错误

正如你所说的,这是一个显而易见的问题。对于相同的作用域或资源,您只能将相同的角色分配给服务主体一次。

因此,存在与您试图通过此模板创建的同名的现有角色分配,并且它最终给出了"RoleAssignmentUpdateNotPermitted"。

要解决这个问题,我们需要确保每次部署到不同的资源组时使用不同的GUID来分配角色,但同时,确保部署到相同的资源组时使用相同的GUID。

我们可以使用guid函数!它接受一个或多个用于计算哈希值的字符串,非常类似于uniquestring函数;只有这个会生成GUID格式的字符串:

{
"type": "Microsoft.Authorization/roleAssignments",
"name": "[guid(resourceGroup().id, 'monitoringUsers')]"
}

您可以参考文档在ARM模板中定义RBAC角色分配了解更多细节。

您已经询问了增量更新,这篇故障排除文章提供了一些帮助:https://learn.microsoft.com/en-us/azure/role-based-access-control/troubleshooting?tabs=bicep#symptom---arm-template-role-assignment-returns-badrequest-status

但是我如何理解它,如果你用相同的GUID再次重新创建角色分配,它将尝试替换那里的角色。这通常是我们在增量更新中想要的。但是,如果其他3个参数(租户ID,应用程序ID,主体ID)中的任何一个发生了变化,并且您使用了相同的GUID -它将被视为更新,并且您将收到此错误。

租户ID、应用ID、主体ID、作用域不允许更新。(代码:RoleAssignmentUpdateNotPermitted)

如错误所述-这些属性不能更改

那么,如果我们想要一个不同的分配,例如,如果这个部署的PrincipleID发生了变化,该怎么办呢?那么我们可以使用一个新的GUID,它不会被视为一个变化,一个新的角色分配将被执行。(前一个必须通过另一种方式删除)。

如果你使用了一个新的GUID,而其他3个属性保持不变,它将被视为一个重复的角色分配,并抛出一个错误!

所以这就是为什么,我们应该使用GUID()函数来创建一个基于其他3个参数的GUID ID。这样,在增量更新中,如果我们重新部署完全相同的roleAssignment,我们使用相同的GUID。如果我们正在部署一些不同的东西(例如PrincipleID已经更改),那么我们将获得一个新的GUID,它将被视为一个新的角色分配,而不是更新。

在上面的Azure文档中,他们给出的例子是:

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-10-01-preview' = {
name: guid(resourceGroup().id, principalId, roleDefinitionId)
properties: {
roleDefinitionId: roleDefinitionId
principalId: principalId
principalType: principalType
}
}

最新更新