Java 谷歌云数据流服务帐户未传播到工作人员?

Java 谷歌云数据流服务帐户未传播到工作人员?,java,google-bigquery,google-cloud-dataflow,Java,Google Bigquery,Google Cloud Dataflow,我们有多个Google云数据流作业(用Java/Kotlin编写),它们可以以两种不同的方式运行: 从用户的Google云帐户启动 从serviceaccount启动(具有所需的策略和权限) 从用户帐户运行数据流作业时,数据流向工作人员提供数据流。它不向工人提供授权用户 当从serviceaccount运行数据流作业时,我设想使用设置的serviceaccount将传播到数据流在后台使用的工作虚拟机。他们没有提到任何这些,但他们确实提到凭据用于对GCP服务进行身份验证 在数据流的大多数用例中,我

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

  • 从用户的Google云帐户启动
  • 从serviceaccount启动(具有所需的策略和权限)
  • 从用户帐户运行数据流作业时,数据流向工作人员提供数据流。它不向工人提供授权用户

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

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

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

    通常,我们提供项目、区域、分区、临时位置(gcpTempLocation、tempLocation、stagingLocation)、流道类型(在本例中为DataflowRunner)和gcpCredential作为管道选项

    那么,谷歌云数据流真的会将提供的serviceaccount传播给员工吗

    更新

    我们首先尝试添加
    选项。如所示,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"
    }
    
    之后,我们尝试将
    角色/iam.serviceAccountUser
    添加到此服务帐户。不幸的是,这导致了同样的错误。此serviceaccount已具有IAM角色Dataflow worker和BigQuery作业用户。
    默认的计算引擎控制器serviceaccount
    123456-compute@developer.gserviceaccount.com
    只有编辑器角色,我们没有添加任何其他IAM角色/权限

    我认为您也需要设置控制器服务帐户。您可以使用选项。setServiceAccount(“hereYourControllerServiceAccount@yourProject.iam.gserviceaccount.com“”在数据流管道选项中

    您需要添加一些其他权限:

    • 对于控制器:数据流工作者和存储对象管理员

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

    这是我在谷歌的文档中找到的,我自己也尝试过

    我想这可能会给你一些启示:

    要使BigQuery源和接收器正常运行,请执行以下操作 两个帐户必须有权访问您的云所访问的任何BigQuery数据集 数据流作业读取或写入:

    -用于执行云数据流作业的GCP帐户

    -运行云数据流作业的控制器服务帐户

    例如,如果您的GCP帐户为abcde@gmail.com项目呢 执行云数据流作业的项目编号为 123456789,以下帐户都必须被授予访问 使用的BigQuery数据集:abcde@gmail.com,及 123456789-compute@developer.gserviceaccount.com.


    更多信息:

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