如果我使用 Azure Pipelines 对包含角色分配的 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 和范围不允许更新。 (代码:RoleAssignmentUpdateNotPermission)
如错误所述 - 这些属性无法更改。
如果我们想要不同的作业怎么办,例如此部署的 PrincipleID 是否已更改?那么我们可以使用新的 GUID,它不会被视为更改,并且会进行新的角色分配。 (前一个必须通过其他方式删除)。
但是,如果您使用新的 GUID 并且其他 3 个属性 do 保持不变,它将被视为重复的角色分配,并且也会引发错误!
这就是为什么,我们应该使用 GUID() 函数来创建一个基于其他 3 个参数的 GUID ID。这样,在增量更新中,如果我们重新部署完全相同的角色分配,我们将使用相同的 GUID。如果我们正在部署不同的东西(例如 PrincipleID 已更改),那么我们将获得一个新的 GUID,并且它将被视为新的 roleAssignment 而不是更新。
在上面的 Azure 文档中,他们给出的示例是这样的:
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-10-01-preview' = {
name: guid(resourceGroup().id, principalId, roleDefinitionId)
properties: {
roleDefinitionId: roleDefinitionId
principalId: principalId
principalType: principalType
}
}