首页 > 解决方案 > 将服务帐户与 Dataflow 一起使用 - 获取 storage.objects.get 访问错误

问题描述

我正在尝试从项目A到项目B运行数据流作业。

我可以毫无问题地执行项目 B 中的作业,但是当我尝试从项目 A 的存储中读取输入文件时,作业失败并显示“xxxxx-compute@developer.gserviceaccount.com 没有 storage.objects.get 访问 gs ://xxxx-桶”

这很奇怪,因为我在 Dataflow 作业选项中设置服务帐户凭据,如下所示:

Set<String> scopeList = new HashSet<String>();
scopeList.addAll(DataflowScopes.all());

PipelineOptionsFactory.register(CustomOptions.class);
CustomOptions customOptions = PipelineOptionsFactory.fromArgs(args)
                                                            .withValidation()
                                                            .as(CustomOptions.class);


customOptions.setGcpCredential(GoogleCredentials.fromStream(new ByteArrayInputStream(credentialContent.getBytes())).createScoped(scopeList));

看起来之前的代码没有做任何事情,因为错误中显示的凭据是计算服务帐户,与我在管道选项中设置的不同。

也许我做错了什么。

数据流代码中服务帐户的权限是:

所有这些权限都在项目 B 中。这就是为什么我可以毫无问题地执行从项目 A 到项目 B 的数据流作业。

标签: javastoragegoogle-cloud-dataflowapache-beam

解决方案


在项目 A 中,在您请求文件的存储桶中,您应该将服务帐户(来自项目 B)添加到存储桶并授予读取权限()。

默认情况下,dataflow 使用 GCE 服务帐户,这是在存储桶上写入/读取的帐户,也是访问其他 Google Cloud API 的帐户。

以下是一些关于如何将成员添加到您的存储桶以及云存储中可用的角色权限的示例


推荐阅读