我正在尝试从项目 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的数据流作业的原因。
答案 0 :(得分:1)
在项目A中,您正在请求文件的存储桶中,应将服务帐户(来自项目B)添加到存储桶中,并授予读取权限()。
默认情况下,数据流使用GCE服务帐户,该帐户是在存储桶上进行写入/读取的帐户,也是访问其他Google Cloud API的帐户。
答案 1 :(得分:0)
我认为这可能有效,如果不行,请通知我。
gs:// xxxx-bucket属于哪个项目?如果它属于项目A,并且项目B的服务帐户正在尝试访问它,则将出现权限错误。
请使用Google Cloud Console浏览到所有者项目中的存储桶,并授予服务帐户权限。