我创建了一个服务帐户并分配了这些角色:
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 许可协议
我个人相信在开发/测试中没有必要回避过度授予角色。但是,如果您确实要赋予多个角色,那么不妨赋予一个管理员角色,而不是多个较小的角色(因为基本上他们都在做同样的工作,但角色较小)
对于您在这里的具体问题,我建议
storage.admin
和storage.object.admin
SO 上有一篇 类似的帖子,似乎以类似的方式解决了。
对于未来的读者:如果问题仍然存在,请完全卸载
gcloud-sdk
并使用最新版本重新安装( 使用此链接)。