3

我的 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

4

1 回答 1

3

App Engine 通常使用应用的服务帐号来访问 Google Cloud Storage。服务帐户与您在 gsutil 中使用的 gmail 帐户是不同的用户。

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

所以正在发生的事情是:

  • 存储桶 acl 允许您和服务帐户写入存储桶。
  • 服务帐户创建一个新对象,应用存储桶的默认对象 acl。
  • 存储桶的默认对象 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>
于 2013-01-02T22:51:36.933 回答