Comment recherchez-vous un seau Amazon S3?

Réponses:

31

S3 n'a pas de "recherche dans ce compartiment" natif puisque le contenu réel est inconnu - aussi, puisque S3 est basé sur la clé / valeur, il n'y a pas de moyen natif d'accéder à de nombreux nœuds à la fois comme des banques de données plus traditionnelles qui offrent un (SELECT * FROM ... WHERE ...)(dans un SQL modèle).

Ce que vous devrez faire est ListBucketd'obtenir une liste des objets dans le compartiment, puis d'itérer sur chaque élément en effectuant une opération personnalisée que vous implémentez - qui est votre recherche.

Cody Caughlan
la source
42
Ce n'est plus le cas. Voir la réponse de rhonda ci-dessous: stackoverflow.com/a/21836343/1101095
Nate
11
À tous les votants positifs du commentaire ci-dessus: l'OP n'indique pas s'ils souhaitent rechercher les noms de fichiers ou le contenu clé (par exemple, le contenu des fichiers). La réponse de @ rhonda pourrait donc ne pas être suffisante. Il semble qu'en fin de compte, il s'agit d'un exercice laissé au consommateur, car l'utilisation de la console S3 est à peine disponible pour les utilisateurs de votre application et les utilisateurs généraux. Il ne concerne essentiellement que le propriétaire du compartiment et / ou les rôles IAM.
Cody Caughlan
Existe-t-il un service d'indexation comme lucene.net pour indexer ces documents de compartiment.
Munavvar
Je revenais sans cesse sur cette réponse et construisais un outil pour aider: bucketsearch.net - permet la recherche par caractères génériques, etc.
Jon M
251

Juste une note à ajouter ici: c'est maintenant 3 ans plus tard, mais cet article est en tête de Google lorsque vous tapez "Comment rechercher un compartiment S3".

Vous cherchez peut-être quelque chose de plus complexe, mais si vous arrivez ici en essayant de comprendre comment trouver simplement un objet (fichier) par son titre, c'est très simple:

ouvrez le seau, sélectionnez "aucun" sur le côté droit et commencez à saisir le nom du fichier.

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

Rhonda Bradley
la source
43
Ceci est exactement ce que je cherchais. Conception d'expérience utilisateur terrible pour n'avoir aucun
repère
2
Vous devez sélectionner un fichier dans le compartiment, puis commencez à taper.
cabe56
30
Vous ne pouvez toujours rechercher que par le préfixe du nom de l'élément.
Daniel Flippance
21
C'est absolument exaspérant! Les gens parlent de quelque chose sur le côté droit ou d'une boîte jaune, mais je ne trouve rien. Juste le même message "Tapez un préfixe ...". Comment "Search Bucket" n'est-il pas la valeur par défaut? C'est presque aussi
impossible à découvrir
40
Cette réponse est-elle toujours d'actualité? Je ne vois aucun «aucun» sur le côté droit »et le lien de documentation dans la réponse est maintenant redirigé vers une autre page.
BiscuitBaker
112

Voici un moyen court et laid de rechercher des noms de fichiers à l'aide de l' AWS CLI :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Abe Voelker
la source
1
aws s3 ls s3: // votre-seau --recursive | grep votre-recherche était assez bon pour ma recherche, merci Abe Voelker.
homme.2067067
3
Tous les seaux: aws s3 ls | awk '{imprimer $ 3}' | tout en lisant la ligne; faire echo $ line; aws s3 ls s3: // $ ligne --recursive | grep votre-recherche; done
Akom
1
ce qui est coupé -c 32- sans cela aussi la recherche fonctionne
sunil
1
cut -c 32-coupe simplement les informations d'horodatage et de taille de fichier de la sortie, qui sur mon système prend 32 caractères. Vous n'en avez pas besoin, mais si vous transférez la sortie dans une autre commande, il peut être pratique d'avoir une sortie "propre".
Abe Voelker
CLI prend en charge include/exclude. Alors,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish
25

Il existe (au moins) deux cas d'utilisation différents qui pourraient être décrits comme «rechercher dans le compartiment»:

  1. Recherchez quelque chose à l' intérieur de chaque objet stocké dans le seau; cela suppose un format commun pour tous les objets de ce compartiment (disons, les fichiers texte), etc. etc. Pour quelque chose comme ça, vous êtes obligé de faire ce que Cody Caughlan vient de répondre. La documentation AWS S3 contient un exemple de code montrant comment procéder avec le kit AWS SDK pour Java: liste des clés à l'aide du kit AWS SDK pour Java (vous y trouverez également des exemples PHP et C #).

  2. Élément de liste Recherchez quelque chose dans les clés d' objet contenues dans ce compartiment; S3 n'ont partiel support pour cela, sous la forme de permettre des correspondances exactes préfixe + matchs après un effondrement delimiter. Ceci est expliqué plus en détail dans le AWS S3 Developer Guide . Cela permet, par exemple, d'implémenter des "dossiers" en utilisant comme clés d'objet quelque chose comme

    dossier / sous-dossier / fichier.txt
    Si vous suivez cette convention, la plupart des interfaces graphiques S3 (telles que la console AWS) vous montreront une vue de dossier de votre compartiment.

Eduardo Pareja Tobes
la source
docs pour utiliser le préfixe dans ruby
James
22

AWS a publié un nouveau service pour interroger les compartiments S3 avec SQL: Amazon Athena https://aws.amazon.com/athena/

hellomichibye
la source
2
argh… J'obtiens… "Athena n'est pas disponible dans l'ouest des États-Unis (Californie du Nord). Veuillez sélectionner une autre région."
Clintm
2
C'est une surcharge avec toutes ces requêtes SQL étant donné que je ne voulais que grep
Ali Gajani
4
@Clintm - changement pour us-east-1 (Virginie du Nord)
slocumro
21

Il existe plusieurs options, aucune n'étant une simple solution de texte intégral "one shot":

  1. Recherche de modèle de nom de clé : recherche de clés commençant par une chaîne - si vous concevez soigneusement les noms de clé, vous aurez peut-être une solution assez rapide.

  2. Rechercher des métadonnées attachées aux clés : lors de la publication d'un fichier sur AWS S3, vous pouvez traiter le contenu, extraire certaines métadonnées et joindre ces métadonnées sous forme d'en-têtes personnalisés à la clé. Cela vous permet de récupérer les noms de clés et les en-têtes sans avoir besoin de récupérer le contenu complet. La recherche doit être effectuée de manière séquentielle, il n'y a pas d'option de recherche "sql like" pour cela. Avec des fichiers volumineux, cela pourrait économiser beaucoup de temps et de trafic réseau.

  3. Stocker les métadonnées sur SimpleDB : comme point précédent, mais avec le stockage des métadonnées sur SimpleDB. Ici, vous avez SQL comme des instructions select. Dans le cas d'ensembles de données volumineux, vous pouvez atteindre les limites de SimpleDB, qui peuvent être surmontées (partitionner les métadonnées sur plusieurs domaines SimpleDB), mais si vous allez vraiment loin, vous devrez peut-être utiliser un autre type de base de données de métadonnées.

  4. Recherche séquentielle en texte intégral du contenu - traitement de toutes les clés une par une. Très lent, si vous avez trop de clés à traiter.

Nous stockons 1440 versions d'un fichier par jour (une par minute) pendant quelques années, en utilisant un bucket versionné, c'est facilement possible. Mais obtenir une version plus ancienne prend du temps, car il faut aller séquentiellement version par version. Parfois, j'utilise un simple index CSV avec des enregistrements, indiquant l'heure de publication plus l'ID de version, ayant cela, je pourrais passer à l'ancienne version assez rapidement.

Comme vous le voyez, AWS S3 n'est pas conçu à lui seul pour les recherches en texte intégral, c'est un simple service de stockage.

Jan Vlcinsky
la source
4

Recherche par préfixe dans la console S3

directement dans la vue du compartiment AWS Console.

entrez la description de l'image ici

Copiez les fichiers voulus en utilisant s3-dist-cp

Lorsque vous avez des milliers ou des millions de fichiers, une autre façon d'obtenir les fichiers souhaités consiste à les copier vers un autre emplacement en utilisant la copie distribuée . Vous exécutez ceci sur EMR dans un Job Hadoop. Ce qui est cool avec AWS, c'est qu'ils fournissent leur version S3 personnalisée s3-dist-cp . Il vous permet de regrouper les fichiers voulus en utilisant une expression régulière dans le champ groupBy. Vous pouvez l'utiliser par exemple dans une étape personnalisée sur 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"
    }
]
H6.
la source
Il semblerait que la vue du compartiment de la console AWS ne passe pas fichier par fichier en appliquant un filtre. Il est capable de renvoyer des résultats extrêmement rapidement à condition qu'une sous-chaîne du (des) fichier (s) que je recherche. Existe-t-il un client / outil / API que je peux utiliser autre que la console AWS pour obtenir les résultats dans le même temps. @ high6. Dans le passé, j'ai essayé d'utiliser boto, mais la meilleure approche semblait être d'itérer tout le seau en appliquant vos critères de recherche à chaque nom de fichier. C'EST À DIRE. extrêmement lent
Copier et coller
4

Si vous êtes sous Windows et que vous n'avez pas le temps de trouver une bonne grepalternative, un moyen rapide et sale serait:

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

puis faites une recherche rapide dans myfile.txt

Le bit "dossier" est facultatif.

PS si vous n'avez pas installé AWS CLI - voici une ligne unique utilisant le gestionnaire de packages Chocolatey

choco install awscli

PPS Si vous n'avez pas le gestionnaire de paquets Chocolatey - obtenez-le! Votre vie sous Windows sera 10 fois meilleure. (Je ne suis en aucun cas affilié à Chocolatey, mais bon, c'est un incontournable, vraiment).

Alex
la source
Si l'utilisateur peut installer awscli choco, il peut installer grep, non? Ou utiliser la recherche native de Windows?
Dean Radcliffe
2

Étant donné que vous êtes dans AWS ... je pense que vous voudriez utiliser leurs outils CloudSearch. Mettez les données que vous souhaitez rechercher dans leur service ... faites-les pointer vers les clés S3.

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

Andrew Siemer
la source
7
Pas vraiment ce que l'OP recherchait du tout
Clintm
pour moi, cela signifierait y sauvegarder toutes les données - duplication des données
BG Bruno
1

Une autre option consiste à mettre en miroir le compartiment S3 sur votre serveur Web et à le parcourir localement. L'astuce est que les fichiers locaux sont vides et utilisés uniquement comme squelette. Alternativement, les fichiers locaux peuvent contenir des métadonnées utiles que vous auriez normalement besoin d'obtenir de S3 (par exemple, taille du fichier, type MIME, auteur, horodatage, uuid). Lorsque vous fournissez une URL pour télécharger le fichier, effectuez une recherche localement et fournissez un lien vers l'adresse S3.

La traversée de fichiers locaux est facile et cette approche de gestion S3 est indépendante du langage. La traversée de fichiers locaux évite également de maintenir et d'interroger une base de données de fichiers ou de retarder l'exécution d'une série d'appels d'API à distance pour authentifier et obtenir le contenu du compartiment.

Vous pouvez permettre aux utilisateurs de télécharger des fichiers directement sur votre serveur via FTP ou HTTP, puis de transférer un lot de fichiers nouveaux et mis à jour vers Amazon en dehors des heures de pointe en effectuant simplement une répétition sur les répertoires pour les fichiers de toute taille. À la fin d'un transfert de fichier vers Amazon, remplacez le fichier du serveur Web par un fichier vide du même nom. Si un fichier local a une taille de fichier, servez-le directement car il attend le transfert par lots.

Dylan Valade
la source
Excellent moyen d'exploser l'espace de stockage de votre nœud sur un disque EXTFS2 / 3 si vous avez des millions de fichiers dans votre
compartiment
1

La façon dont je l'ai fait est: j'ai des milliers de fichiers dans s3. J'ai vu le panneau des propriétés d'un fichier dans la liste. Vous pouvez voir l'URI de ce fichier et je l'ai copié-collé dans le navigateur - c'était un fichier texte et il était bien rendu. Maintenant, j'ai remplacé l'uuid dans l'url par l'uuid que j'avais sous la main et le fichier se trouve.

J'aurais aimé qu'AWS ait un meilleur moyen de rechercher un fichier, mais cela a fonctionné pour moi.

Rose
la source
1

Essayez cette commande:

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

Ensuite, vous pouvez diriger cela dans un grep pour obtenir des types de fichiers spécifiques pour faire ce que vous voulez avec eux.

Robert Evans
la source
1
Remarque: --output textspécifie que la sortie sera en texte brut, pas JSON, etc. et --query 'Contents[].{Key: Key, Size: Size}'filtre simplement la sortie de la liste en fonction du nom et de la taille du fichier. Il ne recherche pas Key: Keyou similaire.
Matt
1

J'ai essayé de la manière suivante

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

Cela génère le chemin réel où le fichier existe

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

C'est un fil un peu vieux - mais peut-être aider quelqu'un qui cherche encore - c'est moi qui le recherche un an.

La solution peut être " AWS Athena " où vous pouvez rechercher des données comme celle-ci

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

Le prix actuel est de 5 $ pour 1 To de données - par exemple, si votre requête recherche sur un fichier de 1 To 3 fois votre coût est de 15 $ - mais par exemple, s'il n'y a qu'une seule colonne au "format de colonne converti" ce que vous voulez lire, vous paierez 1 / 3 du prix signifie 1,67 USD / To.

BG Bruno
la source
Cela ne semble pas faisable pour toute application qui nécessite une recherche intensive car le coût est assez élevé cependant ...
tnkh
@tnkh Je suis d'accord - J'aimerais aussi plus d'options avec # s3
BG Bruno
0

J'ai fait quelque chose comme ci-dessous pour trouver des modèles dans mon seau

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
  }

Pour les compartiments plus grands, cela prend trop de temps car tous les résumés d'objets sont retournés par les Aw et pas seulement ceux qui correspondent au préfixe et au délimiteur. Je cherche des moyens d'améliorer les performances et jusqu'à présent, j'ai seulement constaté que je devais nommer les clés et les organiser correctement dans des seaux.

Raghvendra Singh
la source
0

J'ai fait face au même problème. La recherche dans S3 devrait être beaucoup plus facile que la situation actuelle. C'est pourquoi, j'ai implémenté cet outil open source pour la recherche dans S3.

SSEARCH est un outil de recherche S3 open source complet. Il a été mis en œuvre en gardant toujours à l'esprit que la performance est le facteur critique et, selon les tests de performance, il recherche le compartiment qui contient ~ 1000 fichiers en quelques secondes.

L'installation est simple. Vous téléchargez uniquement le fichier docker-compose et l'exécutez avec

docker-compose up

SSEARCH sera lancé et vous pourrez rechercher n'importe quoi dans n'importe quel compartiment que vous avez.

Arda Güçlü
la source
0

Avance rapide jusqu'en 2020, et en utilisant aws-okta comme notre 2fa, la commande suivante, bien que lente comme l'enfer pour parcourir tous les objets et dossiers de ce compartiment particulier (+270 000) a bien fonctionné.

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

Utilisez Amazon Athena pour interroger le compartiment S3. Chargez également les données dans la recherche Amazon Elastic. J'espère que cela t'aides.

Demande moi
la source
0

Pas une réponse technique, mais j'ai construit une application qui permet une recherche par caractères génériques: https://bucketsearch.net/

Il indexera votre compartiment de manière asynchrone, puis vous permettra de rechercher les résultats.

Son utilisation est gratuite (donationware).

Jon M
la source