我想绘制一个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-time
, Value=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理应用程序叫做Cyberduck 。 使用您的访问/密钥对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"}'