Wie sucht man einen Amazon S3 Bucket?


Antworten:


31

S3 verfügt nicht über eine native "Suche in diesem Bucket", da der tatsächliche Inhalt unbekannt ist. Da S3 auf Schlüsseln / Werten basiert, gibt es keine native Möglichkeit, auf viele Knoten gleichzeitig zuzugreifen, auch nicht auf herkömmliche Datenspeicher, die a (SELECT * FROM ... WHERE ...)(in SQL) anbieten Modell).

Sie müssen ListBucketlediglich eine Liste der Objekte im Bucket abrufen und dann jedes Element durchlaufen, um eine von Ihnen implementierte benutzerdefinierte Operation auszuführen. Dies ist Ihre Suche.


42
Dies ist nicht mehr der Fall. Siehe Rhondas Antwort unten: stackoverflow.com/a/21836343/1101095
Nate

11
An alle Befürworter des obigen Kommentars: Das OP gibt nicht an, ob sie die Dateinamen oder den Schlüsselinhalt (z. B. Dateiinhalt) durchsuchen möchten. Die Antwort von @ rhonda ist also möglicherweise immer noch nicht ausreichend. Es scheint, dass dies letztendlich eine Übung ist, die dem Verbraucher überlassen bleibt, da die Verwendung der S3-Konsole Ihren App-Benutzern und allgemeinen Benutzern kaum zur Verfügung steht. Es ist im Grunde nur für die Bucket-Eigentümer- und / oder IAM-Rollen neu verfügbar.
Cody Caughlan

Gibt es einen Indizierungsdienst wie lucene.net, um diese Bucket-Dokumente zu indizieren?
Munavvar

Ich kam immer wieder auf diese Antwort zurück und baute ein Tool, um zu helfen: bucketsearch.net - ermöglicht Platzhaltersuche usw.
Jon M

251

Nur eine Anmerkung, die Sie hier hinzufügen sollten: Es ist jetzt 3 Jahre später, aber dieser Beitrag ist in Google ganz oben, wenn Sie "So suchen Sie einen S3-Bucket" eingeben.

Vielleicht suchen Sie nach etwas Komplexerem, aber wenn Sie hier gelandet sind, um herauszufinden, wie Sie einfach ein Objekt (eine Datei) anhand seines Titels finden können, ist es verrückt einfach:

Öffnen Sie den Bucket, wählen Sie auf der rechten Seite "none" aus und geben Sie den Dateinamen ein.

http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html


43
Genau das habe ich gesucht. Schreckliches User Experience Design, um keine visuellen Hinweise zu haben
Keith Entzeroth

2
Sie müssen eine Datei im Bucket auswählen und dann mit der Eingabe beginnen.
Cabe56

30
Lassen Sie uns trotzdem nur nach dem Präfix des Artikelnamens suchen.
Daniel Flippance

21
Das ist absolut ärgerlich! Die Leute reden über etwas auf der rechten Seite oder eine gelbe Box, aber ich kann nichts finden. Genau die gleiche Meldung "Geben Sie ein Präfix ein ...". Wie ist "Search Bucket" nicht die Standardeinstellung? Es ist fast so unentdeckbar wie Atlassian Software ...
Vegather

40
Ist diese Antwort noch aktuell? Ich sehe kein "" keine "auf der rechten Seite" und der Dokumentationslink in der Antwort leitet jetzt zu einer anderen Seite weiter.
BiscuitBaker

112

Hier ist eine kurze und hässliche Möglichkeit, Dateinamen mithilfe der AWS-CLI zu suchen :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-

1
aws s3 ls s3: // dein Eimer - rekursiv | grep your-search War gut genug für meine Suche, danke Abe Voelker.
Mann.2067067

3
Alle Eimer: aws s3 ls | awk '{print $ 3}' | während Zeile lesen; echo $ line; aws s3 ls s3: // $ line --recursive | grep your-search; fertig
Akom

1
Was geschnitten ist -c 32- ohne diese auch Suche funktioniert
Sunil

1
cut -c 32-Hackt einfach den Zeitstempel und die Dateigrößeninformationen von der Ausgabe ab, die auf meinem System 32 Zeichen benötigt. Sie brauchen es nicht, aber wenn Sie die Ausgabe in einen anderen Befehl leiten, kann es nützlich sein, eine "saubere" Ausgabe zu haben.
Abe Voelker

CLI unterstützt include/exclude. Also,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish

25

Es gibt (mindestens) zwei verschiedene Anwendungsfälle, die als "Search the Bucket" bezeichnet werden könnten:

  1. Suchen Sie in jedem im Eimer gespeicherten Objekt nach etwas . Dies setzt ein gemeinsames Format für alle Objekte in diesem Bucket voraus (z. B. Textdateien) usw. usw. Für so etwas müssen Sie das tun, was Cody Caughlan gerade beantwortet hat. Die AWS S3-Dokumente enthalten Beispielcode, der zeigt, wie dies mit dem AWS SDK für Java gemacht wird: Auflisten von Schlüsseln Verwenden des AWS SDK für Java (dort finden Sie auch PHP- und C # -Beispiele).

  2. Liste item Suche nach etwas in dem Objektschlüssel in diesem Eimer enthalten ist ; S3 unterstützt dies teilweise , indem genaue Präfix-Übereinstimmungen + reduzierende Übereinstimmungen nach einem Trennzeichen zugelassen werden. Dies wird im AWS S3-Entwicklerhandbuch ausführlicher erläutert . Dies ermöglicht es beispielsweise, "Ordner" zu implementieren, indem als Objektschlüssel so etwas wie verwendet wird

    Ordner / Unterordner / Datei.txt
    Wenn Sie diese Konvention befolgen, zeigen Ihnen die meisten S3-GUIs (z. B. die AWS-Konsole) eine Ordneransicht Ihres Buckets.


Dokumente für die Verwendung von Präfix in Ruby
James

22

AWS hat einen neuen Service zum Abfragen von S3-Buckets mit SQL veröffentlicht: Amazon Athena https://aws.amazon.com/athena/


2
argh ... ich verstehe ... "Athena ist in den USA im Westen (Nordkalifornien) nicht verfügbar. Bitte wählen Sie eine andere Region aus."
Clintm

2
Es ist ein Overhead mit all diesen SQL-Abfragen, wenn man bedenkt, dass ich nur grep wollte
Ali Gajani

4
@Clintm - Wechsel zu us-east-1 (N. Virginia)
slocumro

21

Es gibt mehrere Optionen, von denen keine eine einfache Volltextlösung mit einem Schuss ist:

  1. Schlüsselname Mustersuche : Suche nach Schlüsseln , mit einigen Saiten- beginnen , wenn Sie sorgfältig Schlüsselnamen entwerfen, dann können Sie ziemlich schnelle Lösung haben.

  2. An Schlüssel angehängte Metadaten durchsuchen : Wenn Sie eine Datei an AWS S3 senden, können Sie den Inhalt verarbeiten, einige Metainformationen extrahieren und diese Metainformationen in Form von benutzerdefinierten Headern an den Schlüssel anhängen. Auf diese Weise können Sie Schlüsselnamen und Header abrufen, ohne vollständigen Inhalt abrufen zu müssen. Die Suche muss sequentiell erfolgen, dafür gibt es keine "SQL-ähnliche" Suchoption. Bei großen Dateien kann dies viel Netzwerkverkehr und Zeit sparen.

  3. Speichern von Metadaten in SimpleDB : wie im vorherigen Punkt, jedoch mit Speichern der Metadaten in SimpleDB. Hier haben Sie SQL-ähnliche Select-Anweisungen. Bei großen Datenmengen können Sie die SimpleDB-Grenzwerte erreichen, die überwunden werden können (Partitionsmetadaten über mehrere SimpleDB-Domänen hinweg). Wenn Sie jedoch wirklich weit gehen, müssen Sie möglicherweise einen anderen Metedatentyp der Datenbank verwenden.

  4. Sequentielle Volltextsuche des Inhalts - Verarbeitung aller Schlüssel nacheinander. Sehr langsam, wenn Sie zu viele Schlüssel zum Verarbeiten haben.

Wir speichern 1440 Versionen einer Datei pro Tag (eine pro Minute) für ein paar Jahre. Mit dem versionierten Bucket ist dies problemlos möglich. Das Erhalten einer älteren Version braucht jedoch Zeit, da man Version für Version nacheinander wechseln muss. Manchmal verwende ich einen einfachen CSV-Index mit Datensätzen, der die Veröffentlichungszeit plus die Versions-ID anzeigt. Wenn dies der Fall ist, kann ich ziemlich schnell zur älteren Version springen.

Wie Sie sehen, ist AWS S3 nicht für die Volltextsuche konzipiert, sondern ein einfacher Speicherdienst.


4

Suche nach Präfix in der S3-Konsole

direkt in der AWS Console-Bucket-Ansicht.

Geben Sie hier die Bildbeschreibung ein

Kopieren Sie die gewünschten Dateien mit s3-dist-cp

Wenn Sie Tausende oder Millionen von Dateien haben, können Sie die gewünschten Dateien auch mithilfe einer verteilten Kopie an einen anderen Speicherort kopieren . Sie führen dies auf EMR in einem Hadoop-Job aus. Das Coole an AWS ist, dass sie ihre benutzerdefinierte S3-Version s3-dist-cp bereitstellen . Sie können gewünschte Dateien mithilfe eines regulären Ausdrucks im Feld groupBy gruppieren. Sie können dies beispielsweise in einem benutzerdefinierten Schritt für EMR verwenden

[
    {
        "ActionOnFailure": "CONTINUE",
        "Args": [
            "s3-dist-cp",
            "--s3Endpoint=s3.amazonaws.com",
            "--src=s3://mybucket/",
            "--dest=s3://mytarget-bucket/",
            "--groupBy=MY_PATTERN",
            "--targetSize=1000"
        ],
        "Jar": "command-runner.jar",
        "Name": "S3DistCp Step Aggregate Results",
        "Type": "CUSTOM_JAR"
    }
]

Es scheint, dass die Bucket-Ansicht der AWS-Konsole nicht Datei für Datei mit einem Filter erstellt wird. Es ist in der Lage, Ergebnisse extrem schnell zurückzugeben, vorausgesetzt, eine Teilzeichenfolge der gesuchten Datei (en). Gibt es einen Client / ein Tool / eine API, die ich anders als die AWS-Konsole verwenden kann, um die Ergebnisse auf dieselbe zeitnahe Weise zu erhalten? @ high6. In der Vergangenheit habe ich versucht, Boto zu verwenden, aber der beste Ansatz schien darin zu bestehen, den gesamten Bucket zu wiederholen und Ihre Suchkriterien auf jeden Dateinamen anzuwenden. IE. extrem langsam
Kopieren und Einfügen

4

Wenn Sie unter Windows arbeiten und keine Zeit haben, eine gute grepAlternative zu finden, ist ein schneller und schmutziger Weg:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

und dann eine Schnellsuche in myfile.txt durchführen

Das "Ordner" -Bit ist optional.

PS: Wenn Sie AWS CLI nicht installiert haben, finden Sie hier einen Einzeiler mit Chocolatey Package Manager

choco install awscli

PPS Wenn Sie den Chocolatey-Paketmanager nicht haben, holen Sie ihn sich! Ihr Leben unter Windows wird 10x besser. (Ich bin in keiner Weise mit Chocolatey verbunden, aber hey, es ist wirklich ein Muss).


Wenn der Benutzer awscli choco installieren kann, kann er grep installieren, nein? Oder den nativen Fund von Windows verwenden?
Dean Radcliffe

2

Angesichts der Tatsache, dass Sie sich in AWS befinden, würde ich denken, dass Sie die CloudSearch-Tools verwenden möchten. Stellen Sie die Daten, die Sie durchsuchen möchten, in ihren Dienst. Zeigen Sie auf die S3-Tasten.

http://aws.amazon.com/cloudsearch/


7
Nicht wirklich das, wonach das OP gesucht hat
Clintm

für mich würde es bedeuten, dort alle Daten zu speichern - Vervielfältigung von Daten
BG Bruno

1

Eine andere Möglichkeit besteht darin, den S3-Bucket auf Ihrem Webserver zu spiegeln und lokal zu durchlaufen. Der Trick ist, dass die lokalen Dateien leer sind und nur als Skelett verwendet werden. Alternativ könnten die lokalen Dateien nützliche Metadaten enthalten, die Sie normalerweise von S3 benötigen würden (z. B. Dateigröße, Mimetyp, Autor, Zeitstempel, UUID). Wenn Sie eine URL zum Herunterladen der Datei angeben, suchen Sie lokal und geben Sie einen Link zur S3-Adresse an.

Das Durchlaufen lokaler Dateien ist einfach und dieser Ansatz für die S3-Verwaltung ist sprachunabhängig. Durch das Durchlaufen lokaler Dateien wird auch das Verwalten und Abfragen einer Datenbank mit Dateien oder Verzögerungen beim Ausführen einer Reihe von Remote-API-Aufrufen zur Authentifizierung und zum Abrufen des Bucket-Inhalts vermieden.

Sie können Benutzern erlauben, Dateien über FTP oder HTTP direkt auf Ihren Server hochzuladen und dann zu Spitzenzeiten einen Stapel neuer und aktualisierter Dateien an Amazon zu übertragen, indem Sie einfach über die Verzeichnisse für Dateien beliebiger Größe rekursieren. Ersetzen Sie nach Abschluss einer Dateiübertragung an Amazon die Webserverdatei durch eine leere Datei mit demselben Namen. Wenn eine lokale Datei eine Dateigröße hat, stellen Sie sie direkt bereit, da sie auf die Stapelübertragung wartet.


Eine großartige Möglichkeit, Ihren Knotenspeicherplatz auf einer EXTFS2 / 3-Festplatte zu sprengen, wenn Sie Millionen von Dateien in Ihrem S3-Bucket haben ...
tpartee

1

So habe ich es gemacht: Ich habe Tausende von Dateien in s3. Ich habe das Eigenschaftenfenster einer Datei in der Liste gesehen. Sie können den URI dieser Datei sehen und ich habe ihn in den Browser kopiert - es war eine Textdatei und sie wurde gut gerendert. Jetzt habe ich die UUID in der URL durch die UUID ersetzt, die ich zur Hand hatte, und dort boomt die Datei.

Ich wünschte, AWS hätte eine bessere Möglichkeit, eine Datei zu durchsuchen, aber das hat bei mir funktioniert.


1

Versuchen Sie diesen Befehl:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

Dann können Sie dies in ein grep leiten, um bestimmte Dateitypen dazu zu bringen, mit ihnen zu tun, was Sie wollen.


1
Hinweis: --output textGibt an, dass die Ausgabe nur Text ist, nicht JSON usw., und --query 'Contents[].{Key: Key, Size: Size}'filtert lediglich die Ausgabe der Liste nach Dateiname und Dateigröße. Es wird nicht nach Key: Keyoder dergleichen gesucht .
Matt

1

Ich habe es folgendermaßen versucht

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

Dies gibt den tatsächlichen Pfad aus, in dem die Datei vorhanden ist

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv

1

Dies ist ein bisschen alter Thread - aber vielleicht helfen Sie jemandem, der noch sucht - ich bin derjenige, der ein Jahr danach sucht.

Die Lösung könnte " AWS Athena " sein, wo Sie nach solchen Daten suchen können

'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

Derzeit beträgt der Preis für 1-TB-Daten 5 US-Dollar. Wenn Ihre Abfragesuche beispielsweise über eine 1-TB-Datei dreimal so hoch ist, betragen Ihre Kosten 15 US-Dollar. Wenn beispielsweise nur eine Spalte im "konvertierten Spaltenformat" vorhanden ist, was Sie lesen möchten, zahlen Sie 1 US-Dollar / 3 des Preises bedeutet 1,67 $ / TB.


Scheint nicht für jede Anwendung machbar zu sein, die eine intensive Suche erfordert, da die Kosten jedoch ziemlich hoch sind ...
tnkh

@tnkh Ich stimme zu - ich möchte mehr Optionen mit # s3 auch
BG Bruno


0

Ich habe etwas wie unten gemacht, um Muster in meinem Eimer zu finden

def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
    var s3Client = new AmazonS3Client()
    var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
    var objectListing: ObjectListing = null
    var res: List[String] = List()

    do {
      objectListing = s3Client.listObjects(listObjectsRequest)
      res = res ++ objectListing.getCommonPrefixes
      listObjectsRequest.setMarker(objectListing.getNextMarker)
    } while (objectListing.isTruncated)
    res
  }

Bei größeren Buckets nimmt dies zu viel Zeit in Anspruch, da alle Objektzusammenfassungen von den Aws zurückgegeben werden und nicht nur diejenigen, die dem Präfix und dem Trennzeichen entsprechen. Ich suche nach Möglichkeiten, um die Leistung zu verbessern, und bisher habe ich nur festgestellt, dass ich die Schlüssel benennen und sie in Eimern richtig organisieren sollte.


0

Ich hatte das gleiche Problem. Die Suche in S3 sollte viel einfacher sein als in der aktuellen Situation. Deshalb habe ich dieses Open-Source-Tool für die Suche in S3 implementiert.

SUCHE ist ein Open Source S3-Suchwerkzeug. Es wurde implementiert, wobei stets berücksichtigt wurde, dass die Leistung der entscheidende Faktor ist, und gemäß den Benchmarks wird der Bucket durchsucht, der innerhalb von Sekunden ~ 1000 Dateien enthält.

Die Installation ist einfach. Sie laden nur die Docker-Compose-Datei herunter und führen sie mit aus

docker-compose up

SSEARCH wird gestartet und Sie können alles in jedem Eimer suchen, den Sie haben.


0

Schneller Vorlauf bis 2020 und die Verwendung von aws-okta als 2fa, der folgende Befehl, während das Durchlaufen aller Objekte und Ordner in diesem bestimmten Bucket (+270.000) höllisch langsam funktionierte, funktionierte einwandfrei.

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt

0

Verwenden Sie Amazon Athena, um den S3-Bucket abzufragen. Laden Sie außerdem Daten in die Amazon Elastic-Suche. Hoffe das hilft.


0

Keine technische Antwort, aber ich habe eine Anwendung erstellt, die die Platzhaltersuche ermöglicht: https://bucketsearch.net/

Es indiziert Ihren Bucket asynchron und ermöglicht Ihnen dann, die Ergebnisse zu durchsuchen.

Es ist kostenlos zu benutzen (Spendenware).


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.