【问题标题】:Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 412 Precondition Failed while removing bucket IAM Member原因:com.google.api.client.googleapis.json.GoogleJsonResponseException: 412 Precondition Failed while remove bucket IAM Member
【发布时间】:2019-11-09 02:15:51
【问题描述】:

为了从谷歌云存储桶中删除身份,我使用 GCP 示例存储库中提供的示例:here。我想知道是否缺少某些东西,我拥有云帐户的正确根凭据以及项目所有权凭据。

以下是原始政策:

Policy{
bindings={roles/storage.legacyBucketOwner=[projectOwner:myaccount], 
roles/storage.objectAdmin=[serviceAccount:company-kiehn- 
log@myaccount.iam.gserviceaccount.com, serviceAccount:company-hammes- 
file@myaccount.iam.gserviceaccount.com, serviceAccount:company-howe- 
log@myaccount.iam.gserviceaccount.com, serviceAccount:company-doyle- 
log@myaccount.iam.gserviceaccount.com, serviceAccount:customer-6a53ee71-95eb- 
49b2-8a@myaccount.iam.gserviceaccount.com, serviceAccount:company-kiehn- 
file@myaccount.iam.gserviceaccount.com, serviceAccount:company-howe- 
file@myaccount.iam.gserviceaccount.com, serviceAccount:company-satterfield- 
log@myaccount.iam.gserviceaccount.com, serviceAccount:customer-0c1e8536-8bf5- 
46f4-8e@myaccount.iam.gserviceaccount.com, serviceAccount:company-deckow- 
log@myaccount.iam.gserviceaccount.com], 
roles/storage.legacyBucketReader=[projectViewer:myaccount], 
roles/storage.objectViewer=[serviceAccount:company-block- 
log@myaccount.iam.gserviceaccount.com]},
etag=CGg=,
version=0}

这是我的代码 sn-p:

读取存储桶策略并提取不需要的身份

Set<Identity> wrongIdentities = new HashSet<Identity>();
Role roler = null;    
Policy p = Cache.GCSStorage.getIamPolicy("bucketxyz");
Map<Role, Set<Identity>> policyBindings = p.getBindings();
        for (Map.Entry<Role, Set<Identity>> entry : policyBindings.entrySet()) {
Set<Identity> setidentities = entry.getValue();
                for (Identity set : setidentities) {
                    if (!(entry.getKey().getValue()
                            .equals("serviceAccount:attss@myaccount.iam.gserviceaccount.com"))) {

                        wrongIdentities.add(set);
                    }
 }
for (Identity identity : wrongIdentities) {

            System.out.println("identity: " + identity);
            System.out.println(removeBucketIamMember("bucektxyz",
                    roler, identity, p));
        }
}

从政策中移除不需要的身份

public static Policy removeBucketIamMember(String bucketName, Role role, 
Identity identity, Policy policy) {
Policy updatedPolicy = Cache.GCSStorage.setIamPolicy(bucketName,
policy.toBuilder().removeIdentity(role, identity).build());
return updatedPolicy;

但是,我看到了错误:

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 412 
Precondition Failed
{
   "code" : 412,
   "errors" : [ {
   "domain" : "global",
   "location" : "If-Match",
   "locationType" : "header",
   "message" : "Precondition Failed",
   "reason" : "conditionNotMet"
 } ],
   "message" : "Precondition Failed"
 }

at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.setIamPolicy(HttpStorageRpc.java:886)
... 9 more

【问题讨论】:

  • 显示您正在使用的policy。在应用新政策之前,您需要先阅读政策,然后对其进行修改。
  • @JohnHanley 我已经更新了这个问题。我有一种方法可以读取原始策略并在尝试删除不需要的身份之前尝试过滤掉它们。
  • 我认为您的问题是您每次删除身份时都没有使用更新的策略。如果您查看该政策,则末尾有一个标签:etag=CGg=。每次策略更改时都会更改。您必须在更新前阅读该政策。我认为这是If-Match 失败。在您的函数中,removeBucketIamMember 不通过策略。相反,在函数内部读取策略、修改、写入。根据需要重复。
  • @JohnHanley 你能发表你的评论作为答案吗?

标签: google-cloud-platform google-cloud-storage google-account google-iam


【解决方案1】:

修改 Cloud Storage 存储桶或对象 IAM 政策时,请务必先阅读该政策。作为策略内容的一部分是标签。更新后的策略必须包含相同的标签。标签看起来像:etag=CGg=

在这个问题中,策略更新失败并出现 HTTP 错误 412 Precondition Failed。此消息是由策略标签不正确引起的。由于策略更新会替换现有策略,因此此标记有助于防止两个更新相互覆盖。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2015-06-02
相关资源
最近更新 更多