如何找到AWS S3 storage bucket 或文件夹的总大小?

回答 16 浏览 11.6万 2015-08-24

亚马逊是否提供了一种简单的方法来查看我的S3桶或文件夹正在使用多少存储空间?这样我就可以计算我的成本,等等。

VernonFuller 提问于2015-08-24
这里有很多选择。serverfault.com/questions/84815/…jarmod 2015-08-24
16 个回答
#1楼
得票数 89

有两种方法。

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
Dipankar 提问于2016-12-20
Yves M. 修改于2019-03-14
只适用于小桶,因为它要求每个对象的元数据。在这种情况下,+1geekQ 2017-07-07
不工作,列出所有的文件和它们各自的大小,而不考虑尾部斜线。slothstronaut 2017-12-25
如果不列出所有的文件,只列出总的大小,请添加"| grep Size"。Parth Gupta 2020-05-26
aws s3 ls s3://bucket_name/folder/ --summarize --human-readable --recursive (选项按照当前文档的要求)theDbGuy 2020-05-31
警告:这将向S3发出一个列表请求。如果你正在处理数以百万计的小对象,这可能会很快变得昂贵。目前,1千次请求是0.005美元,你可以想象,如果你有几十亿个对象需要收集尺寸元数据,这将是什么情况。使用控制台用户界面中的获取大小按钮也会产生类似的费用。Jake 2020-08-12
#2楼
得票数 58

亚马逊已经改变了网络界面,所以现在你在 "更多 "菜单下有了 "获取尺寸"。

Izik Golan 提问于2017-09-01
这应该是唯一的答案。没有必要使用命令行工具。slothstronaut 2017-12-25
这不是只对选定的文件而不是整个桶起作用吗?kevlarr 2018-03-21
@kevlarr 是的,但你可以用顶部的复选框选择所有的文件,它将为你递归计算大小。Ian Hunter 2018-04-04
@kevlarr 在S3中花费了太多的时间后,我需要修正我的声明......界面页面一次由300个对象组成,所以如果你有超过300个根级对象,你就需要逐页查看,并将它们加起来Ian Hunter 2018-04-04
@Eduardo 你告诉我,当你在比较200个独立桶的大小时,你对这一评论的感受是什么?Nick Bull 2018-07-18
#3楼
得票数 33

答案已更新为2021年 :)

在您的AWS控制台,在S3桶下,找到桶,或桶内的文件夹,然后点击Calculate total size.

enter image description here

dzona 提问于2021-01-26
它的费用是多少?它与aws cli电话相同吗?czende 2021-11-20
没有检查过,但我可以假设它的成本是一样的。dzona 2022-07-05
#4楼
得票数 22

从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.
VernonFuller 提问于2015-08-24
这在控制台中也是可见的。注意S3的水桶是区域性的,所以检查你放置水桶的任何区域很重要。tedder42 2015-08-25
运行良好,但CloudWatch暗示了一些延迟。我的备份桶花了几个小时才出现。有一个 "1小时 "的窗口并不能让我信服,因为我是在9点49分写的这篇文章,而我最近的可见日志是在昨天,7点03分。我想使用详细的CW指标会有帮助。Balmipour 2017-04-05
对我来说,没有任何结果。{ "Datapoints":[], "Label":"BucketSizeBytes" }这个桶已经上线几天了。abrkn 2017-12-18
我发现,除非我选择一个较长的period......即3天或更长时间,否则没有数据显示出来。86400秒的时间片不够长,无法得到任何数据点。Dale C. Anderson 2019-08-21
我现在正在看我的指标,它似乎是每天在18:00 UTC报告一次指标。这似乎是比较许多桶的总规模的最佳方式。虽然我在 cloudwatch UI 中检查了它,但指标名称是一致的。Nathan Loyer 2019-11-18
#5楼
得票数 17

万一有人需要字节的精确性。

aws s3 ls --summarize --recursive s3://path | tail -1 | awk '{print $3}'
Vladimir Avdoshka 提问于2021-03-15
使用powershell:aws s3 ls s3://path/ --recursive --summarize --human-readable | Select -Last 2Raj Rao 2022-04-15
#6楼
得票数 12

答案调整为2020年:进入你的桶,选择所有的文件夹、文件,然后点击"行动"->"获取总大小"。enter image description here

Jim Bantanis-Kapirnas 提问于2020-08-25
内部发生了什么事?Dev 2020-12-29
#7楼
得票数 9

我使用s3cmd du s3://BUCKET/ --human-readable 查看 S3 中文件夹的大小。它以非常易读的形式提供了有关桶中对象总数及其大小的相当详细的信息。

bpathak 提问于2016-07-21
#8楼
得票数 9

使用AWS Web Console和Cloudwatch。

  1. 转到CloudWatch网站
  2. 从屏幕的左边点击 "指标"。
  3. 请点击S3
  4. 点击存储
  5. 你将看到一个所有桶的列表。请注意,这里有两个可能的混淆点。

    一个。您只会看到存储桶中至少包含一个对象的存储桶。
    湾。您可能看不到在其他区域创建的存储桶,您可能需要使用右上角的下拉菜单切换区域才能看到其他存储桶

  6. 在 "搜索任何指标、尺寸或资源ID "的区域中搜索 "StandardStorage "一词。

  7. 选择您想计算总大小的桶(或在 "所有 "字样下方左侧的复选框中选择所有的桶)。
  8. 从屏幕右上方的时间栏中选择至少3d(3天)或更长的时间。

你现在会看到一个图表,显示在选定的时间段内所有选定的桶的每日(或其他单位)列表的大小。

SnapShot 提问于2019-07-09
我不明白为什么在显示任何数据之前需要选择这么长的时间片:-()Dale C. Anderson 2019-08-21
#9楼
得票数 6

最近和最简单的方法是进入"Metric"选项卡。 它提供了对桶的大小和里面的对象数量的清晰了解。

Metrics

Kyrylo Kravets 提问于2021-02-16
这很有趣,尽管如果其他人像我一样注意到它是空的(我怀疑这个数据会滞后),但值得注意的是,其他一个答案中提到的 "计算总尺寸 "选项似乎可以直接工作。Dennis Jaheruddin 2021-07-27
@DennisJaheruddin,确实如此。Kyrylo Kravets 2021-07-27
我很高兴看到这个答案,因为所有其他的选项都会因为查询存储在桶中的每一个对象而产生非同小可的费用。cbreezier 2021-12-02
#10楼
得票数 2

作为替代方案,您可以尝试 s3cmd ,它有一个类似 Unix 的 du 命令。

Edson Marquezani Filho 提问于2015-08-25
#11楼
得票数 2

如果你不需要精确的字节数,或者如果桶真的很大(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 选项无效,请升级 GNU coreutils 以获得浮点精度支持。
Erhhung 提问于2019-10-11
Erhhung 修改于2019-10-15
#12楼
得票数 2
s3cmd du --human-readable --recursive s3://Bucket_Name/
Dushan Wijesinghe 提问于2017-06-14
David Parks 修改于2021-05-25
不再支持s3cmd,建议现在使用s4cmd,它是 s3cmd 的一个维护分支。 github.com/bloomreach/s4cmdDavid Parks 2021-05-25
#13楼
得票数 1

有许多方法来计算桶中的文件夹的总大小

使用AWS Console

S3 Buckets > #Bucket > #folder > Actions > 计算总的大小

使用AWS的CLI

aws s3 ls s3://YOUR_BUCKET/YOUR_FOLDER/ --recursive --human-readable --summarize

该命令的输出结果显示。

  1. 对象被创建的日期
  2. 每个对象的单独文件大小
  3. 每个对象的路径,s3桶中对象的总数量
  4. 桶中对象的总大小

使用 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美元。

Javeed Shakeel 提问于2022-09-27
#14楼
得票数 0

在这里找到

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"}'
binshi 提问于2018-05-14
#15楼
得票数 0

您可以访问这个URL,在S3的"Metrics"标签上查看您的桶的大小。https://s3.console.aws.amazon.com/s3/buckets/{YOUR_BUCKET_NAME}? region={YOUR_REGION}& tab=metrics

数据实际上是在CloudWatch中,所以你可以直接去那里,然后将你感兴趣的桶保存到仪表板中。

Matt 提问于2021-09-05
#16楼
得票数 -1

在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")

Abhishek 提问于2021-09-29
这种方法可能需要几天的时间,如果你不小心,而且有大桶的话,要花费几百美元。thisguy123 2021-12-07