Aws-cli: aws s3 ls - rechercher des fichiers par date de modification ?

Créé le 21 janv. 2015  ·  87Commentaires  ·  Source: aws/aws-cli

Salut,
Nous aimerions pouvoir rechercher un compartiment avec plusieurs milliers (probablement des centaines de milliers) d'objets et de dossiers/préfixes pour trouver des objets qui ont été récemment ajoutés ou mis à jour. Exécuter aws s3 ls sur l'ensemble du bucket plusieurs fois par jour, puis trier la liste semble inefficace. Existe-t-il un moyen de demander simplement une liste d'objets avec une heure modifiée <, >, = un certain horodatage ?

De plus, sommes-nous facturés une fois pour la requête aws s3 ls ou une fois pour chacun des objets renvoyés par la requête ?

Nouveau sur github, j'aurais aimé en savoir assez pour contribuer au code réel... j'apprécie l'aide.

guidance

Commentaire le plus utile

@jwieder Cela n'aide pas l'utilisateur à réduire le nombre d'appels de liste à s3. Supposons que chaque jour, vous stockez environ 1 000 articles d'actualité dans un seau. Ensuite, côté client, vous souhaitez obtenir les articles des 3 derniers jours par défaut (et plus uniquement si cela est explicitement demandé). Avoir à récupérer une liste de tous les articles depuis le début des temps, disons 100 000, prend du temps et augmente les coûts de réseau (car un seul appel de liste ne renverra que jusqu'à 1000 articles). Ce serait bien plus sympa de pouvoir dire "Donnez-moi une liste des éléments créés/modifiés depuis 3 jours".

Tous les 87 commentaires

L'API S3 ne prend pas en charge cela, donc la seule façon de le faire simplement en utilisant S3 est de faire un tri côté client.

En ce qui concerne la tarification S3 , nous utilisons une requête ListObjects qui renvoie 1000 objets à la fois. Ainsi, vous serez facturé pour une demande de LISTE par tranche de 1000 objets lors de l'utilisation de aws s3 ls .

Une autre alternative est de stocker un index auxiliaire en dehors de S3, par exemple dynamodb. Faites-moi savoir si vous avez d'autres questions.

Merci

Bien que cette fonctionnalité semble rester absente d'aws-cli, il est assez facile de la scripter en bash. Par exemple:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ | grep ${DATE}

@jwieder Cela n'aide pas l'utilisateur à réduire le nombre d'appels de liste à s3. Supposons que chaque jour, vous stockez environ 1 000 articles d'actualité dans un seau. Ensuite, côté client, vous souhaitez obtenir les articles des 3 derniers jours par défaut (et plus uniquement si cela est explicitement demandé). Avoir à récupérer une liste de tous les articles depuis le début des temps, disons 100 000, prend du temps et augmente les coûts de réseau (car un seul appel de liste ne renverra que jusqu'à 1000 articles). Ce serait bien plus sympa de pouvoir dire "Donnez-moi une liste des éléments créés/modifiés depuis 3 jours".

Exactement!

Le dim. 17 janv. 2016 à 23:53, PuchatekwSzortach <
[email protected]> a écrit :

@jwieder https://github.com/jwieder Cela n'aide pas l'utilisateur à diminuer
nombre d'appels de liste à s3. Dites que chaque jour vous stockez ~1000 nouvelles
articles dans un seau. Ensuite, côté client, vous souhaitez obtenir des articles pour les 3 derniers
jours par défaut (et plus uniquement si cela est explicitement demandé). Devoir aller chercher un
liste de tous les articles depuis le début des temps, disons 100k, prend du temps
et accumule des coûts de réseau (car un seul appel de liste ne retournera que
à 1000 articles). Ce serait beaucoup plus agréable de pouvoir dire « Donnez-moi une liste de
éléments créés/modifiés depuis 3 jours".

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment-172425517 .

@PuchatekwSzortach @ChrisSLT Vous avez raison, désolé pour ma réponse boiteuse; et je suis d'accord que ce genre de fonctionnalité serait très utile dans aws-cli. La combinaison de l'abandon de cette fonctionnalité de base et de la facturation des listes de fichiers est hautement suspecte. Jusqu'à ce qu'AWS arrête de pincer et présente la liste par propriétés de fichier, voici une autre idée que j'ai utilisée et qui est plus pertinente pour ce fil que ma 1ère réponse : pour les fichiers qui doivent être suivis de cette manière, les fichiers sont nommés avec un horodatage . Une liste de fichiers est stockée dans un fichier texte local (ou pourrait être db si vous avez des milliards de fichiers à vous soucier). La recherche d'une date implique ensuite l'ouverture du fichier, la recherche de noms de fichiers correspondant à la date d'aujourd'hui pourrait ressembler à ceci :

pendant la lecture -r fileName
faire
if [ "$fileName" == "$ AUJOURD'HUI" ]; alors
aws s3 sync $BUCKETURL /some/local/directory --exclude "*" --include "$fileName"
Fi
fait < "$FILE"

Où $FILE est votre index de nom de fichier local et $TODAY est la date que vous recherchez. Vous devrez changer la condition sur cette boucle, mais j'espère que cela pourra vous donner une idée.

Faire les choses de cette façon vous soulage de tous les frais liés à la liste des fichiers dans votre compartiment ; mais cela dépend aussi du client sur lequel vous effectuez la recherche d'avoir accès à la liste des fichiers locaux... Quoi qu'il en soit, j'espère que cela vous aidera et je m'excuse encore pour ma réponse précédente.

D'accord et merci

Le mardi 19 janvier 2016 à 10h00, Josh Wieder [email protected]
a écrit:

@PuchatekwSzortach https://github.com/PuchatekwSzortach @ChrisSLT
https://github.com/ChrisSLT Vous avez raison, désolé pour ma réponse boiteuse; et
Je suis d'accord que ce genre de fonctionnalité serait très utile dans aws-cli. Les
combinaison de la suppression de cette fonctionnalité de base et de la facturation des listes de fichiers
est hautement suspect. Jusqu'à ce qu'AWS arrête le pincement et introduit la liste par
propriétés du fichier, voici une autre idée que j'ai utilisée et qui est plus pertinente
à ce fil puis ma 1ère réponse : Pour les fichiers qui doivent être suivis dans ce
façon, les fichiers sont nommés avec un horodatage. Une liste de fichiers est stockée dans un local
fichier texte (ou pourrait être db si vous avez des milliards de fichiers à vous soucier).
La recherche d'une date implique ensuite l'ouverture du fichier, la recherche de noms de fichiers
qui correspondent à la date d'aujourd'hui pourrait ressembler à ceci :

pendant la lecture -r fileName
faire
if [ "$fileName" == "$ AUJOURD'HUI" ]; alors
aws s3 sync $BUCKETURL /some/local/directory --exclude "*" --include
"$nomFichier"
Fi
fait < "$FILE"

Où $FILE est votre index de nom de fichier local et $TODAY est la date à laquelle vous êtes
à la recherche de. Vous devrez changer la condition sur cette boucle, mais
j'espère que cela peut vous donner une idée.

Faire les choses de cette façon vous soulage de tous les frais liés à l'inscription des
fichiers dans votre bucket ; mais cela dépend aussi du client que vous menez
la recherche sur avoir accès à la liste des fichiers locaux ... selon votre
architecture d'application / système qui pourrait faire ce genre d'approche
impraticable. Quoi qu'il en soit, j'espère que cela vous aidera et je m'excuse encore pour mon plus tôt
réponse derpy.

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172878454.

Il existe un moyen de le faire avec le s3api et la fonction --query. Ceci est testé sur OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>= 2016-05-20 ][].{Key: Key}'
vous pouvez ensuite filtrer en utilisant jq ou grep pour effectuer le traitement avec les autres fonctions s3api.

Edit : je ne sais pas pourquoi ils n'apparaissent pas, mais vous devez utiliser des backticks pour entourer la date que vous interrogez

Est-il possible pour vous de créer des dossiers pour chaque jour et de cette façon, vous accéderez uniquement aux fichiers d'aujourd'hui ou tout au plus aux dossiers d'hier pour obtenir les derniers fichiers.

Oui. Bien que vous puissiez trouver plus facile d'utiliser simplement un préfixe de date pour vos clés (vous ne pouvez pas interroger une combinaison bucketname/foldername en utilisant l'option --bucket). L'utilisation du préfixe de date vous permettra d'utiliser l'indicateur --prefix dans l'interface de ligne de commande et d'accélérer vos requêtes, car AWS recommande d'utiliser des nombres ou des hachages au début des noms de clé pour des temps de réponse accrus.

@willstruebing , votre solution ne réduit toujours pas le nombre d'appels d'API S3, la complexité des requêtes côté serveur ou la quantité de données envoyées via le câble. Le paramètre --query effectue uniquement le filtrage jmespath côté client.

@kislyuk Je suis tout à fait d'accord pour dire que cela ne répond pas aux problèmes d'efficacité. Cependant, mon intention était de répondre à la question précise :

Is there a way to simply request a list of objects with a modified time <, >, = a certain timestamp?

Cette question de base est de savoir comment je me suis retrouvé sur ce fil, et j'ai donc pensé qu'il était raisonnable d'y inclure une réponse. Le problème est intitulé "aws s3 ls - rechercher des fichiers par date de modification ?".

J'aimerais entendre les idées de quelqu'un sur les éléments d'efficacité de la question, car je n'en ai pas moi-même et je suis toujours curieux.

#pour i dans s3cmd ls | awk {'print $3'} ; do aws s3 ls $i --recursive ; terminé >> s3-full.out

Quelle est la valeur par défaut pour les fichiers renvoyés par AWS ? Les renvoie-t-il par ordre alphabétique, ou par la plus récente modification, ou quels sont les critères utilisés lorsque vous demandez votre premier lot de 1000 noms de fichiers ?

Je suis d'accord qu'il devrait certainement y avoir une sorte de filtre (tri par date, par nom, etc.) que vous pouvez utiliser lorsque vous demandez des fichiers... définitivement une fonctionnalité manquante. :(

Je suis d'accord que ce filtrage doit être côté serveur et est un besoin fondamental.

+1 pour les requêtes/filtrage côté serveur

+1 pour le filtrage côté serveur

Toujours très nécessaire en effet, +1

D'accord avec @chescales et les autres, +1 au filtrage côté serveur

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Comment n'est-ce pas déjà une fonctionnalité ?

+100000

+1e999

+1

+1

+1

+1

+1

+1

+1

+1

+65535

Le commentaire de @willstruebing a fonctionné pour moi, par exemple :

aws s3api list-objects --bucket "mybucket" --prefix "some/prefix" --query "Contents[?LastModified>=`2018-08-22`].{Key: Key}"

oh tant pis - je vois après avoir regardé le trafic réseau à partir de cette commande que toutes les clés sont toujours en cours de téléchargement à partir de s3 et qu'aws cli effectue le filtrage côté client !

+1

+1

+1

+1

qu'en est-il des filtres --exclude et --include ?

!/bin/bash

DATE=$(date +%A-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ --exclude " " --include " ${DATE}*"

+1

+1

+1 million

+1

+∞

+∞+1

+1

+1

+1

++

+1

+1

+1

+1 :( :(

Je pense que cela fait partie du modèle de tarification d'AWS, un stockage super bon marché mais payant pour y accéder. Bon pour les gros fichiers mais vous ruinera si vous voulez interroger/gérer des millions de petits fichiers.

+1

Je suppose que c'est pourquoi ils ont créé Athena ? une autre façon de facturer tout en ajoutant des cloches et des sifflets ?

+1

+1

+1

je dois lister les objets du bucket s3 qui sont modifiés entre deux dates ex. 2019-06-08 au 2019-06-11

une idée quelqu'un ?

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query "Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified: LastModified}" puis utilisez JQ ou votre outil préféré pour filtrer après le 2019-06-11

Cela n'élimine pas les appels d'API. Ces requêtes sont côté clients

Le mar. 11 juin 2019, 14:07 willstruebing [email protected]
a écrit:

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query
"Contenu[?LastModified>='2019-06-08'][].{Key : Key,LastModified :
LastModified}", puis utilisez JQ ou votre outil préféré pour filtrer après
2019-06-11

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMW5AFAU5BUNM7FEMZ3PZ7SV3A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJ2DXDNOP,500CY95CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJ2DXDNO
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AABLGMVTIZDPPIEUK2CZR6TPZ7SV3ANCNFSM4A2VNZ2A
.

@dmead Je suis tout à fait d'accord. Cependant, la fonctionnalité de filtrage côté serveur n'existe pas actuellement (je pense que c'est pourquoi tant de personnes se retrouvent sur ce poste particulier), c'est donc la seule solution de contournement que je connaisse pour terminer la tâche à accomplir. Avez-vous un moyen de le faire côté serveur ou est-ce juste une observation sur la solution proposée ? J'aimerais entendre des commentaires sur la façon de le faire ET de réduire le nombre d'appels d'API.

Si vous avez le temps, j'envisagerais de sélectionner des métadonnées dans athena. je
Je n'ai pas eu la chance moi-même, mais cela semblait être une solution possible.

Le mer. 12 juin 2019 à 10h28 willstruebing [email protected]
a écrit:

@dmead https://github.com/dmead Je suis tout à fait d'accord. Cependant, le
la fonctionnalité pour faire le filtrage côté serveur n'existe pas actuellement (je pense
c'est pourquoi tant de gens se retrouvent sur ce poste particulier), c'est donc le
seule solution de contournement que je connaisse pour accomplir la tâche à accomplir. As tu un
façon de le faire côté serveur ou s'agit-il simplement d'une observation sur le
Solution? J'aimerais entendre des commentaires sur la façon de le faire ET de réduire la quantité de
Appels d'API.

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMTQZD6OWVH4KDMSJPLP2EBY7A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXTN43VMVBW63LNMV5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXTN43VMVBW63LNMV5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXTN43VMVBW63LNMVXWWYLOJK
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AABLGMRLA5OYSYGEYNPUY5DP2EBY7ANCNFSM4A2VNZ2A
.

+24

Tout le monde vote pour cela, le classer avec l'AWS CLI n'aide pas. L'AWS CLI est liée par S3. Fichier avec l'équipe S3 plutôt que le github d'un outil si vous voulez que ça soit corrigé :P

@mike-bailey OK, et comment faire ?

Si c'était moi personnellement, je déposerais un ticket AWS pour qu'il parvienne à l'équipe de service. Mais je ne travaille pas pour AWS. Je sais juste que commenter '+1' à ce sujet ne changera pas.

Il existe un moyen de le faire avec le s3api et la fonction --query. Ceci est testé sur OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>= 2016-05-20 ][].{Key: Key}'
vous pouvez ensuite filtrer en utilisant jq ou grep pour effectuer le traitement avec les autres fonctions s3api.

Edit : je ne sais pas pourquoi ils n'apparaissent pas, mais vous devez utiliser des backticks pour entourer la date que vous interrogez

Assurez-vous d'avoir la dernière version de awscli avant d'essayer cette réponse. j'ai amélioré
awscli 1.11.47 -> 1.16.220
et il a fait le filtrage redouté côté client, mais cela a fonctionné.
+1 pour le filtrage côté serveur.

+1

+1

Veuillez lire le fil, +1 ne fait rien

Vous ne pouvez pas le faire facilement, mais le conseil suivant est caché dans ces commentaires :

 aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>=`2016-05-20`][].{Key: Key}'

Ceci est toujours côté client et effectuera de nombreuses requêtes.

Comme indiqué précédemment, il le gère côté client. Donc, vous risquez toujours de claquer le seau avec des appels.

Le filtrage doit être côté serveur et c'est un besoin fondamental, je pense.

Voici un exemple utilisant la synchronisation aws s3 afin que seuls les nouveaux fichiers soient téléchargés. Il combine les journaux dans un fichier journal et supprime les commentaires avant d'enregistrer le fichier. Vous pouvez ensuite utiliser grep et autres pour obtenir des données de journal. Dans mon cas, j'avais besoin de compter les hits uniques dans un fichier spécifique. Ce code ci-dessous a été adapté à partir de ce lien : https://shapeshed.com/aws-cloudfront-log/ La commande sed fonctionne également sur Mac et est différente de ce qui est dans l'article. J'espère que cela t'aides!

aws s3 sync s3://<YOUR_BUCKET> .
cat *.gz > combined.log.gz
gzip -d combined.log.gz
sed -i '' '/^#/ d' combined.log

# counts unique logs for px.gif hits
grep '/px.gif' combined.log | cut -f 1,8 | sort | uniq -c | sort -n -r

# above command will return something like below. The total count followed by the date and the file name.
17 2020-01-02 /px.gif
 9 2020-01-03 /px.gif

Je sais que c'est un vieux problème, mais pour laisser une solution élégante ici :

aws s3api list-objects --output=text --query "Contents[?LastModified >= <DATE_YOU_WANT_TO_START> ].{Key: Key}"

Cette page vous a été utile?
0 / 5 - 0 notes