如何使用 python boto3 获取 AWS 的 S3(所有存储桶)中每个对象的大小

我正在寻找我的 S3 AWS 账户中每个对象的大小。或者,列出大小超过 2 GB 的对象。

我试过按桶列出,我可以得到总大小:

s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket-name')
size = 0

for o in bucket.objects.all():    
        size += o.size    
print ('s3 size = %.3f GB' % (size/1024/1024/1024))

我试图找到类似于给出对象名称和大小的 AWS CLI 命令的输出。

我知道 S3 根据请求最多列出 1K 个对象(分页),我必须解析它。此外,如果存储桶很大(数百万到数十亿),上市将非常艰难。

非常感谢这里的任何输入。

谢谢

stack overflow How to get the size of each object in S3 (all buckets) for an AWS using python boto3
原文答案

答案:

作者头像

打印所有对象及其大小:

for o in bucket.objects.all():    
  print(o.key, o.size)   

只打印大于 2GB 的对象:

for o in bucket.objects.all():  
  if o.size > 2 * 1024 * 1024 * 1024:  
    print(o.key, o.size)   

但是,如果您有数百万个对象,我会推荐 Amazon S3 Inventory ,它可以提供每日或每周的 CSV 文件,列出所有对象(包括它们的大小)。

作者头像

添加一些东西: key.size 是一个 int 对象,你不能用 /1024 返回它,因为类型将是 float。我们可以这样做:

s3 = boto3.resource('s3')

bucket = s3.Bucket('bucket-name')
size = 0
for o in bucket.objects.all():    
    if o.size >= 1024 and o.size < 1024**2 : # obj.size is int
            o_size_pretty = obj.size/1024
            unit = 'KB'
        elif o.size >= 1024**2 and obj.size < 1024**3 :
            o_size_pretty = obj.size/(1024**2)
            unit = 'MB'
        elif o.size >= 1024**3:
            o_size_pretty = obj.size/(1024**3)
            unit = 'GB'
        else:
            o_size_pretty = obj.size
            unit = 'Bytes'
    print(f'{o.key} {o_size_pretty} {unit}')