【发布时间】:2019-07-25 03:24:32
【问题描述】:
我编写了一个脚本来计算 s3 存储桶中的对象数量和每个存储桶的总大小。当我针对几个测试存储桶运行代码时,该代码可以工作,但是当我包含所有生产存储桶时会超时。数以千计的对象。
import boto3
s3 = boto3.resource('s3')
bucket_list = []
bucket_size = {}
bucket_list = s3.buckets.all()
skip_list = ('some-test-bucket')
for bu in bucket_list:
if bu.name not in skip_list:
bucket_size[bu.name] = [0, 0]
print(bu.name)
for obj in bu.objects.all():
bucket_size[bu.name][0] += 1
bucket_size[bu.name][1] += obj.size
print("{0:30} {1:15} {2:10}".format("bucket", "count", "size"))
for i,j in bucket_size.items():
print("{0:30} {1:15} {2:10}".format(i, j[0], j[1]))
它开始运行,移动,然后像这样挂在某些桶上:
botocore.exceptions.ConnectTimeoutError: Connect timeout on endpoint URL:
没有像这样快速获取元数据的方法吗?从某种意义上说,这是一种艰难的方式——计算每个对象。
所以,我问的是是否有更好的脚本,而不是为什么它会超时。当我点击一些超时的存储桶时,我注意到那里有一些 .gz 文件。不知道为什么会很重要。
当然,我查看了文档,但我发现很难获得有意义的可操作信息。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html
【问题讨论】:
-
我建议使用 Boto3 客户端界面和 Boto3 分页器,而不是调用
bucket.objects.all()。喜欢这里的答案:stackoverflow.com/questions/49482274/…
标签: python-3.x amazon-web-services amazon-s3 boto3