考虑以下情况:
我有一个带有以下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>
Run Code Online (Sandbox Code Playgroud)我的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.
Run Code Online (Sandbox Code Playgroud)
(错误消息还提供请求/响应信息:路径,标题,正文和额外信息.如果您认为它们可能有助于解决此案例,请告诉我)
然后我通过x-googl-acl在创建文件时设置选项来开始试验ACL ,例如:
cloudstorage.open(file_name, 'w', options={'x-goog-acl': 'authenticated-read'})
Run Code Online (Sandbox Code Playgroud)
尽管ACL按预期工作,但可用的选项似乎都不符合我的要求:
private - 只有存储桶拥有者具有访问权限,B无法读取public-read - 匿名用户可以访问文件,这是不可接受的public-read-write - 与上述相同authenticated-read - 每个拥有经过身份验证的帐户的人都能够阅读(即使是不属于该项目的人),所以它与之前的选项没有什么不同bucket-owner-read - 看起来很完美,但事实证明"桶主"不是通过云控制台设置为"所有者"的用户,而是创建存储桶的用户bucket-owner-full-control - …google-app-engine google-cloud-storage google-compute-engine google-cloud-platform