我想绘制一个Amazon S3存储桶的大小(以字节为单位),并在寻找一种有效的方法来获取数据。使用s3cmd du s3://bucket_name的总文件大小,但是我担心它的扩展能力,因为它看起来像是获取有关每个文件的数据并计算自己的总和。由于Amazon按GB个月向用户收费,所以他们不直接公开此值似乎很奇怪。 。我可以执行s3cmd ls -r s3://bucket_name | wc -l,但这似乎是一个hack。 />是否有人知道任何其他命令行工具或库(更喜欢Perl,PHP,Python或Ruby)提供了获取此数据的方法?

评论

我编写了一个用于分析存储桶大小的工具:github.com/EverythingMe/ncdu-s3

我很惊讶亚马逊为这个空间收费,但没有提供仅由S3面板占用的S3存储桶的总大小。

对我来说,下面的大多数答案都花了很长时间才能检索存储桶大小,但是,此python脚本比大多数答案要快得多-slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-for-aws

#1 楼

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

这意味着您可以使用list-objectssum(Contents[].Size)给出的大小值求和,并像length(Contents[])一样计数。 2014年2月

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


评论


对于大存储桶(大#files),这太慢了。 Python实用程序s4cmd“ du”快如闪电:s4cmd du s3:// bucket-name

–布伦特·浮士德
15年3月31日在22:08

真奇怪。您的存储桶的总体概况如何(浅而胖/深而稀)?看起来s3cmd应该具有与AWS CLI相同的开销。在代码中,它显示s3cmd向存储桶中的每个目录发出请求。

–克里斯托弗·哈克特(Christopher Hackett)
2015年4月1日15:14



以人类可读的格式获取它:aws s3api --profile PROFILE_NAME列表对象--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”}'

–山迪普
2015年8月8日23:22



现在,AWS Cloudwatch提供了每个存储桶的“ BucketSizeBytes”度量标准,这不再是正确的解决方案。请参阅下面的Toukakoukan的答案。

–cce
15年9月24日在20:42

s4cmd du很棒,谢谢@Brent Faust!小提示(对于相关人员来说),您需要添加-r来获取子目录的大小。

– Greg Sadetsky
18年6月30日在21:06

#2 楼

现在,仅需使用官方的AWS命令行客户端即可轻松完成此操作:不想计算整个存储桶:

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


评论


这是最好的最新答案

– Tim
16-4-5在22:26

同意,这是最好的答案。

–路易斯·阿尔托拉(Luis Artola)
16年7月5日在17:28

对于包含许多文件的存储桶来说,这非常慢,因为它在显示摘要之前基本上列出了存储桶中的所有对象,并且它的速度并不比@Christopher Hackett的答案快得多-除非这有很多噪音。

–古斯
16年7月24日在23:19

如果您只对汇总大小感兴趣,那么这是最快,最新的解决方案,您可以简单地通过尾巴来查找该值。

–查理·希勒曼(Charlie Hileman)
18年6月26日在15:14

这将显示目录树中所有单个文件的大小。如果我只想要目录的总大小怎么办?

–克里斯F
18年7月16日在19:05



#3 楼

AWS控制台:

自2015年7月28日起,您可以通过CloudWatch获得此信息。如果需要GUI,请转到CloudWatch控制台:(选择Region>)Metrics> 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


重要:必须在维度参数中同时指定StorageType和BucketName您将不会获得任何结果。您需要更改的只是--start-date--end-timeValue=toukakoukan.com。这是一个bash脚本,您可以使用它来避免必须手动指定--start-date--end-time

#!/bin/bash
bucket=
region=
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


评论


或在CloudWatch控制台中:(选择Region>)Metrics> S3

–HalilÖzgür
16年1月7日在17:57

到目前为止,这是最简单,最快的解决方案。不幸的是,答案仍然仅排在第四位。

–luk2302
16-10-13在10:12

这为我的1000万个对象的存储桶工作。但是bash脚本未返回任何内容,必须转到GUI。

–佩塔
17 Mar 6 '17 at 19:36

还应注意,您还必须更改区域

– majikman
18-2-5在21:21

2018年5月:脚本错误,参数时间戳为无效值('1525354418'):时间戳类型为StartTime

–附件
18年5月3日在13:36

#4 楼

s3cmd可以执行以下操作:

s3cmd du s3://bucket-name

评论


谢谢。这是一些时间。在装有s3ql重复数据删除文件系统的存储桶中,该文件系统使用大约33 GB的未重复数据和大约93000个s3对象存储了大约一百万个文件,s3cmd du花费了大约4分钟来计算答案。我很好奇知道如何将其与其他方法(例如在此其他地方描述的php)进行比较。

–nealmcb
2012年7月10日23:46

这很慢,因为S3 ListObjects API调用以1000个对象的页面形式返回对象。由于I / O到目前为止是限制因素,我认为在93000个对象上,任何解决方案都相对较慢。

– David Snabel-Caunt
13年4月20日在13:54

s4cmd也可以做同样的事情,其附加好处是可以多线程处理对S3 API的请求,从而更快地计算结果。该工具最近尚未更新,但是互联网路人可能会发现它很有用。

–尼克·查马斯(Nick Chammas)
2014年7月7日在17:34

s4cmd仅为我返回0,并返回BotoClientError:使用子域或虚拟主机调用格式时,存储桶名称不能包含大写字符。用于具有大写字符的存储桶。

–拉基图
2015年10月5日20:52

#5 楼

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

如果要在GiB中使用该数字,只需除以1024 * 1024 * 1024 * 24(24小时周期的GiB小时)即可。 。如果要以字节为单位的数字,只需将其除以24并作图即可。

#6 楼

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

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


这是一个更好的命令,只需在--summarize --human-readable --recursive之后添加以下三个参数aws s3 ls即可。尽管可以很好地修饰总大小,但不需要--summarize

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


评论


请提供指向亚马逊实际声明的链接。我找不到

–lobi
15年7月31日在17:30



docs.aws.amazon.com/cli/latest/index.html

– dyltini
15年12月18日在15:35

docs.aws.amazon.com/cli/latest/reference/s3/ls.html是更好的链接

–伊恩·班福斯(Ian Bamforth)
16年4月8日在8:15

这个答案对我来说是最好,最快的。

–米罗
17年2月20日在18:36

最好和最快的答案!

– PlagTag
17年4月24日在15:23

#7 楼

如果要从AWS控制台获取大小:

转到S3并选择存储桶
单击“管理”选项卡



选择“指标”选项卡

默认情况下,您应该看到存储桶的存储指标

评论


在图中,我什么也没看到。只有当我将鼠标悬停在图形上方时,我才能看到出现的小点告诉我每天的总数。

–泰勒·科利尔(Tyler Collier)
3月13日17:50

#8 楼

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

pip install s4cmd


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

s4cmd du -r s3://bucket-name


评论


不,s4cmd du s3:// 123123drink不会简单地返回存储桶的大小。要获取存储桶的大小,请添加递归-r,如下所示:s4cmd du -r s3:// 123123drink

–牧岛寿吾
2015年11月9日在16:12

是的,@ BukLau很好(在上面的示例中将-r添加到上面,以避免在人们在S3上使用模拟文件夹时造成混淆)。

–布伦特·浮士德
18年4月9日在22:02

如果我们希望在计算版本桶时也考虑版本,该怎么办?

– DJ_Stuffy_K
12月19日15:42

#9 楼

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

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


评论


如果必须使用aws --profile saml s3 xyz之类的东西,我们如何使用它?

– DJ_Stuffy_K
12月19日18:22

#10 楼

因此,遍历API并播放一些相同的查询,S3会在一个请求中生成存储桶的全部内容,而无需下降到目录中。然后,结果仅需要汇总各种XML元素,而无需重复调用。我没有一个具有数千个项目的示例存储桶,所以我不知道它的扩展程度如何,但这似乎相当简单。

评论


这似乎是最好的选择。如果扩展性很差,将来我会更新此帖子,而我需要做其他事情。最终提供了对原始API结果的轻松访问的库是此PHP:undesigned.org.za/2007/10/22/amazon-s3-php-class

– Garret Heaton
09年11月16日在15:20

不仅限于前1000个项目吗?

– Charlie Schliesser
15年4月13日在18:30

#11 楼

我使用了此线程前面列出的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';
?>


#12 楼

...有点晚了,但是,我发现的最好方法是使用AWS门户中的报告。
我制作了一个PHP类,用于下载和解析报告。
有了它,您可以获得总数每个存储桶的对象数,总大小(以GB或字节小时为单位)以及更多。

检查一下,让我知道是否有帮助

AmazonTools

评论


这是一个有趣的解决方案,尽管有点不足。担心是否/当亚马逊更改其站点时会中断它,但是一旦我有足够的对象以至于其他方法变得太慢,我可能必须尝试一下。这种方法的另一个好处是您无需为任何API调用付费。

– Garret Heaton
09年12月21日在16:16

。 。 。这是一个假设,但是,如果Amazon确实改变了网站的外观,我怀疑他们会在很大程度上改变后端,这意味着当前的GET和POST查询应该可以工作。如果我经常使用它,无论如何它都会中断,我将维护该类。

– Corey Sewell
09-12-22在0:26

#13 楼

我建议对大型存储桶使用S3使用情况报告,有关如何获取它的方法,请参阅我的操作方法
。基本上,您需要在最后一天通过Timed Storage-Byte Hrs下载S3服务的使用情况报告并进行解析以获取磁盘使用情况。

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


#14 楼

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


#15 楼

对于真正的技术含量低的方法:使用可以为您计算大小的S3客户端。我正在使用Panic's Transmit,在存储桶上单​​击,执行“获取信息”,然后单击“计算”按钮。我不知道它相对于其他方法有多快或准确,但是似乎回退了我期望的大小。

#16 楼

既然答案很多,我想我会自己解决的。我使用LINQPad在C#中编写了实现。复制,粘贴并输入您要查询的访问密钥,秘密密钥,区域终结点和存储桶名称。另外,请确保添加AWSSDK nuget软件包。

我对其中一个存储桶进行了测试,它的计数为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]);
    }
}


#17 楼

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

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

$A包含存储桶的大小,如果您只是想存储桶中特定文件夹的大小。

评论


首先运行Get-object..line,然后运行$ A(对于不熟悉PowerShell的用户)

–法伊兹
16-09-30在10:34

#18 楼

要检查所有存储桶的大小,请尝试以下bash脚本

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


评论


这很棒。

– Mike Barlow-BarDev
18/09/14 '14:27

仅将输出捕获到变量中以使您可以对其进行循环是浪费的反模式。

–tripleee
18-10-8在6:52

#19 楼

您可以使用s3cmd

s3cmd du s3://Mybucket -H




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


它给出对象的总数和大小以易于阅读的形式存储桶。

评论


du遍历列出所有对象还是检索元数据?真的想要报告版本的api版本还是aws控制台中显示的内容...

–user67327
19年7月2日在22:52

#20 楼

嘿,https://s3search.p3-labs.com/上有一个适用于AWS S3的元数据搜索工具,该工具提供了有关存储桶中对象的统计信息以及对元数据的搜索。

#21 楼

Hanzo S3 Tools也可以做到这一点。安装后,您可以执行以下操作:

s3ls -s -H bucketname


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

#22 楼

通过Cloudberry程序,还可以列出存储桶的大小,文件夹数量和文件总数,然后单击存储桶顶部的“属性”。

#23 楼

如果您不想在Windows和OSX上使用命令行,则有一个名为Cyber​​duck的通用远程文件管理应用程序。使用访问/密钥对登录到S3,右键单击目录,然后单击Calculate

#24 楼

我写了一个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 [ “” ]
then
NUM=0
COUNT=0
for N in `s3ls  | awk ‘{print }’ | 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 ”
echo “${NUM} B”
echo “${KB} KB”
echo “${MB} MB”
echo “${GB} GB”
else
echo “Usage : q4312078q s3-bucket”
exit 1
fi    


它确实具有子目录的大小,因为Amazon返回目录名称及其所有内容的大小。

#25 楼

CloudWatch现在具有默认的S3服务仪表盘,该仪表盘在称为“平均桶大小字节”的图形中列出。我认为此链接对已经登录AWS控制台的任何人都有效:

#26 楼

以下方法使用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;


#27 楼

这对我有用。.

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


评论


您可以添加更多详细信息吗?

– Pierre.Vriens
16年4月14日在20:08

这基本上与大约一年前发布的另一个答案是相同的解决方案。

–路易
16年5月2日,11:41