小编pio*_*ekw的帖子

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

考虑以下情况:

  • 我有两个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>
    
    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

6
推荐指数
1
解决办法
1250
查看次数