Come si cerca un bucket Amazon S3?


Risposte:


31

S3 non ha una "ricerca in questo bucket" nativa poiché il contenuto effettivo è sconosciuto - inoltre, poiché S3 è basato su chiave / valore, non esiste un modo nativo per accedere a molti nodi contemporaneamente per più datastore tradizionali che offrono un (SELECT * FROM ... WHERE ...)(in un SQL modello).

Quello che dovrai fare è eseguire ListBucketper ottenere un elenco di oggetti nel bucket e quindi scorrere su ogni elemento eseguendo un'operazione personalizzata che implementi, che è la tua ricerca.


42
Questo non è più il caso. Vedi la risposta di rhonda di seguito: stackoverflow.com/a/21836343/1101095
Nate

11
A tutti i votanti del commento sopra: l'OP non indica se vogliono cercare i nomi dei file o il contenuto della chiave (ad es. Il contenuto del file). Quindi la risposta di @ rhonda potrebbe non essere ancora sufficiente. Sembra che alla fine questo sia un esercizio lasciato al consumatore, poiché l'utilizzo della console S3 è difficilmente disponibile per gli utenti dell'app e gli utenti generali. Fondamentalmente si basa solo sul proprietario del bucket e / o sui ruoli IAM.
Cody Caughlan,

Esiste un servizio di indicizzazione come lucene.net per indicizzare questi documenti bucket.
Munavvar,

Continuavo a tornare a questa risposta e ho creato uno strumento per aiutare: bucketsearch.net - consente la ricerca con caratteri jolly ecc.
Jon M

251

Solo una nota da aggiungere qui: sono trascorsi 3 anni, ma questo post è in cima a Google quando si digita "Come cercare un bucket S3".

Forse stai cercando qualcosa di più complesso, ma se sei atterrato qui cercando di capire come trovare semplicemente un oggetto (file) in base al titolo, è follemente semplice:

apri il bucket, seleziona "none" sul lato destro e inizia a digitare il nome del file.

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


43
Questo e 'esattamente quello che stavo cercando. Progetto di esperienza utente terribile con zero segnali visivi
Keith Entzeroth,

2
È necessario selezionare un file nel bucket, quindi iniziare a digitare.
cabe56,

30
Ancora cerchiamo solo di cercare il prefisso del nome dell'oggetto.
Daniel Flippance,

21
Questo è assolutamente esasperante! Le persone parlano di qualcosa sul lato destro o di una scatola gialla, ma non riesco a trovare nulla. Proprio lo stesso messaggio "Digita un prefisso ...". In che modo "Search Bucket" non è quello predefinito ?? È quasi da scoprire come il software Atlassian ...
Vegather il

40
Questa risposta è ancora attuale? Non vedo alcun "" nessuno "sul lato destro" e il collegamento alla documentazione nella risposta ora inoltra a una pagina diversa.
BiscuitBaker,

112

Ecco un modo breve e brutto per eseguire i nomi dei file di ricerca utilizzando l' interfaccia della riga di comando di AWS :

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

1
aws s3 ls s3: // your-bucket --recursive | grep your-search È stato abbastanza buono per la mia ricerca, grazie Abe Voelker.
man.2067067

3
Tutti i secchi: aws s3 ls | awk '{print $ 3}' | mentre leggi la riga; fare eco $ line; aws s3 ls s3: // $ line --recursive | grep your-search; fatto
Akom,

1
ciò che è tagliato -c 32- senza questa ricerca funziona anche
sunil

1
cut -c 32-taglia semplicemente il timestamp e le informazioni sulla dimensione del file dall'output, che sul mio sistema occupa 32 caratteri. Non è necessario, ma se si esegue il piping dell'output in un altro comando, può essere utile avere un output "pulito".
Abe Voelker,

Supporta CLI include/exclude. Quindi,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish il

25

Esistono (almeno) due diversi casi d'uso che potrebbero essere descritti come "cerca nel secchio":

  1. Cerca qualcosa dentro ogni oggetto immagazzinato nel secchio; questo assume un formato comune per tutti gli oggetti in quel bucket (diciamo, file di testo), ecc. ecc. Per qualcosa del genere, sei costretto a fare ciò che Cody Caughlan ha appena risposto. I documenti AWS S3 hanno un codice di esempio che mostra come eseguire questa operazione con l'SDK AWS per Java: elencare le chiavi utilizzando l'SDK AWS per Java (qui troverai anche esempi PHP e C #).

  2. Voce di elenco Cerca qualcosa nelle chiavi oggetto contenute in quel bucket; S3 ha avere parziale supporto per questo, sotto forma di consentire una perfetta corrispondenza dei prefissi + collasso partite dopo un delimitatore. Questo è spiegato in maggior dettaglio nella Guida per gli sviluppatori di AWS S3 . Ciò consente, ad esempio, di implementare "cartelle" usando come chiavi oggetto qualcosa del genere

    cartella / sottocartella / file.txt
    Se segui questa convenzione, la maggior parte delle GUI S3 (come la Console AWS) ti mostrerà una vista della cartella del tuo bucket.


documenti per l'utilizzo del prefisso in ruby
James,

22

AWS ha rilasciato un nuovo servizio per eseguire query sui bucket S3 con SQL: Amazon Athena https://aws.amazon.com/athena/


2
argh ... Ottengo ... "Athena non è disponibile negli Stati Uniti occidentali (N. California). Seleziona un'altra regione."
Clintm,

2
È un sovraccarico con tutte queste query SQL considerando che volevo solo grep
Ali Gajani

4
@Clintm - cambia in us-east-1 (N. Virginia)
slocumro

21

Esistono diverse opzioni, nessuna delle quali è una soluzione full text "one shot" semplice:

  1. Ricerca modello nome chiave : ricerca di chiavi che iniziano con una stringa: se si progettano con cura i nomi delle chiavi, è possibile che si abbia una soluzione piuttosto rapida.

  2. Cerca metadati allegati alle chiavi : quando pubblichi un file su AWS S3, puoi elaborare il contenuto, estrarre alcune meta informazioni e allegare queste meta informazioni sotto forma di intestazioni personalizzate nella chiave. Ciò consente di recuperare i nomi delle chiavi e le intestazioni senza dover recuperare il contenuto completo. La ricerca deve essere eseguita in sequenza, non esiste un'opzione di ricerca "sql like" per questo. Con file di grandi dimensioni ciò potrebbe far risparmiare molto tempo e traffico di rete.

  3. Archivia i metadati su SimpleDB : come punto precedente, ma con l'archiviazione dei metadati su SimpleDB. Qui hai sql come le istruzioni selezionate. In caso di set di dati di grandi dimensioni, è possibile che vengano raggiunti limiti SimpleDB, che possono essere superati (metadati di partizione su più domini SimpleDB), ma se si va molto lontano, potrebbe essere necessario utilizzare un altro tipo di database di metedati.

  4. Ricerca sequenziale del testo completo del contenuto - elaborazione di tutte le chiavi una per una. Molto lento, se hai troppe chiavi da elaborare.

Stiamo memorizzando 1440 versioni di un file al giorno (una al minuto) per un paio d'anni, usando il bucket con versione, è facilmente possibile. Ma ottenere una versione precedente richiede tempo, in quanto si deve passare sequenzialmente versione per versione. A volte uso un semplice indice CSV con i record, mostrando i tempi di pubblicazione più l'id versione, avendo questo, potrei passare alla versione precedente piuttosto rapidamente.

Come vedi, AWS S3 non è da solo progettato per ricerche full text, è un semplice servizio di archiviazione.


4

Cerca per prefisso nella console S3

direttamente nella vista bucket di AWS Console.

inserisci qui la descrizione dell'immagine

Copia i file desiderati usando s3-dist-cp

Quando hai migliaia o milioni di file un altro modo per ottenere i file desiderati è copiarli in un'altra posizione usando la copia distribuita . Lo esegui su EMR in un lavoro Hadoop. La cosa bella di AWS è che forniscono la loro versione personalizzata S3 s3-dist-cp . Ti permette di raggruppare i file desiderati usando un'espressione regolare nel campo groupBy. Puoi usarlo ad esempio in un passaggio personalizzato su EMR

[
    {
        "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"
    }
]

Sembrerebbe che la vista bucket della console AWS non vada file per file applicando un filtro. È in grado di restituire risultati estremamente rapidamente a condizione che una sottostringa dei file che sto cercando. Esiste un client / strumento / API che posso usare diverso dalla console AWS per ottenere i risultati nello stesso maniero tempestivo. @ high6. In passato ho tentato di usare boto, ma l'approccio migliore sembrava iterare l'intero bucket applicando i criteri di ricerca a ogni nome di file. IE. estremamente lento
Copia e incolla il

4

Se sei su Windows e non hai tempo a trovare una buona grepalternativa, un modo rapido e sporco sarebbe:

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

e quindi esegui una ricerca rapida in myfile.txt

Il bit "cartella" è facoltativo.

PS se non hai installato l'interfaccia della riga di comando di AWS: ecco una riga che utilizza il gestore di pacchetti Chocolatey

choco install awscli

PPS Se non hai il gestore dei pacchetti Chocolatey, prendilo! La tua vita su Windows migliorerà di 10 volte. (Non sono affiliato con Chocolatey in alcun modo, ma hey, è un must, davvero).


Se l'utente può installare choco awscli, può installare grep, no? O utilizzare la ricerca nativa di Windows?
Dean Radcliffe,


1

Un'altra opzione è quella di eseguire il mirroring del bucket S3 sul server Web e attraversare localmente. Il trucco è che i file locali sono vuoti e usati solo come scheletro. In alternativa, i file locali potrebbero contenere utili metadati che normalmente avresti bisogno di ottenere da S3 (es. Dimensione file, mimetype, autore, timestamp, uuid). Quando si fornisce un URL per scaricare il file, cercare localmente e fornire un collegamento all'indirizzo S3.

Il trasferimento di file locali è semplice e questo approccio per la gestione di S3 è indipendente dalla lingua. Il traversamento di file locale evita anche la manutenzione e l'interrogazione di un database di file o ritardi nell'effettuare una serie di chiamate API remote per autenticare e ottenere il contenuto del bucket.

Potresti consentire agli utenti di caricare file direttamente sul tuo server tramite FTP o HTTP e quindi trasferire un batch di file nuovi e aggiornati su Amazon nelle ore non di punta semplicemente ricorrendo alle directory per i file di qualsiasi dimensione. Al completamento di un trasferimento di file su Amazon, sostituire il file del server Web con uno vuoto con lo stesso nome. Se un file locale ha dimensioni di file, servilo direttamente perché è in attesa del trasferimento batch.


Ottimo modo per esplodere lo spazio di archiviazione del nodo su un disco EXTFS2 / 3 se hai milioni di file nel tuo bucket S3 ...
tpartee

1

Il modo in cui l'ho fatto è: ho migliaia di file in s3. Ho visto il pannello delle proprietà di un file nell'elenco. Puoi vedere l'URI di quel file e io lo copio incollato sul browser: era un file di testo ed è stato riprodotto bene. Ora ho sostituito l'UUID nell'URL con l'UUID che avevo a portata di mano e boom il file è.

Vorrei che AWS avesse un modo migliore per cercare un file, ma questo ha funzionato per me.


1

Prova questo comando:

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

Quindi puoi convogliare questo in un grep per ottenere tipi di file specifici per fare quello che vuoi con loro.


1
Nota: --output textspecifica che l'output sarà di testo semplice, non JSON, ecc. E --query 'Contents[].{Key: Key, Size: Size}'filtra semplicemente l'output dell'elenco in base al nome e alla dimensione del file. Non cerca Key: Keyo simili.
Matt

1

Ho provato nel modo seguente

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

Ciò genera il percorso effettivo in cui esiste il file

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

1

Questo è un po 'vecchio thread - ma forse aiuta qualcuno che ancora cerca - Sono io quello che lo cerca un anno.

La soluzione potrebbe essere " AWS Athena " in cui è possibile cercare dati come questo

'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/

Attualmente il prezzo è di $ 5 per i dati da 1 TB - quindi, ad esempio, se la tua ricerca cerca in un file da 1 TB 3 volte il tuo costo è $ 15 - ma ad esempio se c'è solo 1 colonna in "formato colonna convertito" quello che vuoi leggere, pagherai 1 / 3 del prezzo significa $ 1,67 / TB.


Non sembra fattibile per qualsiasi applicazione che richiede una ricerca intensiva in quanto il costo è piuttosto elevato ...
tnkh

@tnkh Sono d'accordo - Vorrei più opzioni anche con # s3
BG Bruno


0

Ho fatto qualcosa come di seguito per trovare modelli nel mio secchio

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
  }

Per i secchi più grandi ciò richiede troppo tempo poiché tutti i riepiloghi degli oggetti vengono restituiti da Aws e non solo quelli che corrispondono al prefisso e al delimitatore. Sto cercando modi per migliorare le prestazioni e finora ho solo trovato che avrei dovuto nominare le chiavi e organizzarle in secchi in modo corretto.


0

Ho affrontato lo stesso problema. La ricerca in S3 dovrebbe essere molto più semplice della situazione attuale. Ecco perché, ho implementato questo strumento open source per la ricerca in S3.

SSEARCH è uno strumento di ricerca S3 open source completo. È stato implementato tenendo sempre presente che le prestazioni sono il fattore critico e, in base ai parametri di riferimento, cerca nel bucket che contiene ~ 1000 file in pochi secondi.

L'installazione è semplice. Scarica solo il file componi docker ed eseguilo con

docker-compose up

Verrà avviato SSEARCH e puoi cercare qualsiasi cosa in qualsiasi bucket.


0

Velocemente fino al 2020, e usando aws-okta come nostro 2fa, il seguente comando, mentre lento come un iterare attraverso tutti gli oggetti e le cartelle in questo particolare bucket (+270.000) ha funzionato bene.

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

0

Usa Amazon Athena per eseguire una query sul bucket S3. Inoltre, carica i dati nella ricerca Amazon Elastic. Spero che questo ti aiuti.


0

Non è una risposta tecnica, ma ho creato un'applicazione che consente la ricerca con caratteri jolly: https://bucketsearch.net/

Indicizzerà in modo asincrono il bucket e quindi ti consentirà di cercare i risultati.

È gratuito (donationware).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.