我的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
答案 0 :(得分:3)
App Engine通常使用应用程序的服务帐户访问Google云端存储。该服务帐户与您使用gsutil的Gmail帐户不同。
让WRITE
或FULL_CONTROL
访问存储桶意味着您可以删除对象。这并不意味着您可以读取对象或更改对象ACL。为此,您需要READ
或FULL_CONTROL
访问该对象。对象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>