【问题标题】:Batch Changing Google Cloud Storage ACL Permissions批量更改 Google Cloud Storage ACL 权限
【发布时间】:2015-05-15 11:10:00
【问题描述】:

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

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

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

当前 ACL 设置为 private,我意识到这可能是不可能的。

在具有这些私有 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 脚本,该脚本会遍历每个文件并更改或添加权限?

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

【问题讨论】:

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


    【解决方案1】:

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

    您可能必须使用one of the API client libraries 编写一个程序并在 AppEngine 上执行它。

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

    【讨论】:

    • 我就是这么想的。你知道我可以用来在应用引擎中更改文件路径的 ACL 的命令吗?
    • 这是完全错误的。我一直通过 gsutil 将 ACL 从私有更改为公共。
    • @AndreiVolgin 仅在您对象的所有者时才有效。在这种情况下,所有者是 AppEngine 服务帐号,而不是用户。
    • @AndreiVolgin - 您的对象可能设置为 ACL project-private(默认值),这允许项目的任何所有者修改 ACL。这些对象创建为private允许所有者(在本例中为 AppEngine 服务帐户)修改 ACL。
    • 您可以从cloud.google.com/storage/docs/json_api/v1/json-api-php-samples 开始,而不是使用用户身份验证,而是从cloud.google.com/appengine/docs/php/appidentity 获取您的访问代码。然后您可以迭代对象 ($storageService-&gt;objects-&gt;listObjects) 并使用 'acl' =&gt; NULL'predefinedAcl' =&gt; 'projectPrivate' 修补它们的 acl ($storageService-&gt;object-&gt;patch) 以将 ACL 替换为预定义的 ACL。
    【解决方案2】:

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

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

    【讨论】:

    • 我在尝试获取权限时收到以下错误,所以我怀疑这是否可行,还有其他建议吗? $ gsutil acl get gs://bucket/file AccessDeniedException: Access denied. Please ensure you have OWNER permission on gs://bucket/file
    • 您需要先进行身份验证,然后 gsutil 才能访问您的存储桶:cloud.google.com/storage/docs/gsutil_install#authenticate
    • 你表现得好像我无权访问我的存储桶。当然我是认证的。计算引擎会立即通过身份验证。我只是不是来自计算引擎的文件的所有者。
    • 计算引擎与它无关。只要您对 您的 gsutil 进行身份验证,您就可以从任何计算机访问您的对象(无论 you 是否经过身份验证)。按照 gsutil 身份验证页面上的说明进行操作,它将起作用。我一直在使用它。
    猜你喜欢
    • 2012-11-16
    • 2018-07-20
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多