J'ai un seau contenant des milliers de fichiers. Comment puis-je rechercher dans le seau? Y a-t-il un outil que vous pouvez recommander?
J'ai un seau contenant des milliers de fichiers. Comment puis-je rechercher dans le seau? Y a-t-il un outil que vous pouvez recommander?
Réponses:
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 ListBucket
d'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.
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
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-
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".
include/exclude
. Alors,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Il existe (au moins) deux cas d'utilisation différents qui pourraient être décrits comme «rechercher dans le compartiment»:
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 #).
É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.txtSi vous suivez cette convention, la plupart des interfaces graphiques S3 (telles que la console AWS) vous montreront une vue de dossier de votre compartiment.
AWS a publié un nouveau service pour interroger les compartiments S3 avec SQL: Amazon Athena https://aws.amazon.com/athena/
Il existe plusieurs options, aucune n'étant une simple solution de texte intégral "one shot":
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.
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.
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.
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.
directement dans la vue du compartiment AWS Console.
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"
}
]
Si vous êtes sous Windows et que vous n'avez pas le temps de trouver une bonne grep
alternative, 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).
É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.
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.
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.
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.
--output text
spé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: Key
ou similaire.
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'
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.
Jetez un œil à 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.
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.
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.
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
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.
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).
Statut 2018-07: Amazon a SQL natif comme la recherche de fichiers csv et json!