如何使用服务帐户跨项目访问GCS存储桶对象?

时间:2017-03-22 18:16:41

标签: google-app-engine google-cloud-storage gcloud

我创建了一个Google App Engine应用,用于收听Google云端存储通知,每当在GCS上创建新对象时,应用都需要打开新对象并根据其内容执行操作。当app和gcs存储桶位于不同的项目中时,我无法访问对象内容。

配置:

我已在项目A中使用存储对象管理权限创建了一个服务帐户,并将GAE应用与之关联,并使用以下方式激活了服务帐户:

gcloud auth activate-service-account [ACCOUNT] --key-file=KEY_FILE

然后,我在与我的GAE应用程序相同的区域中的项目B中创建了一个存储桶 gs:// some_bucket ,并添加了我的服务帐户作为存储桶的所有者。

我使用"存储对象管理员"添加了我的服务帐户作为项目B的成员。权限。

我使用

在我的应用程序和存储桶之间创建了一个watchbucket通道
gsutil notification watchbucket -i [ChannelId] -t [Token] https://[app-name].appspot.com/ gs://some_bucket

我的应用程序现在正在接收发布请求,我可以解析它们,找到源存储桶,大小,对象名称等,但我无法自己读取对象。我收到以下错误。

{Location: ""; Message: "Access Denied: File gs://some_bucket/some_object: Access Denied"; Reason: "accessDenied"}

我在同一个项目(项目A)中测试了上述配置,我能够读取对象并对它们进行操作。这是一个我无法弄清楚的权限问题。

1 个答案:

答案 0 :(得分:3)

GCS Bucket权限与GCS对象权限不同,因为存储桶拥有者不会转换为对象所有者或具有对象访问权限。您可以使用以下命令以递归方式向存储桶中的所有现有GCS对象授予读取权限:

gsutil -m acl ch -u name@project.iam.gserviceaccount.com:R -r gs://example-bucket

将以递归方式向服务帐户授予对存储桶中所有对象的读取权限。

有人可能还想更改存储桶对象的默认权限,以便进入GCS存储桶的所有未来对象都具有所需的权限

gsutil defacl ch -u name@project.iam.gserviceaccount.com:READ gs://example-bucket

更改对象ACL:https://cloud.google.com/storage/docs/gsutil/commands/acl

更改默认对象ACL:https://cloud.google.com/storage/docs/gsutil/commands/defacl