GSUtil无权访问在app引擎中创建的对象

时间:2013-01-02 22:34:21

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

我的App Engine应用程序创建了一个对象。我现在正在尝试使用gsutil来更改acls但是即使我是项目的所有者也不能这样做:

$ gsutil getacl gs://mybucket/3c3765c2e7d4bfe6320c54fa4c8538dc.png
GSResponseError: status=403, code=AccessDenied, reason=Forbidden.

$ gsutil ls -L gs://mybucket/3c3765c2e7d4bfe6320c54fa4c8538dc.png
gs://mybucket/3c3765c2e7d4bfe6320c54fa4c8538dc.png:
    Creation time:  Mon, 31 Dec 2012 00:17:06 GMT
    Cache-Control:  public, max-age=3600, no-transform
    Content-Length: 30317
    Content-Type:   image/png
    ETag:           3df68afeffcba39dbfdf568d78bb4c72
    ACL:            ACCESS DENIED. Note: you need FULL_CONTROL permission
                    on the object to read its ACL.
TOTAL: 1 objects, 30317 bytes (29.61 KB)

为什么我没有FULL_CONTROL到这个对象?

来自https://groups.google.com/d/msg/gs-discussion/-aQISyaeeFo/9L_ML2SnV0MJ

1 个答案:

答案 0 :(得分:3)

App Engine通常使用应用程序的服务帐户访问Google云端存储。该服务帐户与您使用gsutil的Gmail帐户不同。

WRITEFULL_CONTROL访问存储桶意味着您可以删除对象。这并不意味着您可以读取对象或更改对象ACL。为此,您需要READFULL_CONTROL访问该对象。对象ACL与桶ACL正交。

所以发生的事情是:

  • bucket acl允许您和服务帐户写入存储桶。
  • 服务帐户创建一个新对象,应用存储桶的默认对象acl。
  • 水桶的default object acl不授予您对此对象的完全控制权。

运行gsutil getdefacl gs://mybucket并确保默认对象acl将您或您的某个组FULL_CONTROL授予新对象。

如果没有,则编辑xml文档以包含以下内容并运行gsutil setdefacl acl.xml gs://mybucket

<?xml version="1.0" ?>
<AccessControlList>
 <Entries>
  <Entry>
   <Scope type="UserByEmail">
    <EmailAddress>example@gmail.com</EmailAddress>
   </Scope>
   <Permission>FULL_CONTROL</Permission>
  </Entry>
  <Entry>
   <Scope type="GroupByEmail">
    <EmailAddress>foo@googlegroups.com</EmailAddress>
   </Scope>
   <Permission>FULL_CONTROL</Permission>
  </Entry>
  <Entry>
   <Scope type="GroupByEmail">
    <EmailAddress>group@mydomain.com</EmailAddress>
   </Scope>
   <Permission>FULL_CONTROL</Permission>
  </Entry>
 </Entries>
</AccessControlList>