批量更改谷歌云存储 ACL 权限


Batch Changing Google Cloud Storage ACL Permissions

我一直在通过与云存储桶直接关联的 App Engine 使用以下 ACL 属性制作文件。

$options = stream_context_create(['gs'=>['acl'=>'private']]);

如果我想编辑和查看 App Engine 脚本中的文件,这很好。但是,我希望能够从完全不同的Google App Engine Project ID访问这些文件。甚至是计算引擎。

将当前 ACL 设置为私有后,我意识到这可能是不可能的。

在具有这些私有 ACL 文件的存储桶中,我将不同项目 ID 的存储桶权限设置为所有者,并且它适用于未设置为私有的文件。

我想知道是否有我可以将存储桶中的所有文件批量更改为正确的 ACL。我有数百个文件,很难逐一完成。目前,如果我单击一个文件并查看其权限,则那里没有任何内容(因此是私有的)。


当我

尝试使用gsutil从文件中获取特定ACL时,这就是我得到的

$ gsutil acl get gs://bucket/file
AccessDeniedException: Access denied. Please ensure you have OWNER permission on gs://bucket/file

这是我使用 gsutil ch 命令添加用户组时得到的

$ gsutil acl ch -u <project_id>@appspot.gserviceaccount.com:W gs://bucket/file
ERROR 0313 15:29:18.896421 retry_decorator.py] Retrying in 1.00 seconds ...
Traceback (most recent call last):
File "/usr/lib/google-cloud-sdk/platform/gsutil/third_party/retry-decorator/retry_decorator/retry_decorator.py", line 20, in f_retry
return f(*args, **kwargs)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/commands/acl.py", line 372, in ApplyAclChanges
fields=['acl', 'generation', 'metageneration'])
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/cloud_api_delegator.py", line 199, in GetObjectMetadata
bucket_name, object_name, generation=generation, fields=fields)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 513, in GetObjectMetadata
generation=generation)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1018, in _TranslateExceptionAndRaise
raise translated_exception
AccessDeniedException: AccessDeniedException: 403 Forbidden
ERROR 0313 15:29:19.995003 retry_decorator.py] Retrying in 2.05 seconds ...
Traceback (most recent call last):
File "/usr/lib/google-cloud-sdk/platform/gsutil/third_party/retry-decorator/retry_decorator/retry_decorator.py", line 20, in f_retry
return f(*args, **kwargs)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/commands/acl.py", line 372, in ApplyAclChanges
fields=['acl', 'generation', 'metageneration'])
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/cloud_api_delegator.py", line 199, in GetObjectMetadata
bucket_name, object_name, generation=generation, fields=fields)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 513, in GetObjectMetadata
generation=generation)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1018, in _TranslateExceptionAndRaise
raise translated_exception
AccessDeniedException: AccessDeniedException: 403 Forbidden
AccessDeniedException: 403 Forbidden

假设我可能必须编写一个在我的应用程序引擎中运行的 php 脚本,该脚本遍历每个文件并更改或添加权限?

任何帮助将不胜感激,谢谢。

将 ACL 设置为私有后,只有创建对象的 AppEngine 服务帐户才能修改 ACL。

您可能必须使用其中一个 API 客户端库编写程序并在 AppEngine 上执行它。

或者,我相信默认的GCE服务帐户与AppEngine共享,因此,如果您创建具有devstorage.full_control范围的VM,我认为您应该能够在VM中使用gsutil修改ACL。

您可以运行 gsutil 命令 -acl 来更改对所有文件的访问权限,或者仅更改与某种模式匹配的文件的访问权限。

请务必对自己进行身份验证,否则 gsutil 将无法访问您的存储桶:https://cloud.google.com/storage/docs/gsutil_install#authenticate