从两个不同的Google云项目访问Google云端存储中的文件

时间:2014-07-14 14:24:51

标签: google-app-engine google-cloud-storage google-compute-engine google-cloud-platform

考虑以下情况:

  • 我有两个AppEngine项目:A和B
  • 我有一个带有以下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 - 与上述相同

看起来我用完了选项,但我无法相信云存储无法实现这么简单的事情。我想到的唯一解决方案是改变系统架构,但我想避免它。还有其他建议吗?

1 个答案:

答案 0 :(得分:6)

将访问者服务帐户(例如app1@appspot.gserviceaccount.com或1234567890-compute@developer.gserviceaccount.com用于计算引擎)添加为具有要使用的GCS存储桶的项目的“编辑者”权限的成员。这可以在拥有存储桶的项目的IAM页面中完成: https://console.developers.google.com/iam-admin/iam/project?project=app1