java - 将服务帐户与数据流结合使用 - 出现 storage.objects.get 访问错误

标签 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 的数据流作业。

最佳答案

我相信这可能有效,如果无效,请告诉我。

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

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

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

关于java - 将服务帐户与数据流结合使用 - 出现 storage.objects.get 访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59117354/

相关文章:

java - 如何正确转义 JSP 标签中的三重嵌套引号

java - 如何插入 GridbagLayout 不在 JPanel 的中心放置组件

google-cloud-dataflow - apache beam 流式传输和同时处理多个文件和窗口连接?

java - 在 Java 中验证图像尺寸是否正常,无需使用 ImageMagick 或 ImageIO

java - 没有明显原因的可选数据异常

ios - 在 ios 中集成 Sandisk Connect 无线棒

ios - 如何防止在 iOS 应用程序中备份用户数据?

c++ - 如何提高多相机设置的写入速度?

java - 即使设置了 tempLocation 和 gcpTempLocation,数据流作业也始终会创建新的默认存储桶?

python - 如何在 Apache Beam Python 中获取窗口时间戳的结束