将服务帐户与 Dataflow 结合使用 - 出现 storage.objects.get 访问错误
Using Service Account with Dataflow - Getting storage.objects.get access error
我正在尝试 运行 从项目 A 到项目 B 的数据流作业。
我可以毫无问题地执行项目 B 中的作业,但是当我尝试从项目 A 中的存储读取输入文件时,作业失败 "xxxxx-compute@developer.gserviceaccount.com does not have storage.objects.get access to gs://xxxx-bucket"
这很奇怪,因为我在 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 的数据流作业。
我相信这可能有效,如果无效请告诉我。
gs://xxxx-bucket属于哪个项目?如果它属于项目A,而项目B的服务帐户正在尝试访问它,则会出现权限错误。
请浏览到所有者项目中的存储桶,使用 Google Cloud Console 并授予服务帐户权限。
- 使用左上角的菜单select"Storage"
- 找到存储桶
- Select "...",
- 然后"Edit bucket permissions"
- "Add Members"
- 添加您要为其添加权限的服务帐户。
在项目 A 中,在您请求文件的存储桶中,您应该将服务帐户(来自项目 B)添加到存储桶并授予读取权限 ()。
默认情况下,dataflow 使用 GCE 服务帐户,这是 writes/reads 在存储桶上的帐户,也是访问其他 Google 云 API 的帐户。
云存储中有一些 examples about how to add members to your buckets and the permissions by role 可用
我正在尝试 运行 从项目 A 到项目 B 的数据流作业。
我可以毫无问题地执行项目 B 中的作业,但是当我尝试从项目 A 中的存储读取输入文件时,作业失败 "xxxxx-compute@developer.gserviceaccount.com does not have storage.objects.get access to gs://xxxx-bucket"
这很奇怪,因为我在 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 的数据流作业。
我相信这可能有效,如果无效请告诉我。
gs://xxxx-bucket属于哪个项目?如果它属于项目A,而项目B的服务帐户正在尝试访问它,则会出现权限错误。
请浏览到所有者项目中的存储桶,使用 Google Cloud Console 并授予服务帐户权限。
- 使用左上角的菜单select"Storage"
- 找到存储桶
- Select "...",
- 然后"Edit bucket permissions"
- "Add Members"
- 添加您要为其添加权限的服务帐户。
在项目 A 中,在您请求文件的存储桶中,您应该将服务帐户(来自项目 B)添加到存储桶并授予读取权限 ()。
默认情况下,dataflow 使用 GCE 服务帐户,这是 writes/reads 在存储桶上的帐户,也是访问其他 Google 云 API 的帐户。
云存储中有一些 examples about how to add members to your buckets and the permissions by role 可用