我创建了一个服务帐户并分配了以下角色:
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
有人能解释一下这种行为背后的原因吗?
谢谢
发布于 2019-12-20 14:30:44
发布于 2021-10-27 12:09:59
在创建项目之前,当我试图检查项目中是否已经存在一个桶时,我遇到了这个问题。在我的例子中,这个问题并不是说角色问题,因为我的服务帐户有一个存储管理、存储对象管理和创建者角色,但是我试图检查的桶名(从我的python代码中)不是全局唯一的。当我将桶的名称改为全局唯一的名称时,错误就消失了。
发布于 2019-12-20 11:27:41
这就是为什么我问您是否将这个桶转换为统一的桶级访问控制,还是创建它。我的理论是,你把它调到统一桶级,触发了这个免责声明。
警告:如果启用统一桶级访问,则可以撤消仅通过对象ACL获得访问权限的用户的访问权限。在启用统一桶级访问之前,请确保您在迁移现有存储桶时阅读了考虑事项。
这就是为什么当您手动添加角色时,它是工作的。
您可以更多地了解统一桶级访问权限是如何工作的,这里。
这里有更多关于正在发生的事情的相关信息。
此外,如果您启用统一的桶级访问作为创建新桶的一部分,则桶将自动接收额外的Cloud角色。此行为维护从桶的默认对象ACL继承的对象的权限。如果在现有桶上启用统一的桶级访问,则必须手动应用任何此类角色;如果更改了桶的默认对象ACL,则可能希望应用不同的角色集。
这也是我所理解的,是对我们所得到的错误的解释。
一旦启用,以下ACL功能将停止: 设置、读取或修改桶和对象ACL的请求失败,导致400个坏请求错误。
希望这能有所帮助。
https://stackoverflow.com/questions/59422730
复制相似问题