web-dev-qa-db-ja.com

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

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

s3cmd ツールは、s3cmd du s3://bucket_nameを使用して合計ファイルサイズを取得する方法を提供しますが、すべてのファイルに関するデータをフェッチして独自のファイルを計算するように見えるため、スケーリングする機能が心配です和。 AmazonはGBか月でユーザーに請求するので、この値を直接公開しないのは奇妙に思われます。

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

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

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

316
Garret Heaton

AWS CLIは、 JMESPath 式を受け取る_--query_パラメーターをサポートするようになりました。

これは、sum(Contents[].Size)を使用して_list-objects_によって指定されたサイズ値を合計し、length(Contents[])のようにカウントできることを意味します。

これは、以下の公式AWS CLIを使用して実行でき、 Feb 2014 で導入されました

_ aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
_
180

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

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

公式ドキュメント

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

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

AWSコンソール:

2015年7月28日 現在、この情報を取得できます CloudWatch経由 。 GUIが必要な場合は、 CloudWatch console :(Choose Region>)Metrics> 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

重要:ディメンションの引数にStorageTypeとBucketNameの両方を指定する必要があります。指定しない場合、結果が得られません。変更する必要があるのは、--start-date--end-time、およびValue=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
144
Sam Martin

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

s3cmd du s3://bucket-name

108
Stefan Ticu

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

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

22

公式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 --recursiveaws s3 ls--summarizeは必須ではありませんが、合計サイズに良い感じを与えます。

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

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

pip install s4cmd

次に、複数のスレッドを使用してバケット全体のサイズを計算します。

s4cmd du -r s3://bucket-name
13
Brent Faust

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

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

私はこのスレッドで以前にリストされた 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
Vic

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

6
Jim Zajkowski

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

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

enter image description here

  1. Metricsタブを選択します

デフォルトでは、バケットのStorage Metricが表示されます

5
Hooman Bahreini

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

それをチェックして、役に立ったかどうか私に知らせてください

AmazonTools

4
Corey Sewell

大きなバケットにはS3使用レポートを使用することをお勧めします。それを取得する方法については、 my How To を参照してください。基本的に、使用方法をダウンロードする必要がありますTimed Storage-Byte Hrsを使用した最終日のS3サービスのレポートを作成し、それを解析してディスク使用量を取得します。

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

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
3
奉太郎折木

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

2
zmippie

答えがたくさんあるので、自分で試してみようと思いました。 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
Gup3rSuR4c

s3cmdを使用できます。

s3cmd du s3://Mybucket -H

または

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

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

1
bpathak

すべてのバケットのサイズを確認するには、この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
1
Giulio Roggero

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

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

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

1
DCJeff

私はバッシュスクリプトs3-du.shを書きました。これはs3lsでバケット内のファイルを一覧表示し、ファイルの数と次のようなサイズを出力します

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
Jon Zobrist

Cloudberry プログラムでは、バケットのサイズ、フォルダの数、ファイルの総数を一覧表示し、バケットの右上にある[プロパティ]をクリックすることもできます。

0
KiKo

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

s3ls -s -H bucketname

しかし、これもクライアント側で合計され、AWS APIを介して取得されないと考えています。

0
Ville

CloudWatchにはデフォルトのS3サービスダッシュボードがあり、「Bucket Size Bytes Average」と呼ばれるグラフに表示されます。私は このリンクは機能します すでにAWSコンソールにログインしている人のために:

0
flickerfly

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

0
jpillora

https://s3search.p3-labs.com/ にAWS S3のmetdata検索ツールがあります。このツールは、メタデータを検索してバケット内のオブジェクトに関する統計を提供します。

0
pyth