繁体   English   中英

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

[英]Provide bigquery.jobUser role to ServiceAccount using Java SDK, “not supported”?

我正在使用Google Java SDK创建和管理服务帐户。 总的来说,它很棒。 但是,我试图将'bigquery.jobUser'角色添加到新创建的ServiceAccount中,但是API不断告诉我该角色对我的资源无效。

我在这方面没有大量的Java SDK文档,因此我显然做错了,也许是在指定资源时。

希望有人可以对此视而不见,看看是否有任何东西跳出来? 我已经在这里待了好几天了,我觉得我离这儿太近了。

           // 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"
}

根据https://cloud.google.com/iam/docs/understanding-roleshttps://cloud.google.com/上的角色列表, bigquery.*角色似乎不适用于服务帐户。 bigquery / docs / access-control,但可以通过具有所需权限的云控制台创建服务帐户(这表明可以实现)。

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

是的,事后看来,返回的错误消息显然是这样告诉我的,但是(对于相对的Google Cloud新手来说),这是将IAM策略绑定添加到服务帐户的正确SDK调用,这似乎是合理的。

我确实找到了一种使用SDK的方法,该方法使用拉/更新/推方法(尊重etag)来更新IAM策略的整个映射。 但是,在一次测试中,我错误地发送了一个空的有效负载:

[]

到IAM端点,并完全销毁整个项目中的每个ACL,甚至没有所有者权限! 幸运的是,这次只有一个Dev环境,但是每次对整个有效负载进行完整的POST对我来说都是冒险的。

最终,我最终找到了gcloud命令行选项( https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding ),它只是像我想要的那样附加了策略绑定,例如:

gcloud项目add-iam-policy-binding

并将此调用包装在我的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();

这不是完美的解决方案,但是可以达到将BigQuery ACL附加到Java中新创建的服务帐户的目标,因此我很乐意继续。 最终,我想在SDK中找到执行此操作的正确方法,但是现在,我觉得自己找到了一个满足我们项目要求的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM