使用Java SDK为ServiceAccount提供bigquery.jobUser角色,“不支持”?

问题描述:

我正在使用Google Java SDK来创建和管理服务帐户。一般来说,它的效果很好。但是,我试图将'bigquery.jobUser'角色添加到新创建的ServiceAccount中,但API一直告诉我该角色对我的资源无效。使用Java SDK为ServiceAccount提供bigquery.jobUser角色,“不支持”?

我在这个领域找不到很多关于Java SDK的文档,所以我明确地做了一些错误的事情,可能是在指定我的资源。

希望有人可以眼球,看看是否有东西跳出来?我一直在这几天,我觉得像我“米SOOOOO接近....

  // assume successful service account creation: 
      serviceAccount = create.execute(); 


      // now set the IAM policy for bigquery.user for this service account. 
      String[] serviceAccountsArray = new String[] {"serviceAccount:" + serviceAccount.getEmail()}; 
      String targetRole = "roles/bigquery.jobUser"; 

      LinkedList<Binding> bindings = new LinkedList<>(); 
      Binding targetBinding = new Binding(); 
      targetBinding.setRole(targetRole); 
      bindings.add(targetBinding); 
      targetBinding.setMembers(Arrays.asList(serviceAccountsArray)); 

      Policy policy = new Policy(); 
      policy.setBindings(bindings); 

      SetIamPolicyRequest setIamPolicyRequest = new SetIamPolicyRequest(); 
      setIamPolicyRequest.setPolicy(policy); 

      Iam.Projects.ServiceAccounts.SetIamPolicy setIamPolicy = iam. 
        projects() 
        .serviceAccounts() 
        .setIamPolicy("projects/" + bigQueryProjectId + "/serviceAccounts/" + serviceAccount.getEmail(), setIamPolicyRequest); 

      Policy newPolicy = setIamPolicy.execute(); 

不幸的是,我总是得到以下异常:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 

400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Role roles/bigquery.jobUser is not supported for this resource.", 
    "reason" : "badRequest" 
    } ], 
    "message" : "Role roles/bigquery.jobUser is not supported for this resource.", 
    "status" : "INVALID_ARGUMENT" 
} 
+0

它是否适用于其他预定义角色? https://cloud.google.com/bigquery/docs/access-control#bigquery.user –

+0

感谢您的阅读...不幸的是,我已经尝试了在该文档中定义的每个角色/ bigquery。*角色。我觉得我必须从根本上误解使用Java SDK将角色添加到服务帐户的正确方法,但是如果能够找到此操作的任何文档或代码示例,我会感到厌烦。 – SantaCruzDeveloper

bigquery.*角色似乎并不根据这里的角色列表https://cloud.google.com/iam/docs/understanding-roles和这里的https://cloud.google.com/bigquery/docs/access-control尽管可以通过具有所需权限的云控制台创建服务帐户(这表明它可能以某种方式),但它适用于服务帐户

您可以使用api应用更多常规角色,如Viewer,Editior或Owner(此处提及https://cloud.google.com/bigquery/docs/access-control#transitioning_from_primitive)。

是的,事后看来,返回的错误信息显然告诉我这样,但它似乎是合理的(对相对谷歌云新手),这是正确的SDK调用添加一个IAM策略绑定到服务帐户。

我确实找到了使用拉/更新/推送方法(尊重etag)更新IAM策略的整体映射的方法。然而,测试过程中我误发空的净荷:

[] 

向IAM端点,并完全吹散了每一个ACL在我的整个项目,即使业主特权!幸运的是,这次只有开发环境,但每次对整个有效负载进行完整的POST都对我来说似乎有风险。

最终,我最终找到一个gcloud指令行选项(https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding),这几个附加的政策,结合样,我想,这样的:

gcloud项目附加IAM策略结合

在我的Java代码包装在一个ProcessBuilder.start此调用()(伪代码)

 List<String> commands = new ArrayList<>(); 
     commands.add(gcloudCommandLineLocation); 
     commands.add("projects"); 
     commands.add("add-iam-policy-binding"); 
     commands.add(bigQueryProjectId); 
     commands.add("--member"); 
     commands.add("serviceAccount:" + serviceAccount.getEmail()); 
     commands.add("--role"); 
     commands.add("roles/bigquery.jobUser"); 

     // build the process 
     ProcessBuilder pb = new ProcessBuilder(commands); 

     // cross the streams! 
     pb.redirectErrorStream(true); 

     // start the process 
     Process process = pb.start(); 

不是完美的解决方案,b ut达到了将BigQuery ACL附加到Java中新创建的服务帐户的目标,因此我很乐意继续前进。最终,我想找到在SDK中这样做的正确方法,但现在我觉得我找到了满足我们项目的答案。