【发布时间】: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 角色/权限。
【问题讨论】:
-
你是怎么解决这个问题的?
标签: java google-bigquery google-cloud-dataflow