使用角色分配增量重新部署 ARM 模板会引发错误

问题描述 投票:0回答:2

如果我使用 Azure Pipelines 对包含角色分配的 ARM 模板进行“增量”“资源组”范围部署,似乎我无法在角色分配资源上收到错误的情况下重新运行/重新部署管道:

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

这看起来是一个明显的问题,必须有一个通用的解决方法? 我希望将角色分配分解为单独的模板,并且可能在每个部署上删除并重新创建角色分配?

azure-pipelines azure-resource-manager azure-rm-template azure-rbac azure-service-principal
2个回答
6
投票

使用角色分配增量重新部署 ARM 模板会引发错误

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

因此,您尝试通过此模板创建同名的现有角色分配,最终会给出“

RoleAssignmentUpdateNotPermitted
”的错误。

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

我们可以使用

guid
功能!它需要一个或多个字符串来计算哈希值,非常类似于 uniquestring 函数;只有这个会生成 GUID 格式的字符串:

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

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


0
投票

您询问了有关增量更新的问题,这篇故障排除文章可以在一定程度上提供帮助: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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.