我在S3 API的前提下使用Cloudian Storage。我需要监视没有Cloudian管理员访问权限的存储桶的已用大小。
我使用AWS CLI:
./aws --endpoint-url=https://s3-edc.emea.svc.corpintra.net:443 s3api list-objects --bucket edcs3mposdocifyb --output json --query "{\"size\": sum(Contents[].Size), \"objects\": length(Contents[])}"
这大约需要3分钟,结果如下:
{
"size": 216317367311,
"objects": 756771
}
我尝试使用boto3通过以下python3脚本获得相同的信息。
import boto3
total_bucket_size = 0
total_bucket_objects = 0
s3 = boto3.resource('s3', aws_access_key_id="****", aws_secret_access_key="***", endpoint_url="https://my.cloudian.fqdn:443", verify="MyChain.cer")
bucket = s3.Bucket("mybucketname")
bucket_name = bucket.name
for obj in bucket.objects.all():
obj_key = obj.key
bucket_object = s3.Object(bucket_name, obj_key)
obj_size = int(bucket_object.content_length)
total_bucket_size += obj_size
total_bucket_objects += 1
print("%010d %s -> %d" %(total_bucket_objects,obj_key,obj_size))
print("Total size: %d" % total_bucket_size)
但是此代码将运行一些小时。
目标是将结果写入influxdb。使用InfluxDBClient for python非常容易。
任何人都知道为什么我的boto3代码要花这么长时间?我可以更改些什么来加快代码的速度?
[我找到了一种将python脚本使用的时间减少到4分钟的方法。
total_bucket_size = 0
total_bucket_objects = 0
s3 = boto3.resource('s3', aws_access_key_id="13c81dba2e4e78628c76", aws_secret_access_key="zLmJVNVx03BQaUokmu6bSROskArFKROhwVyoOdcT", endpoint_url="https://s3-edc.emea.svc.corpintra.net:443", verify="DaimlerChain.cer")
bucket = s3.Bucket("edcs3mposdocifyb")
bucket_name = bucket.name
for obj in bucket.objects.all():
obj_key = obj.key
#bucket_object = s3.Object(bucket_name, obj_key)
#obj_size = int(bucket_object.content_length)
obj_size = obj.size
total_bucket_size += obj_size
total_bucket_objects += 1
print("%010d %s -> %d" %(total_bucket_objects,obj_key,obj_size))
print("Total size: %d" % total_bucket_size)