考虑以下情况:
我有一个带有以下ACL的云存储桶:
<?xml version="1.0" ?>
<AccessControlList>
<Owner>
<ID>id-of-the-user-who-created-the-bucket</ID>
</Owner>
<Entries>
<Entry>
<Scope type="UserByEmail">
<EmailAddress>app-A-service-account-name</EmailAddress>
</Scope>
<Permission>FULL_CONTROL</Permission>
</Entry>
<Entry>
<Scope type="UserByEmail">
<EmailAddress>app-B-service-account-name</EmailAddress>
</Scope>
<Permission>FULL_CONTROL</Permission>
</Entry>
</Entries>
</AccessControlList>
我的GAE应用程序是用Python编写的,他们正在使用GCS Client Library
现在,这就是我想要实现的目标:我希望应用程序A在存储桶中创建文件,然后应用程序B来读取它们。
首先,我尝试使用cloudstorage.open(file_name, 'w')
创建一个文件,然后使用cloudstorage.stat(file_name, 'r')
读取其状态,但这样我在阅读时会遇到以下错误:
ForbiddenError at /.../
Expect status [200] from Google Storage. But got status 403.
(错误消息还提供请求/响应信息:路径,标题,正文和额外信息。如果您认为它们可能有助于解决此案例,请告诉我们)
然后我在创建文件时通过设置x-googl-acl
选项开始尝试ACL,例如:
cloudstorage.open(file_name, 'w', options={'x-goog-acl': 'authenticated-read'})
虽然ACL按预期工作,但没有一个可用的选项似乎符合我的要求:
private
- 只有存储桶拥有者具有访问权限,B无法读取public-read
- 文件可供匿名用户访问,不可接受public-read-write
- 与上述相同authenticated-read
- 拥有经过身份验证的帐户的所有人都可以阅读(即使是不属于该项目的人),因此与之前的选项没有区别bucket-owner-read
- 看起来很完美,但事实证明&#34;水桶老板&#34;不是被设置为&#34;所有者&#34;的用户通过云控制台,但创建存储桶的用户bucket-owner-full-control
- 与上述相同看起来我用完了选项,但我无法相信云存储无法实现这么简单的事情。我想到的唯一解决方案是改变系统架构,但我想避免它。还有其他建议吗?
答案 0 :(得分:6)
将访问者服务帐户(例如app1@appspot.gserviceaccount.com或1234567890-compute@developer.gserviceaccount.com用于计算引擎)添加为具有要使用的GCS存储桶的项目的“编辑者”权限的成员。这可以在拥有存储桶的项目的IAM页面中完成: https://console.developers.google.com/iam-admin/iam/project?project=app1