我如何获得Amazon S3存储桶的大小?

我想绘制一个Amazon S3存储桶的大小(以字节为单位),并且正在寻找一种有效的方式来获取数据。

s3cmd工具提供了使用s3cmd du s3://bucket_name获取文件总大小的方法,但是我担心它的缩放能力,因为它看起来像是获取有关每个文件的数据并计算它自己的总和。 由于Amazon以GB-Months为用户收费,似乎很奇怪,他们不直接公开这个值。

尽pipeAmazon的REST API返回了一个桶中的项目数量,但s3cmd似乎没有公开它。 我可以做s3cmd ls -r s3://bucket_name | wc -l s3cmd ls -r s3://bucket_name | wc -l但是这看起来像一个黑客。

Ruby AWS :: S3库看起来很有前景,但只提供了存储桶的数量,而不是桶的总容量。

是否有人知道提供获取这些数据的方法的其他命令行工具或库(更喜欢Perl,PHP,Python或Ruby)?

AWS CLI现在支持带有JMESPathexpression式的--query参数。

这意味着您可以使用sum(Contents[].Size)list-objects给出的大小值进行sum(Contents[].Size)并计算length(Contents[])

这可以使用官方AWS CLI如下运行,并于2014年2月推出

  aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]" 

现在,只需使用官方的AWS命令行客户端即可完成此操作:

 aws s3 ls --summarize --human-readable --recursive s3://bucket-name/ 

官方文件

如果您不想统计整个存储桶,则也会接受path前缀:

 aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory 

s3cmd可以做到这一点:

s3cmd du s3://bucket-name

截至2015年7月28日,您可以通过CloudWatch获取此信息。 如果需要GUI,请转至CloudWatch控制台 :(select区域>)度量标准> S3

命令:

这比在这里发布的其他一些命令快得多,因为它不会单独查询每个文件的大小来计算总和。

  aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2015-07-15T10:00:00 --end-time 2015-07-31T01:00:00 --period 86400 --statistics Average --region eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=toukakoukan.com Name=StorageType,Value=StandardStorage 

重要说明 :您必须在维度参数中指定StorageType和BucketName,否则您将不会得到任何结果。 所有你需要改变的是--start-date--end-timeValue=toukakoukan.com


这里有一个bash脚本可以用来避免必须手动指定--start-date--end-time

 #!/bin/bash bucket=$1 now=$(date +%s) aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time "$(echo "$now - 86400" | bc)" --end-time "$now" --period 86400 --statistics Average --region eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage 

如果您下载使用情况报告 ,则可以绘制TimedStorage-ByteHrs字段的每日值。

如果你想在GiB中得到这个数字,只需要除以1024 * 1024 * 1024 * 24 (即24小时周期的GiB小时数)。 如果你想要以字节为单位的数字,只需除以24并图表。

使用官方的AWS s3命令行工具:

 aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}' 

s4cmd是我find的最快的方法(用Python编写的命令行工具):

 pip install s4cmd 

现在使用多个线程来计算整个桶大小:

 s4cmd du s3://bucket-name 

我使用了前面列出的S3 REST / Curl API ,并且这样做了:

 <?php if (!class_exists('S3')) require_once 'S3.php'; // Instantiate the class $s3 = new S3('accessKeyId', 'secretAccessKey'); S3::$useSSL = false; // List your buckets: echo "S3::listBuckets(): "; echo '<pre>' . print_r($s3->listBuckets(), 1). '</pre>'; $totalSize = 0; $objects = $s3->getBucket('name-of-your-bucket'); foreach ($objects as $name => $val) { // If you want to get the size of a particular directory, you can do // only that. // if (strpos($name, 'directory/sub-directory') !== false) $totalSize += $val['size']; } echo ($totalSize / 1024 / 1024 / 1024) . ' GB'; ?> 

因此,通过API浏览并播放相同的查询,S3将在一个请求中生成一个存储桶的全部内容,而不需要下载到目录中。 结果只需要通过各种XML元素进行求和,而不是重复调用。 我没有一个有数千个项目的样本桶,所以我不知道它会如何扩展,但看起来相当简单。

…有点晚,但是,我发现的最好方法是使用AWS门户中的报告。 我做了一个PHP类下载和parsing报告。 有了它,你可以得到每个桶的总体数量,总大小以GB或字节小时或更多。

检查出来,让我知道是否有帮助

AmazonTools

您可以使用s3cmd实用程序,例如:

 s3cmd du -H s3://Mybucket 97G s3://Mybucket/ 

对于一个真正的低技术方法:使用一个S3客户端,可以为您计算大小。 我正在使用Panic的传输,点击一个桶,做“获取信息”,然后点击“计算”button。 我不确定它与其他方法相比有多快或多less准确,但它似乎会缩小我所期望的大小。

既然有这么多的答案,我想我会用我自己的。 我使用LINQPad在C#中编写了我的实现。 复制,粘贴并input要查询的访问密钥,密钥,区域端点和存储桶名称。 另外,请确保添加AWSSDK nuget包。

testing了我的一个桶,它给了我128075和70.6GB的大小。 我知道这是99.9999%的准确,所以我很好的结果。

 void Main() { var s3Client = new AmazonS3Client("accessKey", "secretKey", RegionEndpoint.???); var stop = false; var objectsCount = 0; var objectsSize = 0L; var nextMarker = string.Empty; while (!stop) { var response = s3Client.ListObjects(new ListObjectsRequest { BucketName = "", Marker = nextMarker }); objectsCount += response.S3Objects.Count; objectsSize += response.S3Objects.Sum( o => o.Size); nextMarker = response.NextMarker; stop = response.S3Objects.Count < 1000; } new { Count = objectsCount, Size = objectsSize.BytesToString() }.Dump(); } static class Int64Extensions { public static string BytesToString( this long byteCount) { if (byteCount == 0) { return "0B"; } var suffix = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; var longBytes = Math.Abs(byteCount); var place = Convert.ToInt32(Math.Floor(Math.Log(longBytes, 1024))); var number = Math.Round(longBytes / Math.Pow(1024, place), 1); return string.Format("{0}{1}", Math.Sign(byteCount) * number, suffix[place]); } } 

我知道这是一个较老的问题,但这是一个PowerShell的例子:

Get-S3Object -BucketName <buckename> | select key, size | foreach {$A += $_.size}

$A包含存储桶的大小,如果您只想要存储桶中特定文件夹的大小,则存在一个keyname参数。

我build议使用大型存储区的 S3使用情况报告,请参阅我的如何获取数据。基本上,您需要使用定时存储 – 字节时间下载最后一天的S3服务使用情况报告,并parsing它以获取磁盘使用情况。

 cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n 

AWS文档告诉你如何做到这一点:

 aws s3 ls s3://bucketnanme --recursive --human-readable --summarize 

这是你得到的输出:

 2016-05-17 00:28:14 0 Bytes folder/ 2016-05-17 00:30:57 4.7 KiB folder/file.jpg 2016-05-17 00:31:00 108.9 KiB folder/file.png 2016-05-17 00:31:03 43.2 KiB folder/file.jpg 2016-05-17 00:31:08 158.6 KiB folder/file.jpg 2016-05-17 00:31:12 70.6 KiB folder/file.png 2016-05-17 00:43:50 64.1 KiB folder/folder/folder/folder/file.jpg Total Objects: 7 Total Size: 450.1 KiB 

嘿有一个适用于AWS S3的metdatasearch工具,位于https://s3search.p3-labs.com/ 。该工具通过search元数据提供有关桶中对象的静态数据。

另外Hanzo S3工具这样做。 一旦安装,你可以做:

 s3ls -s -H bucketname 

但是我相信这也是在客户端汇总的,而不是通过AWS API检索的。

通过Cloudberry程序也可以列出桶的大小,文件夹的数量和总文件,点击桶顶部的“属性”。

如果你不想使用命令行,在Windows和OSX上,有一个通用的远程文件pipe理应用程序叫做Cyber​​duck 。 使用您的访问/密钥对login到S3,右键单击该目录,单击Calculate

我写了一个Bash脚本,s3-du.sh将用s3ls列出桶中的文件,并打印文件数量和大小

 s3-du.sh testbucket.jonzobrist.com 149 files in bucket testbucket.jonzobrist.com 11760850920 B 11485205 KB 11216 MB 10 GB 

完整脚本:

 #!/bin/bash if [ “${1}” ] then NUM=0 COUNT=0 for N in `s3ls ${1} | awk '{print $11}' | grep [0-9]` do NUM=`expr $NUM + $N` ((COUNT++)) done KB=`expr ${NUM} / 1024` MB=`expr ${NUM} / 1048576` GB=`expr ${NUM} / 1073741824` echo “${COUNT} files in bucket ${1}” echo “${NUM} B” echo “${KB} KB” echo “${MB} MB” echo “${GB} GB” else echo “Usage : ${0} s3-bucket” exit 1 fi 

它会执行子目录大小,因为Amazon会返回目录名称及其所有内容的大小。

要检查所有桶大小,请尝试这个bash脚本

 s3list=`aws s3 ls | awk '{print $3}'` for s3dir in $s3list do echo $s3dir aws s3 ls "s3://$s3dir" --recursive --human-readable --summarize | grep "Total Size" done 

你可以使用s3cmd

 s3cmd du s3://Mybucket -H 

要么

 s3cmd du s3://Mybucket --human-readable 

它以可读的forms给出了桶的总体对象和大小。

以下方式使用AWS PHP SDK获取存储桶的总大小。

 // make sure that you are using correct region (where the bucket is) to get new Amazon S3 client $client = \Aws\S3\S3Client::factory(array('region' => $region)); // check if bucket exists if (!$client->doesBucketExist($bucket, $accept403 = true)) { return false; } // get bucket objects $objects = $client->getBucket(array('Bucket' => $bucket)); $total_size_bytes = 0; $contents = $objects['Contents']; // iterate through all contents to get total size foreach ($contents as $key => $value) { $total_bytes += $value['Size']; } $total_size_gb = $total_size_bytes / 1024 / 1024 / 1024; 

这对我有用..

 aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'