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)
Chr*_*ett 204
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[])]"
Run Code Online (Sandbox Code Playgroud)
Sam*_*tin 170
自2015 年 7 月 28 日起,您可以通过 CloudWatch获取此信息。如果您需要 GUI,请转到CloudWatch 控制台:(选择区域 > )指标 > 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
Run Code Online (Sandbox Code Playgroud)
重要提示:您必须在维度参数中同时指定 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
Run Code Online (Sandbox Code Playgroud)
小智 110
s3cmd可以做到这一点:
s3cmd du s3://bucket-name
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 --recursive在aws s3 ls. --summarize不是必需的,但对总大小有很好的了解。
aws s3 ls s3://bucket/folder --summarize --human-readable --recursive
Run Code Online (Sandbox Code Playgroud)
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)
小智 9
您可以使用 s3cmd 实用程序,例如:
s3cmd du -H s3://Mybucket
97G s3://Mybucket/
Run Code Online (Sandbox Code Playgroud)
因此,通过 API 四处游荡并播放一些相同的查询,S3 将在一个请求中生成存储桶的全部内容,并且不需要深入到目录中。结果只需要通过各种 XML 元素求和,而不是重复调用。我没有包含数千个项目的示例存储桶,所以我不知道它的扩展性如何,但它看起来相当简单。
我使用了本线程前面列出的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)
| 归档时间: |
|
| 查看次数: |
367885 次 |
| 最近记录: |