用户没有存储桶的 storage.objects.list 访问权限

新手上路,请多包涵

我创建了一个服务帐户并分配了这些角色:

 Owner
Storage Admin
Storage Object Admin
Tester

Tester 是我为学习目的创建的角色,具有以下权限:

 storage.buckets.create
storage.buckets.delete
storage.buckets.get
storage.buckets.getIamPolicy
storage.buckets.list
storage.buckets.setIamPolicy
storage.buckets.update
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.getIamPolicy
storage.objects.list
storage.objects.setIamPolicy
storage.objects.update
...

我知道我不必要地过度使用这些角色的权限;但是,这仅用于测试目的。

考虑到存储桶只包含一个文件并且帐户具有相应的权限,下面的 Python 代码应该可以工作(在我的本地计算机上运行):

 from google.cloud import storage

if __name__ == '__main__':
    storage_client = storage.Client()
    bucket = storage_client.bucket('my-bucket-name')
    blobs = bucket.list_blobs()
    for blob in blobs:
        print(blob.name)

但它没有:

 Traceback (most recent call last):
  File "gcloud/test.py", line 8, in <module>
    for blob in blobs:
  File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 212, in _items_iter
    for page in self._page_iter(increment=False):
  File "/home/berkay/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 243, in _page_iter
    page = self._next_page()
  File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 369, in _next_page
    response = self._get_next_page_response()
  File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 419, in _get_next_page_response
    method=self._HTTP_METHOD, path=self.path, query_params=params
  File "/home/user/.local/lib/python3.6/site-packages/google/cloud/_http.py", line 421, in api_request
    raise exceptions.from_http_response(response)
google.api_core.exceptions.Forbidden: 403 GET LINK: USER does not have storage.objects.list access to BUCKET.

桶使用统一的桶级访问控制。我正在使用的服务帐户是此存储桶的成员,它从以下位置继承了此成员资格:

 Storage Admin
Storage Object Admin
Tester

有人可以向我解释这种行为背后的原因吗?

谢谢

原文由 deebug 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 757
2 个回答

我个人相信在开发/测试中没有必要回避过度授予角色。但是,如果您确实要赋予多个角色,那么不妨赋予一个管理员角色,而不是多个较小的角色(因为基本上他们都在做同样的工作,但角色较小)

对于您在这里的具体问题,我建议

  1. 删除您的旧服务帐户
  2. 创建一个新的服务帐户并授予角色 storage.adminstorage.object.admin
  3. 使用此服务帐号

SO 上有一篇 类似的帖子,似乎以类似的方式解决了。

对于未来的读者:如果问题仍然存在,请完全卸载 gcloud-sdk 并使用最新版本重新安装( 使用此链接)。

原文由 DUDANF 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在创建项目之前尝试检查项目中是否已经存在存储桶时遇到了这个问题,在我的情况下,这并不是每个角色的问题,因为我的服务帐户具有存储管理员、存储对象管理员和创建者角色,但结果是我试图检查存在/创建的存储桶名称(从我的 python 代码中)不是全局唯一的。当我将存储桶的名称更改为全局唯一的名称时,错误消失了。

原文由 Eva 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题