2017-09-28 8 views
0

Google Java SDK를 사용하여 서비스 계정을 만들고 관리하고 있습니다. 일반적으로 잘 작동합니다. 그러나 새로 생성 된 ServiceAccount에 'bigquery.jobUser'역할을 추가하려고 시도하지만 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

답변

0

하는 bigquery.* 역할을하지 않는 것을 여기에 역할 목록에 따라 서비스 계정에 적용하려면 https://cloud.google.com/iam/docs/understanding-roles 및 여기 https://cloud.google.com/bigquery/docs/access-control이 필요합니다. 클라우드 콘솔을 통해 필요한 권한으로 서비스 계정을 만들 수 있지만 (가능하면 가능함)

API를 사용하여 뷰어, 편집자 또는 소유자 (여기서는 https://cloud.google.com/bigquery/docs/access-control#transitioning_from_primitive)와 같은보다 일반적인 역할을 적용하십시오.

0

그래, 뒤늦은 견해로는 반환 된 오류 메시지가 분명히 나를 알려주고 있었지만 적절한 SDK 호출이 서비스 계정에 IAM 정책 바인딩을 추가하는 것이 합리적이라고 생각했습니다.

SDK를 사용하여 끌어 오기/업데이트/밀어 넣기 방식 (etag 준수)을 사용하여 IAM 정책의 전체지도를 업데이트하는 방법을 찾았습니다. IAM 엔드 포인트에

[] 

, 완전히 내 전체 프로젝트에서 멀리 심지어 소유자 권한을 모든 ACL을 불었다 : 그러나, 하나 개의 테스트 동안 내가 실수로 빈 페이로드를 보냈습니다! 다행스럽게도 이번에는 Dev 환경에서만 사용할 수 있었지만 매번 전체 페이로드를 POST하면 위험한 것처럼 보였습니다.

궁극적으로, 난 그냥 내가 원하는처럼 같은 바인딩 정책을 추가 gcloud 명령 줄 옵션 (https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding), 찾는 결국 :

gcloud 프로젝트를 추가 스피 정책 결합을

그리고 내 자바 코드에 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은 Java로 새로 생성 된 서비스 계정에 BigQuery ACL을 추가한다는 목표를 달성했습니다. 궁극적으로 SDK에서이 작업을 수행하는 적절한 방법을 찾고 싶지만, 지금은 프로젝트를 만족시키는 답을 찾은 것 같습니다.