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

Gar*_*ton 362 disk-space-utilization amazon-s3 amazon-web-services aws-cli

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

s3cmd工具提供一种方式来获得使用总文件大小s3cmd du s3://bucket_name,但我担心它的能力,规模,因为它看起来像它获取每个文件的数据,并计算其自身的总和。由于亚马逊以 GB 月为单位向用户收费,因此他们不直接公开此值似乎很奇怪。

尽管Amazon 的 REST API 会返回存储桶中的项目数,但s3cmd似乎并未公开它。我可以做,s3cmd ls -r s3://bucket_name | wc -l但这似乎是一个黑客。

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

有没有人知道提供获取这些数据的方法的任何其他命令行工具或库(首选 Perl、PHP、Python 或 Ruby)?

phi*_*lls 446

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

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/
Run Code Online (Sandbox Code Playgroud)

官方文档:AWS CLI 命令参考(版本 2)

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

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
Run Code Online (Sandbox Code Playgroud)

  • 这对于包含许多文件的存储桶来说非常慢,因为它在显示摘要之前基本上列出了存储桶中的所有对象,并且它并没有比@Christopher Hackett 的答案快得多 - 除了这个问题更加嘈杂。 (40认同)
  • 这是最好的和最新的答案 (28认同)
  • 这将显示目录树中所有单个文件的大小。如果我只想计算目录的总大小怎么办? (5认同)
  • 对于大桶,请查看 Bahreini 的答案。在 S3 控制台中,转到您的存储桶 > 管理 > 指标。您可以查看总使用量并按前缀、标签等过滤。 https://serverfault.com/a/981112/226067 (5认同)
  • 同意,这是最好的答案。 (3认同)
  • 如果您只对摘要大小感兴趣,这是最快和最新的解决方案,您可以简单地通过 tail 管道找到该值。 (2认同)
  • 我想添加| tail -2 以避免洪水。 (2认同)

Chr*_*ett 204

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

这意味着您可以对通过list-objects使用sum(Contents[].Size)和计数给出的大小值求和length(Contents[])

这可以使用官方 AWS CLI 运行,如下所示,并于20142 月推出

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

  • 对于大存储桶(大#files),这非常慢。Python 实用程序 s4cmd "du" 快如闪电:`s4cmd du s3://bucket-name` (32认同)
  • 以人类可读的格式获取它:`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"}'` (29认同)
  • 现在 AWS Cloudwatch 为每个存储桶提供“BucketSizeBytes”指标,这不再是正确的解决方案。请参阅下面的 Toukakoukan 的回答。 (27认同)
  • `s4cmd du` 很棒,谢谢@Brent Faust!小提示(对于相关人员),您还需要添加`-r` 来获取子目录的大小。 (3认同)

Sam*_*tin 170

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
Run Code Online (Sandbox Code Playgroud)

重要提示:您必须在维度参数中同时指定 StorageType 和 BucketName,否则您将不会得到任何结果。所有你需要的变化是--start-date--end-timeValue=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
Run Code Online (Sandbox Code Playgroud)

  • 或在 [CloudWatch 控制台](https://console.aws.amazon.com/cloudwatch/) 中:(选择区域 > )指标 > S3 (27认同)
  • 这是迄今为止最简单和最快的解决方案。不幸的是,答案仍然只排在第四位。 (3认同)

小智 110

s3cmd可以做到这一点:

s3cmd du s3://bucket-name

  • [s4cmd](https://github.com/bloomreach/s4cmd) 也可以做同样的事情,额外的好处是对 S3 的 API 的请求进行多线程处理以更快地计算结果。该工具最近没有更新,但互联网上的路人可能会发现它很有用。 (12认同)
  • 它很慢,因为 [S3 ListObjects API 调用](http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysUsingAPIs.html) 返回 1000 个对象页面中的对象。由于 I/O 是迄今为止的限制因素,我认为任何解决方案在超过 93000 个对象时都会相对较慢。 (2认同)

Chr*_*ltz 25

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

如果您想要 GiB 中的该数字,只需除以1024 * 1024 * 1024 * 24(即 24 小时周期的 GiB 小时)。如果您想要以字节为单位的数字,只需除以 24 并绘制图形即可。


dyl*_*ini 22

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

aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'
Run Code Online (Sandbox Code Playgroud)

这是一个更好的命令,只需--summarize --human-readable --recursiveaws s3 ls. --summarize不是必需的,但对总大小有很好的了解。

aws s3 ls s3://bucket/folder --summarize --human-readable --recursive
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对我来说是最好和最快的。 (4认同)
  • 最好最快的答案! (2认同)

Hoo*_*ini 20

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

  1. 转到 S3 并选择存储桶
  2. 点击“管理”标签

在此处输入图片说明

  1. 选择指标选项卡

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


Bre*_*ust 15

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

pip install s4cmd
Run Code Online (Sandbox Code Playgroud)

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

s4cmd du -r s3://bucket-name
Run Code Online (Sandbox Code Playgroud)

  • 不,`s4cmd du s3://123123drink` 不会简单地返回桶的大小。要获得存储桶的大小,您需要添加递归`-r`,如下所示:s4cmd du -r s3://123123drink (8认同)

小智 9

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

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
Run Code Online (Sandbox Code Playgroud)


Jim*_*ski 6

因此,通过 API 四处游荡并播放一些相同的查询,S3 将在一个请求中生成存储桶的全部内容,并且不需要深入到目录中。结果只需要通过各种 XML 元素求和,而不是重复调用。我没有包含数千个项目的示例存储桶,所以我不知道它的扩展性如何,但它看起来相当简单。


Vic*_*Vic 6

我使用了本线程前面列出的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';
?>
Run Code Online (Sandbox Code Playgroud)