web-dev-qa-db-fra.com

Comment recherchez-vous un compartiment Amazon s3?

J'ai un seau avec des milliers de fichiers. Comment puis-je rechercher le seau? Y a-t-il un outil que vous pouvez recommander? 

118
vinhboy

S3 n'a pas de "recherche dans ce seau" en natif car le contenu réel est inconnu. De plus, étant donné que S3 est basé sur une clé/valeur, il n'existe pas de moyen natif d'accéder à de nombreux nœuds à la fois dans des datastores plus traditionnels offrant un (SELECT * FROM ... WHERE ...) (dans une Modèle SQL).

Ce que vous devez faire, c'est exécuter ListBucket pour obtenir une liste d'objets dans le compartiment, puis effectuer une itération sur chaque élément exécutant une opération personnalisée que vous implémentez - ce qui correspond à votre recherche.

22
Cody Caughlan

Juste une remarque à ajouter ici: nous en sommes maintenant à trois ans. Pourtant, cet article est en haut de Google lorsque vous tapez "Comment effectuer une recherche dans un seau S3". 

Peut-être cherchez-vous quelque chose de plus complexe, mais si vous arrivez ici en essayant de trouver un moyen de trouver simplement un objet (fichier) par son titre, c'est simple comme bonjour:

ouvrez le compartiment, sélectionnez "none" dans la partie droite et commencez à taper le nom du fichier. 

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

227
rhonda bradley

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

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

Il y a (au moins) deux cas d'utilisation différents qui pourraient être décrits comme "recherchez le seau":

  1. Rechercher quelque chose dans chaque objet stocké dans le compartiment; cela suppose un format commun pour tous les objets de ce seau (par exemple, les fichiers texte), etc. etc. La documentation AWS S3 contient un exemple de code indiquant comment procéder. Le kit AWS SDK for Java: Liste des clés à l'aide du kit AWS SDK for Java (vous trouverez également des exemples PHP et C #).

  2. Élément de liste Rechercher quelque chose dans l'objet keys contenu dans ce compartiment; S3 a a le support {partiel} _, sous la forme permettant les correspondances préfixes exactes + les correspondances réductrices après un délimiteur. Ceci est expliqué plus en détail dans 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 des dossiers de votre compartiment. 

21
Eduardo Pareja Tobes

Il y a plusieurs options, aucune n'étant simple, la 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 les noms de clé avec soin, vous disposerez peut-être d'une solution assez rapide.

  2. Recherche de métadonnées attachées aux clés : lors de la publication d'un fichier sur AWS S3, vous pouvez traiter le contenu, extraire des méta-informations et attacher ces méta-informations sous forme d'en-têtes personnalisés dans la clé. Cela vous permet d'extraire les noms de clé et les en-têtes sans avoir à extraire le contenu complet. La recherche doit être effectuée séquentiellement, il n’existe pas d’option de recherche "comme" pour cela. Avec des fichiers volumineux, cela peut économiser beaucoup de trafic réseau et de temps.

  3. Stockez les métadonnées sur SimpleDB : comme point précédent, mais en stockant les métadonnées sur SimpleDB. Ici vous avez sql comme les instructions select. Dans le cas d'ensembles de données volumineux, vous pouvez atteindre les limites de SimpleDB, ce qui peut être surmonté (métadonnées de partition sur plusieurs domaines de SimpleDB), mais si vous allez vraiment très loin, vous devrez peut-être utiliser un autre type de base de données metedata.

  4. Recherche de texte intégral séquentielle 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. À l'aide d'un seau versionné, il est facilement possible. Mais obtenir une version plus ancienne prend du temps, car il faut passer séquentiellement version par version. Parfois, j'utilise un simple index CSV avec des enregistrements, indiquant l'heure de publication et l'identifiant de la version. Cela permet de passer rapidement à l'ancienne version.

Comme vous le voyez, AWS S3 n'est pas conçu pour la recherche de texte intégral, il s'agit d'un simple service de stockage.

18
Jan Vlcinsky

AWS a publié un nouveau service permettant d'interroger les segments S3 avec SQL: Amazon Athena https://aws.Amazon.com/athena/

15
hellomichibye

Recherche par préfixe dans la console S3

directement dans la vue du compartiment AWS Console.

 enter image description here

Copier les fichiers recherchés avec s3-dist-cp

Lorsque vous avez des milliers ou des millions de fichiers, vous pouvez également les copier dans un autre emplacement à l’aide de Distributed Copy. Vous l'exécutez sur EMR dans un travail Hadoop. Le bon côté d’AWS est qu’ils fournissent leur version S3 personnalisée s3-dist-cp . Il vous permet de regrouper les fichiers recherchés à l'aide d'une expression régulière dans le champ groupBy. Vous pouvez utiliser ceci 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"
    }
]
4
H6.

Étant donné que vous êtes dans AWS ... je pense que vous voudriez utiliser leurs outils CloudSearch. Mettez les données que vous voulez rechercher dans leur service ... faites les pointer sur les touches S3.

http://aws.Amazon.com/cloudsearch/

4
Andrew Siemer

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. Les fichiers locaux peuvent également contenir des métadonnées utiles que vous devriez normalement 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 locale et fournissez un lien vers l'adresse S3.

La traversée de fichiers locaux est facile et cette approche pour la gestion S3 est indépendante de la langue. La traversée de fichiers locaux évite également la maintenance et l'interrogation d'une base de données de fichiers ou les retards dans le lancement d'une série d'appels d'API distants pour s'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 sur Amazon en dehors des heures de pointe, en récurant simplement sur les répertoires des fichiers de toute taille. À la fin du 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, envoyez-le directement, car il attend le transfert par lots.

1
Dylan Valade

Si vous utilisez Windows et que vous n’avez pas le temps de trouver une alternative agréable à grep, voici un moyen rapide et dangereux de procéder:

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

puis faites une recherche rapide dans myfile.txt

Le bit "dossier" est optionnel.

P.S. Si vous n'avez pas installé l'AWS CLI, voici un one-liner utilisant le gestionnaire de packages Chocolatey.

choco install awscli

P.P.S. Si vous n'avez pas le gestionnaire de paquets Chocolatey, procurez-vous! Votre vie sur Windows sera 10 fois meilleure. (Je ne suis en aucun cas affilié à Chocolatey, mais bon, c'est vraiment un must-have).

1
Alex

Essayez cette commande:

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

Ensuite, vous pouvez diriger ceci dans un grep pour obtenir des types de fichiers spécifiques pour en faire tout ce que vous voulez.

1
Robert Evans

J'ai fait quelque chose comme ci-dessous pour trouver des motifs 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 grands compartiments, cela prend trop de temps car tous les résumés d'objet sont renvoyé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.

0
Raghvendra Singh

Consultez cette documentation: http://docs.aws.Amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list

Vous pouvez utiliser une expression régulière compatible Perl (PCRE) pour filtrer les noms.

0
Ragnar

J'ai essayé de la manière suivante

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

Ceci sort le chemin réel où le fichier existe

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

Statut 2018-07: Amazon a un SQL natif comme la recherche de fichiers csv et json!

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

0
JSi

Voici comment je l'ai fait: 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é dans le navigateur - il s'agissait d'un fichier texte qui a été rendu correctement. Maintenant, j'ai remplacé l'uuid dans l'URL par l'uuid que j'avais sous la main et le fichier est en plein essor.

J'aimerais que AWS dispose d'un meilleur moyen de rechercher un fichier, mais cela a fonctionné pour moi.

0
Rose

C'est un peu vieux fil - mais peut-être aider quelqu'un qui cherche encore - c'est moi qui le cherche 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 5 USD pour les données de 1 To - donc si votre recherche effectue une recherche sur un fichier de 1 To, 3 fois votre coût est de 15 USD, mais s'il n'y a qu'une colonne dans le "format de colonne converti", vous paierez 1/3 du prix 1,67 USD/To.

0
BG Bruno