我正在尝试从项目 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/