将服务帐户与Dataflow一起使用-获取storage.objects.get访问错误

时间:2019-11-30 15:02:04

标签: java storage google-cloud-dataflow apache-beam

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

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

这很奇怪,因为我正在像这样的“数据流”作业选项中设置服务帐户凭据:

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的数据流作业的原因。

2 个答案:

答案 0 :(得分:1)

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

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

这里有一些examples,有关如何向存储桶添加成员以及role的云存储中的权限

答案 1 :(得分:0)

我认为这可能有效,如果不行,请通知我。

gs:// xxxx-bucket属于哪个项目?如果它属于项目A,并且项目B的服务帐户正在尝试访问它,则将出现权限错误。

请使用Google Cloud Console浏览到所有者项目中的存储桶,并授予服务帐户权限。

  • 使用左上方的菜单选择“存储”
  • 找到水桶
  • 选择“ ...”,
  • 然后“编辑存储桶权限”
  • “添加成员”
  • 添加要为其添加权限的服务帐户。