我正在编写一个使用Google的google-api-python-client浏览大量存储对象的程序,但我想知道是否有一种更有效的方式我可以使用它俯瞰?
目前我们总共有大约35_000个对象,并且我逐个遍历每个对象。
首先,我得到一个桶列表:
from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
credentials = ServiceAccountCredentials.from_json_keyfile_name('keyfile')
session = discovery.build('storage', 'v1', credentials=credentials)
def list_buckets():
all_buckets = session.buckets().list(project='project').execute()
return [bucket['name'] for bucket in all_buckets['items']]
然后我遍历我的存储桶列表并返回一个对象列表:
for bucket in list_buckets():
all_objects = session.objects().list(bucket=bucket)
然后我将上面结果中的每个名称和bucket_name附加到一个namedtuple,我再循环一次:
for obj in all_objects:
bucket_session = session.objectAccessControls().list(
bucket=obj.bucket,
object=obj.name).execute()
以上内容会附加到列表中,然后我最终遍历列表并检查权限。
你可以想象这需要花费一些时间来成千上万的对象,所以我想知道是否有人以更有效的方式做到了这一点?或许我应该使用更现代的谷歌云库?
答案 0 :(得分:1)
如果您的目标是处理每个对象的访问控制列表,则API支持返回对象的完整访问控制,作为存储桶列表的一部分。这可以节省对API的往返,以检索每个对象的访问控制。看起来你可以通过将projection
设置为" full"在google-cloud-python
' list_blobs函数。
gsutil -p your-project ls -L gs://*/**
还会为您提供your-project
中对象的所有访问控制的文本转储。
最后,为了在将来更轻松地进行审核,您可以考虑使用IAM在存储桶或项目级别管理访问权限,但这取决于您的使用案例。