Risposte:
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 ListBucket
per ottenere un elenco di oggetti nel bucket e quindi scorrere su ogni elemento eseguendo un'operazione personalizzata che implementi, che è la tua ricerca.
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
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-
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".
include/exclude
. Quindi,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Esistono (almeno) due diversi casi d'uso che potrebbero essere descritti come "cerca nel secchio":
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 #).
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.txtSe segui questa convenzione, la maggior parte delle GUI S3 (come la Console AWS) ti mostrerà una vista della cartella del tuo bucket.
AWS ha rilasciato un nuovo servizio per eseguire query sui bucket S3 con SQL: Amazon Athena https://aws.amazon.com/athena/
Esistono diverse opzioni, nessuna delle quali è una soluzione full text "one shot" semplice:
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.
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.
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.
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.
direttamente nella vista bucket di AWS Console.
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"
}
]
Se sei su Windows e non hai tempo a trovare una buona grep
alternativa, 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).
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.
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.
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.
--output text
specifica 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: Key
o simili.
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'
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.
Dai un'occhiata a questa documentazione: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
È possibile utilizzare un'espressione regolare compatibile con Perl (PCRE) per filtrare i nomi.
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.
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.
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
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).
Stato 2018-07: Amazon ha sql nativo come la ricerca di file CSV e JSON!