Getting the overall number and filesize quota of all your items in an S3 bucket is more complicated than you’d think, especially if your bucket contains more than a thousand items.
First you need to install the AWS-SDK gem.
gem install aws-sdk
With the AWS-SDK included, you can access your bucket and retrieve a list of objects inside it:
@aws_count = 0 @aws_size = 0 s3_object_count(s3_bucket_objects)
The counting itself, needs to be done recursively, as each call to
list_objects_v2 will only return a maximum number of 1000 objects:
# Get back S3 object listing, starting at start_after def s3_bucket_objects(start_after = nil) s3_connection = Aws::S3::Client.new( region: ENV["aws_region"], credentials: Aws::Credentials.new(<your_aws_access_key_id>, <your_aws_secret_access_key>) ) s3_connection.list_objects_v2( bucket: <your_aws_bucket>, start_after: start_after ) end # Recursively count objects from an S3 object listing def s3_object_count(bucket_objects) bucket_objects.contents.each do |object| unless object.nil? @aws_count += 1 @aws_size += object.size end end return if bucket_objects.is_truncated == false s3_object_count(s3_bucket_objects(bucket_objects.contents.last.key)) end
@aws_size now should reflect the number of objects and your filesize quota in bytes.
If you are using this with Rails, you can use the view helper
number_to_human_size inside your views to output
@aws_size in a more human friendly format, like ‘1.61 GB’.