2

发布方法 URL

https://cloudresourcemanager.googleapis.com/v1/projects/project-name:setIamPolicy

要求:

{
    "resource": "projects/project-name",
    "policy": {
        "bindings": [
            {
                "role": "roles/resourcemanager.organizationAdmin",
                "members": [
                    "user:test12345678@domain.com"
                ]
            }
         ],
        "etag": "BwWWja0YfJA=",
        "version": 3
     }
}

回复:

{

"error": { "code": 409, "message": "有并发策略更改。请使用指数退避重试整个读取-修改-写入。", "status": "ABORTED" }

}

4

3 回答 3

4

文档建议使用 read-modify-write 模式来更新资源的策略。

通过调用 getIamPolicy() 读取当前策略。通过使用文本编辑器或以编程方式编辑返回的策略,以添加或删除任何所需的成员及其角色授权。通过调用 setIamPolicy() 编写更新的策略。

在您的情况下,您尝试设置的策略与当前在资源上处于活动状态的策略似乎有所不同。发生这种情况的一种方法是,如果您这样做了:

  1. getIamPolicy() > policy.json
  2. addIamPolicyBinding() 或 removeIamPolicyBinding()
  3. setIamPolicy() 策略.json

#2 之后资源上的策略版本与 #3 尝试设置的内容不同步,因此会引发异常。要确认您可以将您尝试设置的策略中的 etag 字段与资源上当前的 etag 进行比较。应该有不匹配。

于 2020-07-22T20:43:48.337 回答
1

这意味着同时执行了多个更改。您应该尝试同时执行一个更改策略的请求。

实施指数退避应该可以帮助您解决此错误。它就像处理您的请求重试一样简单,时间幅度为n+1 + random_number_milliseconds seconds and retry the request

于 2020-01-07T08:43:44.017 回答
0

我能够通过删除来解决这个问题

"etag": "BwWWja0YfJA=",
    "version": 3

使用gcloud projects set-iam-policy命令时来自模板。它会要求您在提交更改之前覆盖现有策略

于 2021-06-30T12:21:50.927 回答