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

5
我创建了一个Google App Engine应用程序,监听Google Cloud Storage通知。每当在GCS上创建新对象时,该应用程序需要打开新对象并根据其内容执行操作。当应用程序和gcs存储桶位于不同的项目中时,我无法访问对象内容。 配置: 我在项目A中创建了一个具有“Storage Object Admin”权限的服务帐户,并将GAE应用程序与之关联。使用以下命令激活服务帐户:
gcloud auth activate-service-account [ACCOUNT] --key-file=KEY_FILE
然后,在与我的GAE应用程序相同的区域中,我在项目B中创建了一个名为gs://some_bucket的存储桶,并将我的服务帐户添加为存储桶的所有者。
我将我的服务帐户作为“Storage Object Admin”权限的成员添加到了项目B中。
我使用以下命令在我的应用程序和存储桶之间创建了一个watchbucket通道:
gsutil notification watchbucket -i [ChannelId] -t [Token] https://[app-name].appspot.com/ gs://some_bucket
现在,我的应用程序正在接收post请求,我可以解析它们,找到源存储桶、大小、对象名称等,但我无法读取对象本身。我得到了以下错误信息:
{Location: ""; Message: "Access Denied: File gs://some_bucket/some_object: Access Denied"; Reason: "accessDenied"}
我在同一项目(项目A)中测试了上述配置,并且能够读取对象并对其进行操作。这是一个我无法解决的权限问题。

项目A中的服务帐户需要读取存储桶和对象的内容的访问权限。您可以将其作为成员添加到项目B吗? - Brandon Yarbrough
是的,我已经将服务帐户添加为具有“存储对象管理员”权限的项目B成员。我还将服务帐户添加为源存储桶的桶所有者。 - ioverzero
拥有存储桶并不意味着可以读取对象。请尝试明确授予服务帐户对该特定对象的读取权限。 - Brandon Yarbrough
我明白了,这很有道理。当我将服务帐户显式设置为对象的所有者时,它可以正常工作。是否有一种自动化的方法,使得所有未来的对象都可以被服务帐户读取? - ioverzero
是的。存储桶具有“默认对象 ACL”属性,该属性指定除非另有指定,否则任何新对象都将具有的 ACL。 - Brandon Yarbrough
谢谢@BrandonYarbrough,我已经弄清楚了,存储桶权限与存储桶对象权限不同,我现在知道如何更改当前和未来对象的权限。 - ioverzero
1个回答

4
GCS Bucket权限与GCS对象权限不同,拥有Bucket所有权并不能转化为对象所有权或具有对象访问权限。您可以使用以下命令递归地向所有现有的GCS对象授予读取权限:
gsutil -m acl ch -u name@project.iam.gserviceaccount.com:R -r gs://example-bucket
这将递归地向Bucket中的所有对象授予服务帐号读取权限。
您可能还想更改Bucket对象默认权限,以便将来进入您的GCS Bucket的所有对象都具有所需的权限。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接