2017-09-28 60 views
0

我正在使用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

回答

0

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)。

0

是的,事後看來,返回的錯誤信息顯然告訴我這樣,但它似乎是合理的(對相對谷歌雲新手),這是正確的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中這樣做的正確方法,但現在我覺得我找到了滿足我們項目的答案。

相關問題