簡體   English   中英

Google Cloud Dataflow 服務帳戶未傳播給工作人員?

[英]Google Cloud Dataflow serviceaccount not propagated to workers?

我們有多個 Google Cloud Dataflow 作業(用 Java / Kotlin 編寫),它們可以以兩種不同的方式運行:

  1. 從用戶的 Google Cloud 帳號發起
  2. 從服務帳戶啟動(具有所需的策略和權限)

從用戶帳戶運行 Dataflow 作業時,Dataflow 會向工作人員提供默認控制器服務帳戶。 它不向工人提供授權用戶。

從 serviceaccount 運行 Dataflow 作業時,我想使用setGcpCredential設置的serviceaccount將傳播到 Dataflow 在后台使用的工作虛擬機。 JavaDocs沒有提到任何這些,但他們確實提到憑據用於對 GCP 服務進行身份驗證。

在 Dataflow 的大多數用例中,我們在項目 A 中運行 Dataflow 作業,而在項目 B 中從 BigQuery 中讀取數據。因此,我們為用戶提供了對項目 B 中 BigQuery 數據集的讀者訪問權限,以及使用的服務帳戶如上所述的第二種方式。 同一個 serviceaccount 還將在項目 A 中擁有BigQuery 的jobUser 和 dataViewer 角色。

現在,問題是,在這兩種情況下,我們似乎都需要為默認控制器服務帳戶提供對 Dataflow 作業中使用的 BigQuery 數據集的訪問權限。 如果我們不這樣做,當作業嘗試訪問項目 B 中的數據集時,我們將獲得 BigQuery 的權限被拒絕 (403)。對於所描述的第二種方式,我希望 Dataflow 獨立於默認值控制器服務帳戶。 我的預感是 Dataflow 不會將 PipelineOptions 中設置的 serviceaccount 傳播給工作人員。

通常,我們提供項目、區域、區域、臨時位置(gcpTempLocation、tempLocation、stagingLocation)、運行器類型(在本例中為 DataflowRunner)以及作為 PipelineOptions 的 gcpCredential。

那么,Google Cloud Dataflow 真的將提供的 serviceaccount 傳播給工作人員嗎?

更新

我們首先嘗試添加options.setServiceAccount ,如Magda 所示,而不添加 IAM 權限。 這會導致 Dataflow 日志中出現以下錯誤:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : " Current user cannot act as service account dataflow@project.iam.gserviceaccount.com. Causes: Current user cannot act as service account dataflow@project.iam.gserviceaccount.com..",
    "reason" : "forbidden"
  } ],
  "message" : " Current user cannot act as service account dataflow@project.iam.gserviceaccount.com.. Causes: Current user cannot act as service account dataflow@project.iam.gserviceaccount.com.",
  "status" : "PERMISSION_DENIED"
}

之后,我們嘗試將roles/iam.serviceAccountUser添加到此服務帳戶。 不幸的是,這導致了同樣的錯誤。 此服務帳戶已具有 IAM 角色 Dataflow 工作器和 BigQuery 作業用戶。 默認的計算引擎控制器 serviceaccount 123456-compute@developer.gserviceaccount.com只有 Editor 角色,我們沒有添加任何其他 IAM 角色/權限。

我認為您也需要設置控制器服務帳戶。 您可以在數據流管道選項中使用options.setServiceAccount("hereYourControllerServiceAccount@yourProject.iam.gserviceaccount.com")

您將需要添加一些額外的權限:

  • 對於控制器:Dataflow Worker 和 Storage Object Admin。

  • 對於執行者:服務帳戶用戶。

這就是我在 Google 的文檔中找到並自己嘗試的內容。

我認為這可能會給你一些見解:

為了讓 BigQuery 源和接收器正常運行,以下兩個帳號必須有權訪問您的 Cloud Dataflow 作業讀取或寫入的任何 BigQuery 數據集:

- 用於執行 Cloud Dataflow 作業的 GCP 帳戶

- 運行 Cloud Dataflow 作業的控制器服務帳號

例如,如果您的 GCP 帳戶是 abcde@gmail.com,並且您執行 Cloud Dataflow 作業的項目的項目編號是 123456789,則必須授予以下帳戶訪問所使用的 BigQuery 數據集的權限:abcde@gmail.com,和 123456789-compute@developer.gserviceaccount.com。

更多信息: https : //cloud.google.com/dataflow/docs/concepts/security-and-permissions#controller_service_account

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM