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


我想绘制一个Amazon S3存储桶的大小(字节数和项目数),并且正在寻找获取数据的有效方法。

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

虽然 亚马逊的REST API 返回存储桶中的项目数, s3cmd 似乎没有暴露它。我可以 s3cmd ls -r s3://bucket_name | wc -l 但这似乎是一个黑客。

红宝石 AWS :: S3 库看起来很有前景,但只提供了桶数项,而不是总桶大小。

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


248
2017-11-15 00:40




我写了一个分析桶大小的工具: github.com/EverythingMe/ncdu-s3 - omribahumi
亚马逊对这个空间收费感到很惊讶,但是不要仅通过S3面板提供S3桶占用的总大小。 - Luke
对我来说,下面的大部分答案花了很长时间来检索桶大小,但是这个python脚本比大多数答案要快 - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


答案:


AWS CLI现在支持 --query 需要的参数 JMESPath 表达式。

这意味着您可以将给定的大小值相加 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[])]"

146
2017-11-16 23:00



对于大型桶(大型#files),这是非常缓慢的。 Python实用程序s4cmd“du”闪电般快速: s4cmd du s3://bucket-name - Brent Faust
真奇怪。你的水桶的整体轮廓是什么(浅和脂肪/深和薄)?看起来像 s3cmd 应该有相同的开销 AWS CLI。在里面 它显示的代码  s3cmd 请求存储桶中的每个目录。 - Christopher Hackett
以人类可读的格式获取它: aws s3api --profile PROFILE_NAME list-objects --bucket BUCKET_NAME --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 {print $0;next} NR==2 {print $0/1024/1024/1024" GB"}' - Sandeep
既然AWS Cloudwatch提供了“BucketSizeBytes”每桶指标,那么这不再是正确的解决方案。请参阅下面的Toukakoukan的答案。 - cce
s4cmd du 太棒了,谢谢@Brent浮士德!您需要添加的小注释(对于那些有关的人) -r 获取子目录的大小。 - Greg Sadetsky


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

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

官方文件

如果您不想计算整个存储桶,也会接受路径前缀:

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

254
2017-09-09 14:04



这是最好的和最新的答案 - Tim
同意,这是最好的答案。 - Luis Artola
这对于包含许多文件的存储桶来说非常慢,因为它在显示摘要之前基本上列出了存储桶中的所有对象,并且它并没有明显快于@Christopher Hackett的答案 - 除了这个更嘈杂。 - Guss
在具有相同存储区域的EC2实例上运行以改善延迟 - juanmirocks
如果您只对摘要大小感兴趣,那么这是最快速和最新的解决方案,您可以直接通过尾部查找该值。 - Charlie Hileman


AWS控制台:

作为 2015年7月28日 你可以得到这些信息 通过CloudWatch。如果您想要GUI,请转到 CloudWatch控制台:(选择“区域”>)“度量标准”>“S3”

AWS CLI命令:

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

 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

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


这是一个bash脚本,您可以使用它来避免必须指定 --start-date 和 --end-time 手动。

#!/bin/bash
bucket=$1
region=$2
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 $region --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage

104
2017-07-31 21:58



或者在 CloudWatch控制台:(选择“区域”>)“度量标准”>“S3” - Halil Özgür
这是迄今为止最简单,最快速的解决方案。不幸的是,答案仍然只排在第四位。 - luk2302
这对我的水桶有1000万个物体。但是bash脚本没有返回任何内容,不得不去GUI)。 - Petah
还应该注意的是,您还必须更改区域 - majikman
2018年5月:脚本错误 Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd 可以做到这一点:

s3cmd du s3://bucket-name


103
2017-07-08 13:40



谢谢。这是一些时机。在一个存放s3ql重复数据删除文件系统的存储桶上,大约有一百万个文件使用了大约33 GB的未填充数据,以及大约93000个s3对象,s3cmd du花了大约4分钟来计算答案。我很想知道如何与其他方法相比,如本文其他地方描述的php。 - nealmcb
它很慢因为 S3 ListObjects API调用 返回1000个对象的页面中的对象。由于I / O是迄今为止的限制因素,我认为任何解决方案都将相对较慢,超过93000个对象。 - David Snabel-Caunt
s4cmd 也可以做同样的事情,具有多线程请求到S3的API以更快地计算结果的额外好处。该工具最近尚未更新,但互联网过路人可能会发现它很有用。 - Nick Chammas
s4cmd只为我返回0,然后返回 BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. 对于具有大写字符的存储桶。 - Lakitu


如果你下载一个 使用报告,您可以绘制日常值的图表 TimedStorage-ByteHrs 领域。

如果您想在GiB中使用该数字,只需要除以 1024 * 1024 * 1024 * 24 (那是24小时循环的GiB小时)。如果你想要以字节为单位的数字,只需要除以24并绘制图形。


22
2017-12-05 17:22





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

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

16
2018-04-23 11:22



请提供指向亚马逊实际陈述此位置的链接。我找不到它。 - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html 是一个更好的链接 - Ian Bamforth
这个答案对我来说是最好和最快的。 - Miro
最好最快的答案! - PlagTag


s4cmd是我发现的最快的方法(用Python编写的命令行实用程序):

pip install s4cmd

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

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



没有, s4cmd du s3://123123drink 不会简单地返回桶的大小。要获得存储桶的大小,请添加递归 -r,像这样:s4cmd du -r s3:// 123123drink - George Chalhoub
是的,好点@BukLau(补充道 -r 上面的示例,以避免人们在S3上使用模拟文件夹时出现混淆。 - Brent Faust