当前位置: 首页 > 知识库问答 >
问题:

Google Cloud Dataflow serviceaccount没有传播给员工?

万俟穆冉
2023-03-14

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

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

当从用户的帐户运行Dataflow作业时,Dataflow向工作者提供默认的控制器serviceaccount。它不向工人提供授权用户。

当从serviceaccount运行Dataflow作业时,我想象使用setGcpCredential设置的serviceaccount将传播到Dataflow在后台使用的工作VM。JavaDocs没有提到这一点,但它们确实提到了凭据用于对GCP服务进行身份验证。

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

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

通常,我们提供project、region、zone、临时位置(gcpTempLocation、tempLocation、stagingLocation)、runner类型(在本例中为DataflowRunner)和gcpCredential作为PipelineOptions。

那么,Google Cloud Dataflow真的将提供的serviceaccount传播给工人吗?

更新

我们首先尝试添加options.setServiceAccount(如Magda所示),而不添加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添加到这个服务帐户。不幸的是,这导致了同样的错误。此serviceaccount已具有IAM角色Dataflow worker和BigQuery作业用户。默认的计算引擎控制器serviceaccount123456-compute@developer.gServiceAccount.com只有编辑器角色,我们没有添加任何其他IAM角色/权限。

共有1个答案

翟沈义
2023-03-14

我想你也需要设置控制器服务帐户。可以在数据流管道选项中使用options.setServiceAccount(“HereyourControllerServiceAccount@yourProject.iam.gServiceAccount.com”)

您将需要添加一些附加权限:

>

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

    对于执行程序:服务帐户用户。

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

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

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

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

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

    例如,如果您的GCP帐户是abcde@gmail.com,并且执行云数据流作业的项目的项目号是123456789,则必须向以下帐户授予对所使用的BigQuery数据集的访问权限:abcde@gmail.com和123456789-compute@developer.gserviceAccount.com。

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

  •  类似资料:
    • 我有一个用于缓存图像的服务人员,这个服务人员只在前端模板中注册,但它仍会不断扩展到我的管理模板中。 这导致我的表单在验证令牌受到影响时表现得不可预测。 用一些安慰。日志我认为安装事件是在进入请求页面之前触发的,但我无法确定当前/下一个URL。 如何防止服务人员扩散到管理面板并干扰页面?我只想缓存资产。 就相关而言,这是我的服务人员:

    • 问题内容: 我有一个使用处理程序发布可运行实例的线程。它工作得很好,但是我很好奇我如何将参数传递给Runnable实例使用?也许我只是不了解此功能的工作原理。 为了避免出现“您为什么需要此问题”的问题,我有一个线程化的动画,必须调出UI线程来告诉它实际绘制的内容。 问题答案: 只需使用接受参数的构造函数实现的类就可以了, 您可以使用参数化构造函数创建Runnable类的实例。

    • 问题内容: docker-compose.yml: Dockerfile: 结果是: 我ing不休,为什么这不起作用。如果更改节点版本号,则该数字也会更改。 问题答案: 在compose文件上定义的参数在Dockerfile上可用,但仅在之前和之上可用。在参数不可用之后: 在a之前的声明位于构建阶段之外,因此不能在以后的任何指令中使用它。- 来自docker docs 为什么论点起作用? 。之后的

    • 我有一个内核模块(4.4.32内核),它通过将ioctl处理程序分配给< code > struct file _ operations 的< code>unlocked_ioctl指针来实现ioctl调用。一切正常,但是我得到的程序(只有二进制)是为2.6或者2.4内核编译的,如果我在4.4.32上启动这个程序,它不会让内核为我的模块注册一个对ioctl的调用。因为此程序是在旧内核上编译的,所以

    • 问题内容: 我正在一个Swift操场上玩,正在上一堂新课。由于某种原因,我不断收到这样的错误:类“没有成员类型”,其名称的常量前面定义了三行。这是代码: Xcode Beta6一直在倒数第二行给我一个错误,说“ DataModel.Type没有名为’myCalendar’的成员 尽管我认为这不会有所作为,但我尝试将myCalendar定义为var。 问题答案: 您无法初始化引用同一类的另一个实例属

    • 上面写着 随着动态添加的数据结构配置在所有集群成员之间传播,可能会由于超时和网络分区等情况而发生故障。只要检测到成员资格更改,配置传播机制就会在内部重试添加配置。 这给我的印象是配置会传播。