Amazon S3バケットのサイズを取得するにはどうすればよいですか?


289

Amazon S3バケットのサイズ(バイト単位、アイテム数)をグラフ化し、データを取得する効率的な方法を探しています。

s3cmdツールは使用してファイルの合計サイズを取得する方法を提供しs3cmd du s3://bucket_name、私はそれがすべてのファイルに関するデータを取得し、独自の合計を計算のように見えるので、拡張する能力心配です。AmazonはGBか月でユーザーに課金するため、この値を直接公開しないのは奇妙に思えます。

AmazonのREST APIは、バケット内の項目数を返し、s3cmdそれを公開していないようです。できましたがs3cmd ls -r s3://bucket_name | wc -l、それはハックのようです。

Ruby AWS :: S3ライブラリは有望に見えましたが、合計バケットサイズではなく、バケットアイテムの数のみを提供します。

このデータを取得する方法を提供する他のコマンドラインツールまたはライブラリ(Perl、PHP、Python、またはRubyを好む)を知っている人はいますか?


バケットサイズを分析するためのツールを作成しました:github.com/EverythingMe/ncdu-s3
omribahumi

20
Amazonがこのスペースに料金を請求していることに驚いていますが、S3パネルを介してS3バケットが占める合計サイズを提供しないでください。
ルーク

私にとって、以下の回答のほとんどはバケットサイズを取得するのに非常に長い時間がかかりましたが、このPythonスクリプトはほとんどの回答よりもはるかに高速でした-slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-FOR-AWS
Vaulstein

回答:


168

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[])]"

21
大きなバケット(大きな#files)の場合、これは非常に遅くなります。:Pythonのユーティリティは、雷が速い「デュ」s4cmds4cmd du s3://bucket-name
ブレント・ファウスト

変だね。あなたのバケツの全体的なプロファイルは何ですか(浅くて太い/深くて薄い)?とs3cmd同じオーバーヘッドがあるはずAWS CLIです。では、コードは示し s3cmdバケット内の各ディレクトリを要求します。
クリストファーハケット

22
人間が読める形式で取得するには: 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"}'
Sandeep

21
AWS Cloudwatchがバケットごとの「BucketSizeBytes」メトリックを提供するようになったため、これはもはや適切なソリューションではありません。以下のToukakoukanの回答を参照してください。
-cce

2
s4cmd du@Brent Faustに感謝します!-rサブディレクトリのサイズを取得するために追加する必要がある小さなメモ(関係者向け)。
グレッグサデツキー

330

これは、公式のAWSコマンドラインクライアントだけで簡単に実行できるようになりました。

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

公式文書

バケット全体をカウントしたくない場合、これはパスプレフィックスも受け入れます。

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

23
これが最良かつ最新の回答です。
ティム

2
同意して、これが最良の答えです。
ルイスアルトラ

25
これは、概要を表示する前にバケット内のすべてのオブジェクトを基本的にリストするため、多くのファイルを持つバケットでは非常に遅く、@ Christopher Hackettの答えよりも大幅に高速ではありません-これははるかにうるさいです。
ガス

同じバケットのリージョンを持つEC2インスタンスで実行して、レイテンシーを改善します
-juanmirocks

1
これにより、ディレクトリツリー内のすべての個々のファイルのサイズが表示されます。ディレクトリの合計サイズを知りたい場合はどうすればよいですか?
クリスF

130

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

重要:dimensions引数でStorageTypeとBucketNameの両方を指定する必要があります。指定しないと、結果が得られません。あなたが変更する必要があるのはある--start-date--end-timeValue=toukakoukan.com


これは--start-date--end-time手動で指定する必要を回避するために使用できるbashスクリプトです。

#!/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

25
または、CloudWatchコンソールで:(地域を選択>)メトリックス> S3
HalilÖzgür16年

3
これは、最も簡単で最速のソリューションです。残念ながら、答えはまだ4位に過ぎません。
luk2302

これは1,000万以上のオブジェクトを持つバケットで機能しました。しかし、bashスクリプトは何も返さず、GUIに移動する必要がありました)。
ペタ

1
また、地域も変更する必要があることに注意してください
majikman

2018年Invalid value ('1525354418') for param timestamp:StartTime of type timestamp
-anneb

106

s3cmdはこれを行うことができます:

s3cmd du s3://bucket-name


ありがとう。ここにいくつかのタイミングがあります。約33 GBの非暗号化データと約93000のs3オブジェクトを使用する約100万のファイルを持つs3ql重複排除ファイルシステムを保持するバケットでは、s3cmd duは回答を計算するのに約4分かかりました。ここで説明しているphpのような他のアプローチと比較する方法を知りたいです。
-nealmcb

1
S3 ListObjects API呼び出しは1000オブジェクトのページでオブジェクトを返すため、時間がかかります。I / Oが圧倒的な制限要因であるため、93000オブジェクトを超えるソリューションは比較的低速になると思います。
デビッドスナベルキャント

11
s4cmdも同じことを実行できますが、S3のAPIへの要求をマルチスレッド化して結果をより高速に計算できるという利点が追加されています。このツールは最近更新されていませんが、インターネット通行人は便利だと思うかもしれません。
ニックチャマス14

s4cmdは、私には0を返しBotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.、大文字のバケットには戻ります。
ラキトゥ

22

使用状況レポートをダウンロードすると、TimedStorage-ByteHrsフィールドの毎日の値をグラフ化できます。

GiBでその数値が必要な場合は、除算するだけです1024 * 1024 * 1024 * 24(24時間サイクルのGiB時間です)。バイト単位の数値が必要な場合は、24で除算してグラフ化します。


19

公式のAWS s3コマンドラインツールを使用する:

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

これはより良いコマンドです。次の3つのパラメーターをの--summarize --human-readable --recursive後に追加してくださいaws s3 ls--summarize合計サイズにすてきなタッチを与えますが、必須ではありません。

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

1
アマゾンが実際にこれを述べている場所へのリンクを提供してください。見つかりません。
ロビ



4
この答えは、私にとって最良かつ最速でした。
ミロ

2
最高かつ最速の答え!
PlagTag

11

s4cmdは、私が見つけた最速の方法です(Pythonで作成されたコマンドラインユーティリティ)。

pip install s4cmd

複数のスレッドを使用してバケットサイズ全体を計算するには:

s4cmd du -r s3://bucket-name

6
いいえ、s4cmd du s3://123123drink単にバケットのサイズを返しません。バケットのサイズを取得するには-r、次のように再帰を追加します。s4cmd du -r s3:// 123123drink
ジョージチャルフ

1
はい、良い点は@BukLauです(-rS3でシミュレートされたフォルダーを使用しているときの混乱を避けるために、上記の例に追加しました)。
ブレントファウスト

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';
?>

6

s3cmdユーティリティを使用できます。例:

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

5

したがって、APIをトローリングして同じクエリを再生すると、S3は1つのリクエストでバケットのコンテンツ全体を生成し、ディレクトリに降りる必要はありません。結果は、繰り返しの呼び出しではなく、さまざまなXML要素を合計するだけで済みます。数千のアイテムを含むサンプルバケットがないため、どれだけうまく拡張できるかわかりませんが、かなり単純なようです。


これが最良の選択肢のようです。スケーリングが不十分で、何か他のことをする必要がある場合、将来この投稿を更新します。未加工のAPI結果に簡単にアクセスできるようになったライブラリは、このPHPのものでした:undesigned.org.za/2007/10/22/amazon-s3-php-class
Garret Heaton

それは最初の1000個のアイテムだけに限定されていませんか?
チャーリーシュリーサー

4

...少し遅れましたが、私が見つけた最良の方法は、AWSポータルのレポートを使用することです。レポートをダウンロードして解析するためのPHPクラスを作成しました。これを使用すると、各バケットのオブジェクトの合計数、GBまたはバイト単位の合計サイズなどを取得できます。

それをチェックして、助けになったか教えてください

AmazonTools


これは興味深い解決策ですが、少しハッキングされています。Amazonがサイトを変更した場合、いつ変更するのかが心配ですが、十分なオブジェクトがあり、他の方法では遅すぎる場合は、これを試してみる必要があります。このアプローチのもう1つの利点は、API呼び出しに対して料金が発生しないことです。
ギャレットヒートン

。。。その仮定ですが、Amazonがサイトの外観を変更した場合、バックエンドが大幅に変更されるとは思えません。つまり、現在のGETおよびPOSTクエリが機能するはずです。頻繁に使用するので、とにかく壊れる場合に備えて、クラスを維持します。

3

大きなバケットにはS3 Usage Reportを使用することをお勧めします。取得方法については、How Toを参照しください。

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

3

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

2

本当にローテクなアプローチの場合:サイズを計算できるS3クライアントを使用します。私はパニックの送信を使用しています。バケットをクリックし、「情報を見る」を実行し、「計算」ボタンをクリックします。他の方法と比べてどれだけ速く正確であるかはわかりませんが、期待していたサイズに戻っているようです。


2

非常に多くの答えがあるので、私は自分自身で投球すると思いました。LINQPadを使用してC#で実装を作成しました。クエリするアクセスキー、シークレットキー、リージョンエンドポイント、バケット名をコピー、貼り付け、入力します。また、AWSSDK nugetパッケージを必ず追加してください。

バケットの1つに対してテストすると、カウントは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]);
    }
}

2

AWSコンソールからサイズを取得する場合:

  1. S3に移動し、バケット名をクリックします
  2. 「管理」タブを選択します

ここに画像の説明を入力してください

  1. [ メトリック ]タブを選択します

デフォルトでは、バケットのストレージメトリックが表示されます。


1

これは古い質問ですが、PowerShellの例を次に示します。

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

$A バケットのサイズが含まれます。バケット内の特定のフォルダーのサイズだけが必要な場合は、keynameパラメーターがあります。


最初にGet-object..lineを実行し、次に$ Aを実行します(PowerShellに慣れていない人向け)
Faiz

1

すべてのバケットサイズを確認するには、このbashスクリプトを試してください

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

これはうまくいきました。
マイクバーロウ-BarDev

出力をループで取得できるように変数にキャプチャするのは、無駄なアンチパターンです。
トリプリー

1

以下を使用できますs3cmd

s3cmd du s3://Mybucket -H

または

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

オブジェクトの合計とバケットのサイズが非常に読みやすい形式で表示されます。


duトラバースすべてのオブジェクトを一覧表示したり、メタデータを取得しますか?レポートバージョンのAPIバージョンまたはawsコンソールに表示されるものが本当に
欲しい


0

また、Hanzo S3 Toolsはこれを行います。インストールしたら、次のことができます。

s3ls -s -H bucketname

ただし、これはクライアント側でも集計され、AWS APIを介して取得されるものではないと思います。


0

クラウドベリープログラムは、右のバケットの上に、「プロパティ」をクリックバケットのサイズ、フォルダとファイルの合計額を、一覧表示することも可能です。


0

コマンドラインを使用したくない場合、WindowsおよびOSXには、Cyber​​duckと呼ばれる汎用リモートファイル管理アプリがあります。アクセス/秘密キーのペアでS3にログインし、ディレクトリを右クリックして、をクリックしますCalculate


0

バケット内のファイルをs3lsでリストし、ファイルの数とサイズを出力するBashスクリプトs3-du.shを作成しました。

s3-du.sh testbucket.jonzobrist.com
149 files in bucket testbucket.jonzobrist.com
11760850920 B
11485205 KB
11216 MB
10 GB

完全なスクリプト:

#!/bin/bash

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

Amazonはディレクトリ名とそのすべてのコンテンツのサイズを返すので、サブディレクトリサイズを実行します。


0

CloudWatchにはデフォルトのS3サービスダッシュボードがあり、「バケットサイズバイト平均」と呼ばれるグラフにリストされます。このリンクは、AWS Consoleにすでにログインしているすべての人に有効だと思います。


-1

次の方法では、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;

-1

これは私のために働く。

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

3
さらに詳細を追加できますか?
Pierre.Vriens

1
これは、約1年前に投稿された別の回答と本質的に同じソリューションです。
ルイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.