如何找到AWS S3 storage bucket 或文件夹的总大小?
亚马逊是否提供了一种简单的方法来查看我的S3桶或文件夹正在使用多少存储空间?这样我就可以计算我的成本,等等。
有两种方法。
Using aws cli
aws s3 ls --summarize --human-readable --recursive s3://bucket/folder/*
如果我们在最后省略/
,它将获得以你的文件夹名称开始的所有文件夹,并给出所有的总大小。
aws s3 ls --summarize --human-readable --recursive s3://bucket/folder
Using boto3 api
import boto3
def get_folder_size(bucket, prefix):
total_size = 0
for obj in boto3.resource('s3').Bucket(bucket).objects.filter(Prefix=prefix):
total_size += obj.size
return total_size
亚马逊已经改变了网络界面,所以现在你在 "更多 "菜单下有了 "获取尺寸"。
aws cli
电话相同吗?
- czende 2021-11-20
从2015年7月28日开始,你可以通过CloudWatch获得这些信息。
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 us-east-1
--metric-name BucketSizeBytes --dimensions Name=BucketName,Value=myBucketNameGoesHere
Name=StorageType,Value=StandardStorage
Important: You must specify both StorageType and BucketName in the dimensions argument otherwise you will get no results.
period
......即3天或更长时间,否则没有数据显示出来。86400秒的时间片不够长,无法得到任何数据点。
- Dale C. Anderson 2019-08-21
万一有人需要字节的精确性。
aws s3 ls --summarize --recursive s3://path | tail -1 | awk '{print $3}'
我使用s3cmd du s3://BUCKET/ --human-readable
查看 S3 中文件夹的大小。它以非常易读的形式提供了有关桶中对象总数及其大小的相当详细的信息。
使用AWS Web Console和Cloudwatch。
- 转到CloudWatch网站
- 从屏幕的左边点击 "指标"。
- 请点击S3
- 点击存储
你将看到一个所有桶的列表。请注意,这里有两个可能的混淆点。
一个。您只会看到存储桶中至少包含一个对象的存储桶。
湾。您可能看不到在其他区域创建的存储桶,您可能需要使用右上角的下拉菜单切换区域才能看到其他存储桶在 "搜索任何指标、尺寸或资源ID "的区域中搜索 "StandardStorage "一词。
- 选择您想计算总大小的桶(或在 "所有 "字样下方左侧的复选框中选择所有的桶)。
- 从屏幕右上方的时间栏中选择至少3d(3天)或更长的时间。
你现在会看到一个图表,显示在选定的时间段内所有选定的桶的每日(或其他单位)列表的大小。
作为替代方案,您可以尝试 s3cmd ,它有一个类似 Unix 的 du 命令。
如果你不需要精确的字节数,或者如果桶真的很大(TB或数百万个对象),使用CloudWatch度量是最快的方法,因为它不需要迭代所有对象,这可能需要大量的CPU,并且如果使用CLI命令,可能会以超时或网络错误而告终。
根据其他人在 SO 上运行 aws cloudwatch get-metric-statistics
命令的一些示例,我将其封装在一个有用的 Bash 函数中,该函数允许您有选择地为 aws
命令指定配置文件:
# print S3 bucket size and count
# usage: bsize <bucket> [profile]
function bsize() (
bucket=$1 profile=${2-default}
if [[ -z "$bucket" ]]; then
echo >&2 "bsize <bucket> [profile]"
return 1
fi
# ensure aws/jq/numfmt are installed
for bin in aws jq numfmt; do
if ! hash $bin 2> /dev/null; then
echo >&2 "Please install \"$_\" first!"
return 1
fi
done
# get bucket region
region=$(aws --profile $profile s3api get-bucket-location --bucket $bucket 2> /dev/null | jq -r '.LocationConstraint // "us-east-1"')
if [[ -z "$region" ]]; then
echo >&2 "Invalid bucket/profile name!"
return 1
fi
# get storage class (assumes
# all objects in same class)
sclass=$(aws --profile $profile s3api list-objects --bucket $bucket --max-items=1 2> /dev/null | jq -r '.Contents[].StorageClass // "STANDARD"')
case $sclass in
REDUCED_REDUNDANCY) sclass="ReducedRedundancyStorage" ;;
GLACIER) sclass="GlacierStorage" ;;
DEEP_ARCHIVE) sclass="DeepArchiveStorage" ;;
*) sclass="StandardStorage" ;;
esac
# _bsize <metric> <stype>
_bsize() {
metric=$1 stype=$2
utnow=$(date +%s)
aws --profile $profile cloudwatch get-metric-statistics --namespace AWS/S3 --start-time "$(echo "$utnow - 604800" | bc)" --end-time "$utnow" --period 604800 --statistics Average --region $region --metric-name $metric --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value="$stype" 2> /dev/null | jq -r '.Datapoints[].Average'
}
# _print <number> <units> <format> [suffix]
_print() {
number=$1 units=$2 format=$3 suffix=$4
if [[ -n "$number" ]]; then
numfmt --to="$units" --suffix="$suffix" --format="$format" $number | sed -En 's/([^0-9]+)$/ \1/p'
fi
}
_print "$(_bsize BucketSizeBytes $sclass)" iec-i "%10.2f" B
_print "$(_bsize NumberOfObjects AllStorageTypes)" si "%8.2f"
)
几条注意事项。
- 为简单起见,该函数假设桶中的所有对象都在同一个存储类别中!
- 在 macOS 上,使用
gnumfmt
而不是numfmt
。 - 如果
numfmt
抱怨--format
选项无效,请升级 GNUcoreutils
以获得浮点精度支持。
s3cmd du --human-readable --recursive s3://Bucket_Name/
有许多方法来计算桶中的文件夹的总大小
使用AWS Console
S3 Buckets > #Bucket > #folder > Actions > 计算总的大小
使用AWS的CLI
aws s3 ls s3://YOUR_BUCKET/YOUR_FOLDER/ --recursive --human-readable --summarize
该命令的输出结果显示。
- 对象被创建的日期
- 每个对象的单独文件大小
- 每个对象的路径,s3桶中对象的总数量
- 桶中对象的总大小
使用 Bash 脚本
#!/bin/bash
while IFS= read -r line;
do
echo $line
aws s3 ls --summarize --human-readable --recursive s3://#bucket/$line --region #region | tail -n 2 | awk '{print $1 $2 $3 $4}'
echo "----------"
done < folder-name.txt
样本输出。
test1/
TotalObjects:10
TotalSize:2.1KiB
----------
s3folder1/
TotalObjects:2
TotalSize:18.2KiB
----------
testfolder/
TotalObjects:1
TotalSize:112 Mib
----------
为GET操作的AWS定价。
S3 列表操作每 1,000 个请求的成本约为 $0.005
,其中每个请求最多返回区域中的 1,000 个对象。
例如:"我是说,我是说。
如果你的文件夹包含1,000,000个对象,你将发出1,000个请求,而List操作将花费你0.005美元。
在这里找到。
aws s3api list-objects --bucket cyclops-images --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 {print $0;next} NR==2 {print $0/1024/1024/1024" GB"}'
您可以访问这个URL,在S3的"Metrics"标签上查看您的桶的大小。https://s3.console.aws.amazon.com/s3/buckets/{YOUR_BUCKET_NAME}? region={YOUR_REGION}& tab=metrics
数据实际上是在CloudWatch中,所以你可以直接去那里,然后将你感兴趣的桶保存到仪表板中。
在NodeJs中
const getAllFileList = (s3bucket, prefix = null, token = null, files = []) => {
var opts = { Bucket: s3bucket, Prefix: prefix };
let s3 = awshelper.getS3Instance();
if (token) opts.ContinuationToken = token;
return new Promise(function (resolve, reject) {
s3.listObjectsV2(opts, async (err, data) => {
files = files.concat(data.Contents);
if (data.IsTruncated) {
resolve(
await getAllFileList(
s3bucket,
prefix,
data.NextContinuationToken,
files
)
);
} else {
resolve(files);
}
});
});
};
const calculateSize = async (bucket, prefix) => {
let fileList = await getAllFileList(bucket, prefix);
let size = 0;
for (let i = 0; i < fileList.length; i++) {
size += fileList[i].Size;
}
return size;
};
现在只需打电话给calculateSize("YOUR_BUCKET_NAME","YOUR_FOLDER_NAME")