Wie kann ich feststellen, wie viele Objekte ich in einem S3-Bucket gespeichert habe?


154

Sofern mir nichts fehlt, scheint Ihnen keine der von mir untersuchten APIs zu sagen, wie viele Objekte sich in einem S3-Bucket / Ordner (Präfix) befinden. Gibt es eine Möglichkeit, eine Zählung zu erhalten?


Diese Frage könnte hilfreich sein: stackoverflow.com/questions/701545/…
Brendan Long

1
Die Lösung existiert jetzt im Jahr 2015: stackoverflow.com/a/32908591/578989
Mayank Jaiswal

Siehe meine Antwort unten: stackoverflow.com/a/39111698/996926
advncd

Antworten:


38

Es gibt keinen Weg, außer Sie

  1. Listen Sie sie alle in Stapeln von 1000 auf (was langsam sein und Bandbreite verbrauchen kann - Amazon scheint die XML-Antworten niemals zu komprimieren), oder

  2. Melden Sie sich bei S3 in Ihrem Konto an und gehen Sie zu Konto - Nutzung. Anscheinend weiß die Rechnungsabteilung genau, wie viele Objekte Sie gespeichert haben!

Das einfache Herunterladen der Liste aller Ihrer Objekte nimmt tatsächlich einige Zeit in Anspruch und kostet etwas Geld, wenn Sie 50 Millionen Objekte gespeichert haben.

Siehe auch diesen Thread zu StorageObjectCount - der in den Nutzungsdaten enthalten ist.

Eine S3-API, um zumindest die Grundlagen zu erhalten, selbst wenn sie Stunden alt wäre, wäre großartig.


Diese Verbindung ist übrigens tot.
Felder


Wenn Sie so faul sind wie ich, tut Newvem dies im Grunde genommen in Ihrem Namen und aggregiert / verfolgt die Ergebnisse auf Bucket-Ebene in Ihrem S3-Konto.
Gruppe

2
Könnten Sie Ihre Antwort aktualisieren, um die Antwort von @ MayankJaiswal aufzunehmen?
Joseph Casey

1
Die Rechnungsabteilung weiß alles! Kein Wunder, dass sie die Macht haben, s3 Ostküste aus Versehen zu
besiegen

254

Verwenden der AWS CLI

aws s3 ls s3://mybucket/ --recursive | wc -l 

oder

aws cloudwatch get-metric-statistics \
  --namespace AWS/S3 --metric-name NumberOfObjects \
  --dimensions Name=BucketName,Value=BUCKETNAME \
              Name=StorageType,Value=AllStorageTypes \
  --start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
  --period 60 --statistic Average

Hinweis: Der obige Cloudwatch-Befehl scheint für einige zu funktionieren, für andere nicht. Hier besprochen: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Verwenden der AWS Web Console

Sie können sich den Metrikabschnitt von Cloudwatch ansehen , um die ungefähre Anzahl der gespeicherten Objekte zu erhalten. Geben Sie hier die Bildbeschreibung ein

Ich habe ungefähr 50 Millionen Produkte und es dauerte mehr als eine Stunde, um mit zu zählen aws s3 ls


18
Dies sollte näher an der Spitze sein.
Joseph Casey

3
@ JosephMCasey Ich stimme zu. Dies funktioniert auch, um die Anzahl der Objekte in einem Verzeichnis mit einem Bucket wie aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
folgt anzugeben

1
Gibt diesen Fehler aus, wenn ich die oben genannte Eingabeaufforderung in cmd ausgeführt habe - 'wc' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt. - Ich bin ziemlich neu in diesem Bereich, kann also jemand eine Lösung geben?
Sandun

Eine Warnung, dass CloudWatch nicht sehr zuverlässig zu sein scheint. Ich habe eine mp4-Datei in einem Bucket, die CloudWatch (NumberOfObjects-Metrik) als 2.300 separate Objekte zählt. Ich habe die richtige Nummer mit AWS CLI erhalten.
AlexK

Warum "Durchschnitt"? Würde jemand nicht stattdessen "Summe" wollen?
ffxsam

150

Es gibt einen --summarizeSchalter, der Informationen zur Bucket-Zusammenfassung enthält (dh Anzahl der Objekte, Gesamtgröße).

Hier ist die richtige Antwort mit AWS cli:

aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"

Total Objects: 194273

Siehe die Dokumentation


4
Das ist toll: Total Objects: 7235 Total Size: 475566411749- so einfach.
Bonh

16
Hat

Wie viel kostet es, diese Aufgabe auf einem Bucket mit 5 Millionen Objekten auszuführen?
Psychozoikum

2
Diese Antwort ist äußerst ineffizient, möglicherweise sehr langsam und kostspielig. Es durchläuft den gesamten Bucket, um die Antwort zu finden.
Weber

2
Und darf ich hinzufügen, dass das Durchlaufen von über 1,2 Milliarden Objekten, die im Standardspeicher gespeichert sind, ungefähr 6000 US-Dollar kosten kann.
C Johnson

66

Obwohl dies eine alte Frage ist und 2015 Feedback gegeben wurde, ist es jetzt viel einfacher, da S3 Web Console die Option "Größe abrufen" aktiviert hat:

Geben Sie hier die Bildbeschreibung ein

Welches bietet die folgenden:

Geben Sie hier die Bildbeschreibung ein


1
Ja, die neue AWS-Konsole macht die Berechnung der Anzahl der Objekte und der Gesamtgröße auf Knopfdruck verfügbar, obwohl dies meine Augen verletzt.
Ani

10
Dies scheint nur auf Ordnerebene zu funktionieren. "Get size" ist auf Bucket-Ebene nicht verfügbar
G-.

1
@G-. Was ist, wenn Sie alle Ordner des Buckets auswählen?
Gvasquez

4
@G-. Im Feld "Alle auswählen" werden jedoch nur die Ordner und Objekte ausgewählt, die auf der Seite angezeigt werden, nicht alle Ordner / Objekte des Buckets.
Gparis

2
@ gparis guter Punkt. Bemerkenswert. Vielen Dank. Es scheint also, dass wir in der Konsole keine Option haben, wenn mehr Dateien oder Ordner vorhanden sind, als auf einer einzelnen Seite angezeigt werden können
G-.

50

Wenn Sie das Befehlszeilentool s3cmd verwenden, können Sie eine rekursive Liste eines bestimmten Buckets abrufen und in eine Textdatei ausgeben.

s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt

Dann können Sie unter Linux ein wc -l für die Datei ausführen, um die Zeilen zu zählen (1 Zeile pro Objekt).

wc -l listing.txt

Der -rBefehl in ist für --recursive, daher sollte er auch für Unterordner funktionieren.
Deepak Joy

3 Anmerkungen dazu. a.) Sie sollten aws s3 lseher s3cmd als s3cmd verwenden, da es schneller ist. b.) Bei großen Eimern kann es lange dauern. Dauerte ca. 5 min für 1mil Dateien. c.) Siehe meine Antwort unten zur Verwendung von Cloudwatch.
MastaBlasta

46

Mit der S3-API gibt es jetzt eine einfache Lösung (verfügbar in der AWS-CLI):

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

oder für einen bestimmten Ordner:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"

1
Raphael, Ihre Ordnerabfrage funktioniert hervorragend, außer wenn der Ordner leer ist oder nicht existiert, erhalten Sie: In function length () ungültiger Typ für den Wert: None, erwartet eines von: ['string', 'array' , 'object'], empfangen: "null" Gibt es eine Möglichkeit, die Ausgabe einfach auf 0 zu setzen, wenn der Ordner leer ist oder nicht beendet wird?
user3591836

1
Ich bekomme Illegal token value '(Contents[])]' (Version 1.2.9 von aws-cli), wenn ich es nur benutze --bucket my-bucketund A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existwenn ich es benutze --bucket s3://my-bucket. (Es existiert definitiv und hat 1000+ Dateien.)
Darren Cook

@DarrenCook entferne s3: // aus dem Bucket-Namen. Der Client scheint das Protokoll nicht zu unterstützen.
Sriranjan Manjunath

Dies ist viel schneller als die wc-l-Beispiele. Mit meinen Eimern würde es ungefähr 3-4k Objekte / Sek. Zählen. Also ~ 5 Minuten pro Million Objekte. "Get Size" in der S3-Web-GUI verwendet wahrscheinlich etwas Ähnliches unter der Haube, da es ungefähr dieselbe Zeit benötigt.
Notpeter

Für SEHR große Eimer war dies die einzige Lösung, die innerhalb einer angemessenen Zeit von (weniger als 20 Minuten) für mich funktionierte
Nick Sarafa

39

Sie können AWS Cloudwatch-Metriken für s3 verwenden, um die genaue Anzahl für jeden Bucket anzuzeigen. Cloudwatch-Metrik, wenn Sie Bucket auswählen


Ich denke, das ist die beste Antwort
Oktav

Die einzig richtige Antwort, ohne etwas Lächerliches zu tun, wie 1m + Schlüssel aufzulisten. Ich habe vergessen, dass es da war.
Andrew Backer

Dies erfordert mehr Upvotes. Jede andere Lösung lässt sich in Bezug auf Kosten und Zeit schlecht skalieren.
Aaron R.

5

Gehen Sie zu AWS Billing, dann zu Berichten und dann zu AWS Usage-Berichten. Wählen Sie Amazon Simple Storage Service und dann Operation StandardStorage. Anschließend können Sie eine CSV-Datei herunterladen, die einen UsageType von StorageObjectCount enthält, in dem die Anzahl der Elemente für jeden Bucket aufgeführt ist.


4

Sie können die Gesamtzahl und den Verlauf leicht abrufen, wenn Sie zur Registerkarte "Verwaltung" der s3-Konsole gehen und dann auf "Metriken" klicken ... Screenshot der Registerkarte


Könnten Sie das Bild aktualisieren, um das NumberOfObjects (count/day)Diagramm anzuzeigen? Es wäre besser, da es in direktem Zusammenhang mit der Frage steht. In Ihrem Screenshot zeigen Sie, BucketSizeBytes (bytes/day)was zwar nützlich ist, aber nicht direkt mit dem Problem zusammenhängt.
Guzmonne

1
Ab 2019 sollte dies nun die akzeptierte Antwort sein. Der Rest ist veraltet oder langsam.
C Johnson

2

Die API gibt die Liste in Schritten von 1000 zurück. Überprüfen Sie die IsTruncated-Eigenschaft, um festzustellen, ob noch weitere vorhanden sind. Wenn dies der Fall ist, müssen Sie einen weiteren Anruf tätigen und den letzten Schlüssel, den Sie erhalten haben, beim nächsten Anruf als Marker-Eigenschaft übergeben. Sie würden dann so weitermachen, bis IsTruncated falsch ist.

Weitere Informationen finden Sie in diesem Amazon-Dokument: Durchlaufen mehrseitiger Ergebnisse


2

Alter Thread, aber immer noch relevant, da ich nach der Antwort gesucht habe, bis ich das gerade herausgefunden habe. Ich wollte eine Dateizählung mit einem GUI-basierten Tool (dh ohne Code). Ich verwende bereits ein Tool namens 3Hub für Drag & Drop-Übertragungen von und nach S3. Ich wollte wissen, wie viele Dateien ich in einem bestimmten Bucket hatte (ich glaube nicht, dass die Abrechnung ihn nach Buckets aufteilt).

So, using 3Hub, 
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac) 
- look at the line count  

Ich hatte 20521 Dateien im Bucket und zählte die Dateien in weniger als einer Minute.


2

Ich habe das Python-Skript von scalablelogic.com verwendet (Hinzufügen der Zählprotokollierung). Hat super funktioniert.

#!/usr/local/bin/python

import sys

from boto.s3.connection import S3Connection

s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.list():
    totalCount += 1
    size += key.size

print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount

Nur damit Sie wissen, dass dies mit boto3 nicht funktioniert. Ich habe unten einen Vorschlag als andere Antwort beigesteuert.
Fuzzygroup

2

Führen Sie in s3cmd einfach den folgenden Befehl aus (auf einem Ubuntu-System):

s3cmd ls -r s3://mybucket | wc -l

13
Warum haben Sie eine 5 Jahre alte Frage wiederbelebt, um eine schlecht formatierte Kopie einer vorhandenen Antwort zu veröffentlichen ?
Zwei-Bit-Alchemist

Die vorherige Antwort hat die Ausgabe unnötigerweise in eine txt-Datei geleitet.
mjsa

10
IMO sollte dies dann ein Kommentar zu dieser Antwort sein. Dies ist ein wirklich trivialer Unterschied.
Zwei-Bit-Alchemist

2
Scheint eine würdige Antwort zu sein - zumal die ausgewählte Antwort auf diese Frage mit "Es gibt keinen Weg ..." beginnt und @mjsa eine einzeilige Antwort geliefert hat.
Nan

Dies ist keine gute Antwort, da versionierte Objekte nicht berücksichtigt werden.
3h4x

2

Wenn Sie AWS CLI unter Windows verwenden, können Sie die Measure-Objectvon PowerShell verwenden, um die Gesamtzahl der Dateien abzurufen, genau wie wc -lunter * nix.

PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object

Count    : 25
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

Ich hoffe es hilft.


2

Eine der einfachsten Möglichkeiten, die Anzahl der Objekte in s3 zu zählen, ist:

Schritt 1: Wählen Sie den Stammordner aus. Schritt 2: Klicken Sie auf Aktionen -> Löschen (natürlich nicht löschen). Schritt 3: Warten Sie einige Minuten. Aws zeigt Ihnen die Anzahl der Objekte und deren Gesamtgröße an.

UpVote, wenn Sie die Lösung finden.


1

Keine der APIs gibt Ihnen eine Zählung, da es dafür wirklich keine Amazon-spezifische API gibt. Sie müssen nur einen Listeninhalt ausführen und die Anzahl der zurückgegebenen Ergebnisse zählen.


Aus irgendeinem Grund werden in den Ruby-Bibliotheken (right_aws / appoxy_aws) nicht mehr als die ersten 1000 Objekte in einem Bucket aufgelistet. Gibt es andere, die alle Objekte auflisten?
Felder

Wenn Sie die Liste anfordern, wird ein "NextToken" -Feld bereitgestellt, über das Sie die Anforderung erneut mit dem Token senden können. Weitere werden aufgelistet.
Mitch Dempsey

1

Verwenden Sie in der Befehlszeile in AWS CLI ls plus --summarize. Sie erhalten die Liste aller Ihrer Artikel und die Gesamtzahl der Dokumente in einem bestimmten Eimer. Ich habe dies nicht mit Eimern versucht, die Untereimer enthalten:

aws s3 ls "s3://MyBucket" --summarize

Das dauert etwas länger (das Auflisten meiner 16 + K-Dokumente dauerte ungefähr 4 Minuten), ist aber schneller als das gleichzeitige Zählen von 1K.



0

3Hub wird eingestellt. Es gibt eine bessere Lösung: Sie können Transmit (nur Mac) verwenden. Dann stellen Sie einfach eine Verbindung zu Ihrem Bucket her und wählen Show Item Countaus dem ViewMenü.


Senden zeigt leider nur bis zu 1000 Artikel (und die Anzahl der Artikel ist daher auch auf 1000 maximal)
Tino

0

Sie können den s3-Browser von http://s3browser.com/ herunterladen und installieren . Wenn Sie einen Bucket in der mittleren rechten Ecke auswählen, sehen Sie die Anzahl der Dateien im Bucket. Die angezeigte Größe ist jedoch in der aktuellen Version falsch.

Gubs


0

Am einfachsten ist es, die Entwicklerkonsole zu verwenden. Wenn Sie beispielsweise auf Chrome arbeiten, wählen Sie "Entwicklertools". Im Folgenden sehen Sie, ob Sie Übereinstimmungen finden und zählen oder durchführen können, z. B. 280-279 + 1 = 2

...


Könnten Sie bitte näher erläutern, wie Sie mit den Entwicklertools die Gesamtzahl der Objekte in einem Bucket ermittelt haben?
Jugal Panchal

0

Sie können möglicherweise Amazon S3-Inventar verwenden, mit dem Sie eine Liste der Objekte in einer CSV-Datei erhalten




0

Sie können diesen Befehl cli einfach ausführen, um die Gesamtanzahl der Dateien im Bucket oder in einem bestimmten Ordner abzurufen

Scannen Sie den gesamten Eimer

aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l

Mit diesem Befehl können Sie Details abrufen

aws s3api list-objects-v2 --bucket BUCKET_NAME

Scannen Sie einen bestimmten Ordner

aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l

aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l

0

Wenn Sie nach bestimmten Dateien suchen, beispielsweise nach .jpgBildern, können Sie Folgendes tun:

aws s3 ls s3://your_bucket | grep jpg | wc -l

0

Im Folgenden erfahren Sie, wie Sie dies mit dem Java-Client tun können.

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;

public class AmazonS3Service {

    private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
    private static final String S3_SECRET_KEY = "SECRET_KEY";
    private static final String S3_ENDPOINT = "S3_URL";

    private AmazonS3 amazonS3;

    public AmazonS3Service() {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setProtocol(Protocol.HTTPS);
        clientConfiguration.setSignerOverride("S3SignerType");
        BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
        AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
        amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
                .withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
    }

    public int countObjects(String bucketName) {
        int count = 0;
        ObjectListing objectListing = amazonS3.listObjects(bucketName);
        int currentBatchCount = objectListing.getObjectSummaries().size();
        while (currentBatchCount != 0) {
            count += currentBatchCount;
            objectListing = amazonS3.listNextBatchOfObjects(objectListing);
            currentBatchCount = objectListing.getObjectSummaries().size();
        }
        return count;
    }
}

0

Hier ist die boto3-Version des oben eingebetteten Python-Skripts.

import sys
import boto3

s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.objects.all():
    totalCount += 1
    size += key.size

print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`

0

aws s3 ls s3: // Bucket-Name / Ordner-Präfix-falls-irgendein --rekursiv | wc -l


Es funktioniert für mehr als 1000, es zählte 4258 für mich
KingAndrew

Die Zeilen entsprechen nicht direkt der Anzahl der Dateien. Weil sie auch eine ganze Zeile nur für das Datum und das Verzeichnis haben.
CMCDragonkai

Der Befehl funktioniert für eine begrenzte Anzahl von Dateien. In meinem Fall beträgt die Anzahl der Dateien mehr als eine Million und es wird nie ein Ergebnis erzielt. Es ist jedoch eine gute Option für begrenzte Dateien.
Jugal Panchal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.