Google Cloud Dataflow服务帐户没有传播给工作人员吗?

时间:2018-12-05 11:13:29

标签: java google-bigquery google-cloud-dataflow

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

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

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

从serviceaccount运行Dataflow作业时,我想象使用setGcpCredential设置的serviceaccount将被传播到Dataflow在后台使用的辅助VM。 JavaDocs没有提及任何这些,但他们确实提到凭据用于对GCP服务进行身份验证。

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

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

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

那么,Google Cloud Dataflow是否真的将提供的服务帐户传播给了工作人员?

更新

我们首先尝试添加Magda所示的options.setServiceAccount,而没有添加IAM权限。这会导致数据流日志出现以下错误:

{
  "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角色数据流工作程序和BigQuery作业用户。 默认的计算引擎控制器服务帐户123456-compute@developer.gserviceaccount.com仅具有编辑者角色,我们未添加任何其他IAM角色/权限。

1 个答案:

答案 0 :(得分:1)

我认为您也需要设置控制器服务帐户。您可以在“数据流管道选项”中使用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