Wie kann ich die Größe eines Amazon S3-Buckets ermitteln?

289

Ich möchte die Größe (in Byte und Anzahl der Elemente) eines Amazon S3-Buckets grafisch darstellen und suche nach einer effizienten Möglichkeit, die Daten abzurufen.

Die s3cmd- Tools bieten eine Möglichkeit, die gesamte Dateigröße mithilfe von zu ermitteln s3cmd du s3://bucket_name. Ich bin jedoch besorgt über die Skalierbarkeit , da anscheinend Daten zu jeder Datei abgerufen und ihre eigene Summe berechnet werden. Da Amazon Benutzer in GB-Monaten belastet, erscheint es seltsam, dass sie diesen Wert nicht direkt verfügbar machen.

Obwohl die REST-API von Amazon die Anzahl der Elemente in einem Bucket zurückgibt, scheint s3cmd sie nicht verfügbar zu machen. Ich könnte es tun, s3cmd ls -r s3://bucket_name | wc -laber das scheint ein Hack zu sein.

Die Ruby AWS :: S3- Bibliothek sah vielversprechend aus, bietet jedoch nur die Anzahl der Bucket-Elemente und nicht die Gesamt-Bucket-Größe.

Kennt jemand andere Befehlszeilentools oder -bibliotheken (vorzugsweise Perl, PHP, Python oder Ruby), mit denen diese Daten abgerufen werden können?

Garret Heaton
quelle
Ich habe ein Tool zum Analysieren der
Eimergröße geschrieben
19
Ich bin erstaunt, dass Amazon den Speicherplatz in Rechnung stellt, aber nicht die Gesamtgröße, die ein S3-Bucket benötigt, einfach über das S3-Panel bereitstellt.
Luke
Für mich dauerte es ziemlich lange, bis die meisten Antworten die Bucket-Größe ermittelt hatten. Dieses Python-Skript war jedoch viel schneller als die meisten Antworten - slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-for-aws
Vaulstein

Antworten:

168

Die AWS-CLI unterstützt jetzt den --queryParameter, der JMESPath- Ausdrücke akzeptiert .

Dies bedeutet, dass Sie die angegebenen Größenwerte mit summieren und wie list-objectsfolgt sum(Contents[].Size)zählen können length(Contents[]).

Dies kann mit der offiziellen AWS-CLI wie folgt ausgeführt werden und wurde im Februar 2014 eingeführt

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
Christopher Hackett
quelle
21
Für große Eimer (große #Dateien) ist dies unerträglich langsam. Das Python-Dienstprogramm s4cmd "du" ist blitzschnell:s4cmd du s3://bucket-name
Brent Faust
Das ist merkwürdig. Was ist das Gesamtprofil Ihres Eimers (flach und fett / tief und dünn)? Es sieht aus wie s3cmdsollte die gleichen Gemeinkosten wie haben AWS CLI. Im angezeigten Code wird s3cmd für jedes Verzeichnis in einem Bucket eine Anfrage gestellt.
Christopher Hackett
22
um es in menschenlesbarem Format zu bekommen: 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
Da AWS Cloudwatch nun eine "BucketSizeBytes" -Metrik pro Bucket anbietet, ist dies nicht mehr die richtige Lösung. Siehe die Antwort von Toukakoukan weiter unten.
cce
2
s4cmd duist wunderbar, danke @Brent Faust! kleine Notiz (für die Betroffenen), die Sie hinzufügen müssen -r, um auch die Größe der Unterverzeichnisse zu ermitteln.
Greg Sadetsky
330

Dies kann jetzt ganz einfach mit dem offiziellen AWS-Befehlszeilenclient durchgeführt werden:

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

Offizielle Dokumentation

Dies akzeptiert auch Pfadpräfixe, wenn Sie nicht den gesamten Bucket zählen möchten:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
Philwills
quelle
23
Dies ist die beste und aktuellste Antwort
Tim
2
Stimmen Sie zu, das ist die beste Antwort.
Luis Artola
24
Dies ist für Buckets mit vielen Dateien sehr langsam, da im Grunde alle Objekte im Bucket aufgelistet werden, bevor die Zusammenfassung angezeigt wird, und da es nicht wesentlich schneller ist als die Antwort von @Christopher Hackett - mit der Ausnahme, dass diese viel lauter ist.
Guss
Führen Sie eine EC2-Instanz mit derselben Bucket-Region aus, um die Latenz zu verbessern
juanmirocks
1
Dadurch wird die Größe ALLER einzelnen Dateien im Verzeichnisbaum angezeigt. Was ist, wenn ich nur die Gesamtgröße des Verzeichnisses berechnen möchte?
Chris F
130

AWS Console:

Ab dem 28. Juli 2015 können Sie diese Informationen über CloudWatch erhalten . Wenn Sie eine GUI benötigen, rufen Sie die CloudWatch-Konsole auf : (Wählen Sie Region>) Metriken> S3

AWS CLI-Befehl:

Dies ist viel schneller als einige der anderen hier veröffentlichten Befehle, da nicht die Größe jeder Datei einzeln abgefragt wird, um die Summe zu berechnen.

 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

Wichtig : Sie müssen sowohl StorageType als auch BucketName im Dimensionsargument angeben, sonst erhalten Sie keine Ergebnisse. Alles , was Sie ändern müssen , ist die --start-date, --end-time, und Value=toukakoukan.com.


Hier ist ein Bash - Skript Sie verwenden können , zu vermeiden , angeben zu müssen --start-dateund --end-timemanuell.

#!/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
Sam Martin
quelle
25
Oder in der CloudWatch-Konsole : (Wählen Sie Region>) Kennzahlen> S3
Halil Özgür
3
Dies ist bei weitem die einfachste und schnellste Lösung. Leider liegt die Antwort erst an vierter Stelle.
Luk2302
Dies funktionierte für meinen Eimer mit mehr als 10 Millionen Objekten. Aber das Bash-Skript hat nichts zurückgegeben, musste auf die GUI gehen).
Petah
1
Es sollte auch beachtet werden, dass Sie auch die Region ändern müssen
Majikman
Mai 2018: Die Invalid value ('1525354418') for param timestamp:StartTime of type timestamp
Skriptfehler
106

s3cmd kann das:

s3cmd du s3://bucket-name

Stefan Ticu
quelle
Vielen Dank. Ist hier etwas TIMING. Auf einem Bucket mit einem deduplizierten s3ql-Dateisystem mit ungefähr einer Million Dateien, die ungefähr 33 GB nicht duplizierte Daten und ungefähr 93000 s3-Objekte verwenden, hat s3cmd du ungefähr 4 Minuten gebraucht, um die Antwort zu berechnen. Ich bin neugierig zu wissen, wie sich das mit anderen Ansätzen wie dem PHP vergleicht, das an anderer Stelle hier beschrieben wurde.
Nealmcb
1
Dies ist langsam, da der S3 ListObjects-API-Aufruf Objekte auf Seiten mit 1000 Objekten zurückgibt. Da E / A bei weitem der limitierende Faktor ist, denke ich, dass jede Lösung bei 93000 Objekten relativ langsam sein wird.
David Snabel-Caunt
11
s4cmd kann auch dasselbe tun, mit dem zusätzlichen Vorteil, dass die Anforderungen per Multithread an die S3-API weitergeleitet werden, um das Ergebnis schneller zu berechnen. Das Tool wurde kürzlich nicht aktualisiert, aber der Internet-Passant kann es nützlich finden.
Nick Chammas
s4cmd gibt für mich nur 0 zurück und BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.für Buckets mit Großbuchstaben.
Lakitu
22

Wenn Sie einen Nutzungsbericht herunterladen , können Sie die Tageswerte für das TimedStorage-ByteHrsFeld grafisch darstellen .

Wenn Sie diese Zahl in GiB haben möchten, teilen Sie sie einfach durch 1024 * 1024 * 1024 * 24(das sind GiB-Stunden für einen 24-Stunden-Zyklus). Wenn Sie die Anzahl in Bytes wollen, teilen Sie sie einfach durch 24 und zeichnen Sie sie weg.

Christopher Schultz
quelle
19

Verwenden der offiziellen AWS s3-Befehlszeilentools:

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

Dies ist ein besserer Befehl, nur die folgenden drei Parameter hinzufügen --summarize --human-readable --recursivenach aws s3 ls. --summarizeist nicht erforderlich, gibt aber einen netten Touch auf die Gesamtgröße.

aws s3 ls s3://bucket/folder --summarize --human-readable --recursive
dyltini
quelle
1
Geben Sie den Link an, wo Amazon dies tatsächlich angibt. Ich kann es nicht finden.
Lobi
1
docs.aws.amazon.com/cli/latest/reference/s3/ls.html ist ein besserer Link
Ian Bamforth
4
Diese Antwort hat für mich am besten und schnellsten funktioniert.
Miro
2
beste und schnellste Antwort!
PlagTag
11

s4cmd ist der schnellste Weg, den ich gefunden habe (ein in Python geschriebenes Befehlszeilenprogramm):

pip install s4cmd

So berechnen Sie die gesamte Schaufelgröße mit mehreren Threads:

s4cmd du -r s3://bucket-name
Brent Faust
quelle
6
Nein, es s4cmd du s3://123123drinkwird nicht einfach die Größe des Eimers zurückgegeben. Um die Größe des Eimers zu erhalten, fügen Sie das rekursive -rElement wie folgt hinzu: s4cmd du -r s3: // 123123drink
George Chalhoub
1
Ja, guter Punkt @BukLau ( -rzum obigen Beispiel hinzugefügt , um Verwirrung zu vermeiden, wenn Benutzer simulierte Ordner in S3 verwenden).
Brent Faust
6

Ich habe die zuvor in diesem Thread aufgeführte S3-REST / Curl-API verwendet und dies getan:

<?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';
?>
Vic
quelle
6

Sie können das Dienstprogramm s3cmd verwenden, z.

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
user319660
quelle
5

Wenn S3 also die API durchläuft und dieselben Abfragen abspielt, wird der gesamte Inhalt eines Buckets in einer Anforderung generiert und muss nicht in Verzeichnisse absteigen. Die Ergebnisse erfordern dann lediglich eine Summierung durch die verschiedenen XML-Elemente und keine wiederholten Aufrufe. Ich habe keinen Probenbehälter mit Tausenden von Artikeln, daher weiß ich nicht, wie gut er skaliert, aber er scheint ziemlich einfach zu sein.

Jim Zajkowski
quelle
Dies scheint die beste Option zu sein. Wird diesen Beitrag in Zukunft aktualisieren, wenn er schlecht skaliert und ich etwas anderes tun muss. Die Bibliothek , die einen einfachen Zugang zu den rohen API Ergebnisse liefert schließlich war diese PHP ein: undesigned.org.za/2007/10/22/amazon-s3-php-class
Garret Heaton
Ist das nicht nur auf die ersten 1000 Artikel beschränkt?
Charlie Schliesser
4

... Ein bisschen spät, aber der beste Weg, den ich gefunden habe, ist die Verwendung der Berichte im AWS-Portal. Ich habe eine PHP-Klasse zum Herunterladen und Parsen der Berichte erstellt. Damit können Sie die Gesamtzahl der Objekte für jeden Bucket, die Gesamtgröße in GB oder Byte-Stunden und mehr abrufen.

Probieren Sie es aus und lassen Sie es mich wissen, wenn es hilfreich war

AmazonTools


quelle
Dies ist eine interessante, wenn auch etwas hackige Lösung. Ich mache mir Sorgen, dass es kaputt gehen könnte, wenn Amazon seine Website wechselt, aber ich muss dies möglicherweise ausprobieren, sobald ich genügend Objekte habe, damit es in die andere Richtung zu langsam wird. Ein weiterer Vorteil dieses Ansatzes ist, dass für API-Aufrufe keine Gebühren anfallen.
Garret Heaton
. . . Es ist eine Vermutung, aber wenn Amazon das Aussehen seiner Website ändert, bezweifle ich, dass sie das Back-End stark verändern würden, was bedeutet, dass die aktuellen GET- und POST-Abfragen funktionieren sollten. Ich werde die Klasse beibehalten, falls sie trotzdem abbricht, da ich sie oft benutze.
3

Ich empfehle für S3 Nutzungsbericht mit großen Eimern , siehe meine Wie , wie man es bekommt Grundsätzlich müssen Sie Nutzungsbericht für S3 - Dienst für den letzten Tag mit Timed Speichern herunterladen - Byte Stunden und analysiert es Plattennutzung zu erhalten.

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

In der AWS-Dokumentation erfahren Sie, wie es geht:

aws s3 ls s3://bucketnanme --recursive --human-readable --summarize

Dies ist die Ausgabe, die Sie erhalten:

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
奉 奉 折 折
quelle
2

Für einen wirklich Low-Tech-Ansatz: Verwenden Sie einen S3-Client, der die Größe für Sie berechnen kann. Ich verwende Panic's Transmit, klicke auf einen Bucket, mache "Get Info" und klicke auf den "Calculate" -Button. Ich bin nicht sicher, wie schnell oder genau es in Bezug auf andere Methoden ist, aber es scheint die Größe zurückzugeben, die ich erwartet hatte.

zmippie
quelle
2

Da es so viele Antworten gibt, nahm ich an, dass ich mich meinen eigenen anschließen würde. Ich habe meine Implementierung in C # mit LINQPad geschrieben. Kopieren Sie den abzufragenden Zugriffsschlüssel, den geheimen Schlüssel, den Regionsendpunkt und den Bucket-Namen, und fügen Sie sie ein. Stellen Sie außerdem sicher, dass Sie das AWSSDK-Nuget-Paket hinzufügen.

Beim Testen mit einem meiner Eimer erhielt ich eine Zählung von 128075 und eine Größe von 70,6 GB. Ich weiß, dass das 99,9999% genau ist, also bin ich gut mit dem Ergebnis.

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]);
    }
}
Gup3rSuR4c
quelle
2

Wenn Sie die Größe von AWS Console erhalten möchten:

  1. Gehen Sie zu S3 und klicken Sie auf den Bucket-Namen
  2. Wählen Sie die Registerkarte "Verwaltung"

Bildbeschreibung hier eingeben

  1. Wählen Sie die Registerkarte Metriken

Standardmäßig sollten Sie sehen , Lagerung Metric des Eimers

Hooman Bahreini
quelle
1

Ich weiß, dass dies eine ältere Frage ist, aber hier ist ein PowerShell-Beispiel:

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

$A enthält die Größe des Buckets, und es gibt einen keyname-Parameter, wenn Sie nur die Größe eines bestimmten Ordners in einem Bucket möchten.

DCJeff
quelle
Führen Sie zuerst Get-object..line aus und dann $ A (für Benutzer, die nicht mit PowerShell vertraut sind)
Faiz,
1

Verwenden Sie dieses Bash-Skript, um die Größe aller Eimer zu überprüfen

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
Giulio Roggero
quelle
Das hat super funktioniert.
Mike Barlow - BarDev
Es ist eine Verschwendung, die Ausgabe in einer Variablen zu erfassen, damit Sie sie in einer Schleife wiedergeben können.
Tripleee
1

Sie können verwenden s3cmd:

s3cmd du s3://Mybucket -H

oder

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

Es gibt die Gesamtzahl der Objekte und die Größe des Eimers in gut lesbarer Form an.

bpathak
quelle
Listet duTraverse alle Objekte auf oder ruft es die Metadaten ab? Möchte wirklich eine API-Version der Berichtsversion oder was in der AWS-Konsole angezeigt wird ...
user67327
0

Hey, es gibt ein Metadatensuchwerkzeug für AWS S3 unter https://s3search.p3-labs.com/. Dieses Werkzeug liefert statistische Daten zu Objekten in einem Bucket mit Suche nach Metadaten.

pyth
quelle
0

Dies erledigt auch Hanzo S3 Tools . Nach der Installation können Sie Folgendes tun:

s3ls -s -H bucketname

Ich glaube jedoch, dass dies auch auf der Clientseite summiert und nicht über die AWS-API abgerufen wird.

Ville
quelle
0

Mit dem Cloudberry- Programm ist es auch möglich, die Größe des Buckets , die Anzahl der Ordner und die Gesamtzahl der Dateien aufzulisten , indem Sie auf "Eigenschaften" rechts oben im Bucket klicken.

KiKo
quelle
0

Wenn Sie die Befehlszeile unter Windows und OSX nicht verwenden möchten, gibt es eine universelle Remote-Dateiverwaltungs-App namens Cyberduck . Melden Sie sich mit Ihrem Zugriffs- / geheimen Schlüsselpaar bei S3 an, klicken Sie mit der rechten Maustaste auf das Verzeichnis und klicken Sie auf Calculate.

jpillora
quelle
0

Ich habe ein Bash-Skript geschrieben, s3-du.sh, das Dateien im Eimer mit s3ls auflistet und die Anzahl der Dateien und Größen wie druckt

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

Vollständiges Skript:

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

Die Größe des Unterverzeichnisses wird angegeben, da Amazon den Verzeichnisnamen und die Größe des gesamten Inhalts zurückgibt.

Jon Zobrist
quelle
0

CloudWatch verfügt jetzt über ein Standard-S3-Dienst-Dashboard, das es in einem Diagramm mit dem Namen "Bucket Size Bytes Average" auflistet. Ich denke, dieser Link funktioniert für alle Benutzer, die bereits bei AWS Console angemeldet sind:

Flackerfliege
quelle
-1

Die folgende Methode verwendet AWS PHP SDK, um die Gesamtgröße des Buckets zu ermitteln.

// 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;
Shriganesh Shintre
quelle
-1

Das funktioniert bei mir ..

aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'
GrantO
quelle
3
Können Sie noch ein paar Details hinzufügen?
Pierre.Vriens
1
Dies ist im Wesentlichen die gleiche Lösung wie eine andere Antwort, die etwa ein Jahr zuvor veröffentlicht wurde.
Louis