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


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

Das s3cmd Tools bieten eine Möglichkeit, die Gesamtgröße der Datei zu ermitteln s3cmd du s3://bucket_name, aber ich mache mir Sorgen über die Skalierbarkeit, da es aussieht, als würde es Daten über jede Datei abrufen und ihre eigene Summe berechnen. Da Amazon Benutzer in GB-Monaten auflädt, erscheint es seltsam, dass sie diesen Wert nicht direkt verfügbar machen.

Obwohl Amazon-REST-API gibt die Anzahl der Elemente in einem Bucket zurück, s3cmd scheint es nicht zu entlarven. ich könnte s3cmd ls -r s3://bucket_name | wc -l aber das scheint wie ein Hack.

Der Rubin AWS :: S3 Die Bibliothek sah vielversprechend aus, stellt jedoch nur die Anzahl der Bucket-Elemente und nicht die gesamte Bucket-Größe zur Verfügung.

Kennt jemand andere Befehlszeilentools oder -bibliotheken (bevorzugen Sie Perl, PHP, Python oder Ruby), die Möglichkeiten zum Abrufen dieser Daten bieten?


248
2017-11-15 00:40


Ursprung


Ich habe ein Tool zum Analysieren der Bucket-Größe geschrieben: github.com/EverythingMe/ncdu-s3 - omribahumi
Ich bin erstaunt, dass Amazon für den Platz aufladen, aber nicht die Gesamtgröße eines S3-Eimers einfach durch das S3-Panel zur Verfügung stellen. - Luke
Für mich haben die meisten der untenstehenden Antworten ziemlich lange gedauert, um die Bucket-Größe zu erhalten, allerdings war dieses Python-Skript viel schneller als die meisten Antworten - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


Antworten:


Das AWS CLI unterstützt jetzt das --query Parameter, der a JMESPath Ausdrücke.

Das bedeutet, dass Sie die Größenangaben von addieren können list-objects verwenden sum(Contents[].Size) und zähle wie length(Contents[]).

Dies kann mit dem offiziellen AWS CLI wie folgt durchgeführt werden und wurde in Februar 2014

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

146
2017-11-16 23:00



Bei großen Buckets (große # Dateien) ist dies quälend langsam. Das Python-Dienstprogramm s4cmd "du" ist blitzschnell: s4cmd du s3://bucket-name - Brent Faust
Das ist seltsam. Wie ist das Gesamtprofil Ihres Eimers (flach und dick / tief und dünn)? Es sieht aus wie s3cmd sollte die gleichen Gemeinkosten haben wie AWS CLI. In dem Code zeigt es  s3cmd Erstelle eine Anfrage für jedes Verzeichnis in einem Bucket. - Christopher Hackett
um es in einem für Menschen lesbaren 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
Jetzt, da AWS Cloudwatch eine BucketSizeBytes-Metrik pro Bucket anbietet, ist dies nicht mehr die richtige Lösung. Siehe die Antwort von Toukakoukan unten. - cce
s4cmd du ist wunderbar, danke @Brent Faust! kleine Notiz (für die Betroffenen), die Sie hinzufügen müssen -r um auch die Größe von Unterverzeichnissen zu erhalten. - Greg Sadetsky


Dies kann nun mit nur dem offiziellen AWS-Befehlszeilenclient trivial erfolgen:

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

Offizielle Dokumentation

Dies gilt auch für Pfadpräfixe, wenn Sie nicht den gesamten Bucket zählen möchten:

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

254
2017-09-09 14:04



Dies ist die beste und aktuellste Antwort - Tim
Stimme zu, das ist die beste Antwort. - Luis Artola
Dies ist sehr langsam für Buckets mit vielen Dateien, da es im Grunde alle Objekte im Bucket auflistet, bevor die Zusammenfassung angezeigt wird, und dass es nicht wesentlich schneller ist als die Antwort von @Christopher Hackett - außer dass es viel lauter ist. - Guss
Wird auf einer EC2-Instanz mit derselben Bucket-Region ausgeführt, um die Latenz zu verbessern - juanmirocks
Wenn Sie nur an der Übersichtsgröße interessiert sind, ist dies die schnellste und aktuellste Lösung, und Sie können einfach durch den Schwanz pipen, um diesen Wert zu finden. - Charlie Hileman


AWS-Konsole:

Ab 28. Juli 2015 Sie können diese Informationen erhalten über CloudWatch. Wenn Sie eine GUI möchten, gehen Sie zu CloudWatch-Konsole: (Wählen Sie Region>) Metriken> S3

AWS CLI-Befehl:

Dies ist viel schneller als einige der anderen hier geposteten 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 Dimensionen-Argument 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, das Sie verwenden können, um zu vermeiden, dass Sie angeben müssen --start-date und --end-time manuell.

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

104
2017-07-31 21:58



Oder in die CloudWatch-Konsole: (Wählen Sie Region>) Metriken> S3 - Halil Özgür
Dies ist bei weitem die einfachste und schnellste Lösung. Leider ist die Antwort immer noch nur auf dem vierten Platz. - luk2302
Dies funktionierte für meinen Eimer mit 10 Millionen Objekten. Aber das Bash-Skript gab nichts zurück, musste zur GUI gehen). - Petah
Es sollte auch beachtet werden, dass Sie die Region auch ändern müssen - majikman
Mai 2018: Die Skriptfehler mit Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd kann dies tun :

s3cmd du s3://bucket-name


103
2017-07-08 13:40



Vielen Dank. Hier ist etwas Timing. Auf einem Bucket, der ein s3ql-dedupliziertes Dateisystem mit ungefähr einer Million Dateien unter Verwendung von ungefähr 33 GB unbelegten Daten und ungefähr 93000 s3-Objekten enthält, benötigte s3cmd du ungefähr 4 Minuten, um die Antwort zu berechnen. Ich bin gespannt, wie das mit anderen Ansätzen wie dem hier beschriebenen php verglichen wird. - nealmcb
Es ist langsam, weil die S3 ListObjects-API-Aufruf Gibt Objekte in Seiten mit 1000 Objekten zurück. Da I ​​/ O bei weitem der begrenzende Faktor ist, denke ich, dass jede Lösung über 93000 Objekte relativ langsam sein wird. - David Snabel-Caunt
s4cmd kann auch das Gleiche tun, mit dem zusätzlichen Vorteil der Multi-Threading der Anfragen an S3-API, um das Ergebnis schneller zu berechnen. Das Tool wurde in letzter Zeit nicht aktualisiert, aber der Internet-Passant kann es nützlich finden. - Nick Chammas
s4cmd gibt nur 0 für mich zurück und kehrt zurück 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


Wenn Sie eine herunterladen Nutzungsbericht, können Sie die täglichen Werte für die TimedStorage-ByteHrs Feld.

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


22
2017-12-05 17:22





Verwenden der offiziellen Befehlszeilenprogramme von AWS s3:

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

16
2018-04-23 11:22



Stellen Sie den Link zur Verfügung, wo Amazon dies bitte angibt. Ich kann es nicht finden. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html ist eine bessere Verbindung - Ian Bamforth
Diese Antwort funktionierte für mich am besten und schnellsten. - Miro
beste und schnellste Antwort! - PlagTag


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

pip install s4cmd

Berechnen Sie jetzt die gesamte Bucket-Größe mit mehreren Threads:

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



Nein, s4cmd du s3://123123drink wird nicht einfach die Größe des Eimers zurückgeben. Um die Größe des Buckets zu erhalten, fügen Sie den rekursiven Wert hinzu -r, so: s4cmd du -r s3: // 123123drink - George Chalhoub
Ja, guter Punkt @BukLau (hinzugefügt -r zum Beispiel oben, um Verwirrung zu vermeiden, wenn Leute simulierte Ordner auf S3 benutzen). - Brent Faust


Ich habe das benutzt S3 REST / Curl API zuvor in diesem Thread aufgeführt und tat dies:

<?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
2017-12-12 19:05





Wenn Sie also über die API trollen und dieselben Abfragen ausführen, erzeugt S3 den gesamten Inhalt eines Buckets in einer Anforderung und muss nicht in Verzeichnisse absteigen. Die Ergebnisse erfordern dann nur eine Summierung durch die verschiedenen XML-Elemente und keine wiederholten Aufrufe. Ich habe keinen Sample-Bucket, der Tausende von Elementen enthält. Ich weiß also nicht, wie gut er skalieren wird, aber es scheint ziemlich einfach zu sein.


4
2017-11-15 04:00



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 am Ende einfachen Zugang zu den rohen API-Ergebnissen bot, war diese PHP-Eins: unstoed.org.za/2007/10/22/amazon-s3-php-class - Garret Heaton
Ist das nicht nur auf die ersten 1000 Gegenstände beschränkt? - Charlie Schliesser


... Ein bisschen spät, aber am besten finde ich die Berichte im AWS-Portal. Ich habe eine PHP-Klasse zum Herunterladen und Analysieren der Berichte erstellt. Damit können Sie die Gesamtanzahl der Objekte für jeden Bucket, die Gesamtgröße in GB oder Byte-Stunden und mehr abrufen.

Überprüfen Sie es und lassen Sie mich wissen, wenn es hilfreich war

AmazonTools


4
2017-12-20 22:56



Dies ist eine interessante Lösung, obwohl ein wenig hackish. Ich bin besorgt darüber, dass es kaputt geht, wenn Amazon seine Site ändert, aber ich muss das vielleicht ausprobieren, sobald ich genug Objekte habe, die anders herum zu langsam werden. Ein weiterer Vorteil dieses Ansatzes besteht darin, dass Ihnen keine API-Aufrufe in Rechnung gestellt werden. - Garret Heaton
. . . Es ist eine Annahme, aber, wenn Amazon das Aussehen ihrer Website ändern, bezweifle ich, dass sie das Back-End viel ändern würde, was bedeutet, dass die aktuellen GET und POST-Abfragen funktionieren sollten. Ich werde die Klasse für den Fall beibehalten, dass es sowieso bricht, da ich es oft benutze.