Google Cloud Dataflow 服务帐户未传播给工作人员?

Posted

技术标签:

【中文标题】Google Cloud Dataflow 服务帐户未传播给工作人员?【英文标题】:Google Cloud Dataflow serviceaccount not propagated to workers? 【发布时间】:2019-05-06 22:41:33 【问题描述】:

我们有多个 Google Cloud Dataflow 作业(用 Java / Kotlin 编写),它们可以以两种不同的方式运行:

    从用户的 Google Cloud 帐户启动 从服务帐户启动(具有所需的策略和权限)

从用户帐户运行 Dataflow 作业时,Dataflow 会向工作人员提供 default controller serviceaccount。它不向工作人员提供授权用户。

从服务帐户运行 Dataflow 作业时,我想使用 setGcpCredential 设置的服务帐户将传播到 Dataflow 在后台使用的工作虚拟机。 JavaDocs 没有提到任何这些,但他们确实提到了凭据用于对 GCP 服务进行身份验证。

在大多数 Dataflow 用例中,我们在项目 A 中运行 Dataflow 作业,同时在项目 B 中从 BigQuery 中读取数据。因此,我们为用户提供对项目 B 中 BigQuery 数据集的读取权限,以及上述第二种方式使用的 serviceaccount。在项目 A 中,相同的 serviceaccount 还将具有角色 jobUser 和 dataViewer for BigQuery。

现在的问题是,在这两种情况下,我们似乎都需要为默认控制器服务帐号提供对 Dataflow 作业中使用的 BigQuery 数据集的访问权限。如果我们不这样做,当作业尝试访问项目 B 中的数据集时,我们将获得 BigQuery 的权限被拒绝 (403)。 对于所描述的第二种方式,我希望 Dataflow 独立于默认控制器服务帐户。我的直觉是 Dataflow 不会将 PipelineOptions 中设置的服务帐户传播给工作人员。

一般来说,我们提供项目、区域、区域、临时位置(gcpTempLocation、tempLocation、stagingLocation)、运行器类型(在本例中为 DataflowRunner)和 gcpCredential 作为 PipelineOptions。

那么,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 作业用户。 默认计算引擎控制器服务帐户123456-compute@developer.gserviceaccount.com 仅具有编辑者角色,我们没有添加任何其他 IAM 角色/权限。

【问题讨论】:

你是怎么解决这个问题的? 【参考方案1】:

我认为您也需要设置控制器服务帐户。您可以在 Dataflow Pipeline Options 中使用options.setServiceAccount("hereYourControllerServiceAccount@yourProject.iam.gserviceaccount.com")

您需要添加一些额外的权限:

对于控制器:Dataflow Worker 和存储对象管理员。

对于执行者:服务帐户用户。

这是我在 Google 的文档中找到的并自己尝试一下。

我认为这可能会给你一些见解:

为使 BigQuery 源和接收器正常运行,请执行以下操作 两个帐户必须有权访问您的 Cloud 提供的任何 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

【讨论】:

您好,感谢您的回复!您回答的最后一部分可能是我们面临的问题。对于第一部分,关于在管道选项中设置服务帐户,这是我们尝试过的。尽管失败并显示“...不能代表服务帐户...”之类的消息 您是否在 IAM 中为服务帐户设置了适当的角色?或者你能显示更多日志吗? 我想我应该添加默认控制器服务帐户(所以当你不指定它时)是默认计算引擎服务帐户。 我已经用更多关于我们遇到的错误的信息更新了 OP。 正如我从您的更新中看到的那样,dataflow@project.iam.gserviceaccount.com 将成为新控制器,该控制器应具有 Dataflow Worker 和 Storage Object Admin Roles 以及您在 setGcpCredentials 中使用的控制器,所以您当前的用户应该有服务帐户用户。

以上是关于Google Cloud Dataflow 服务帐户未传播给工作人员?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Dataflow 和 Google Cloud Dataproc 有啥区别?

Scio:Apache Beam和Google Cloud Dataflow的Scala API

Google Cloud Dataflow:数据流编程模型的计算时间与普通 VM 机器上的计算时间相同吗?

在 google-cloud-dataflow 中使用文件模式匹配时如何获取文件名

到 Cloud Bigtable 的 Google Cloud Dataflow 管道中的异常

Google-cloud-dataflow:无法通过带有“BigQueryDisposition.WRITE_TRUNCATE”的“WriteToBigQuery/BigQuerySink”将 jso