web-dev-qa-db-fra.com

obtenir le dernier objet modifié de la CLI S3

J'ai un cas d'utilisation où j'émets par programme une instance EC2, une copie et un fichier exécutable à partir de S3, je l'exécute et je ferme l'instance (dans les données utilisateur). Je n'ai besoin que du dernier fichier ajouté de S3. Existe-t-il un moyen d'obtenir le dernier fichier/objet modifié à partir d'un compartiment S3 à l'aide de la CLI?

52
wishy

Vous pouvez lister tous les objets du compartiment avec aws s3 ls $BUCKET --recursive:

$ aws s3 ls $BUCKET --recursive
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object
2015-04-29 12:09:29      32768 yet-another-object.sh

Ils sont triés alphabétiquement par clé, mais cette première colonne correspond à la dernière fois modifiée. Un rapide sort les réorganisera par date:

$ aws s3 ls $BUCKET --recursive | sort
2015-04-29 12:09:29      32768 yet-another-object.sh
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object

tail -n 1 sélectionne la dernière ligne et awk '{print $4}' extrait la quatrième colonne (le nom de l'objet).

$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object

Dernier point mais non le moindre, déposez-le dans aws s3 cp pour télécharger l'objet:

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object
114
David Murray
aws s3api list-objects-v2 --bucket "bucket-name" |jq  -c ".[] | max_by(.LastModified)|.Key"
9
AlexLoo

Voici le script bash, qui télécharge le dernier fichier à partir d’un compartiment S3. J'ai utilisé AWS S3 Synch commande à la place, de sorte qu'il ne télécharge pas le fichier à partir de S3 s'il existe déjà.

--exclude, exclut tous les fichiers

--include, inclut tous les fichiers correspondant au modèle

#!/usr/bin/env bash

    BUCKET="s3://my-s3-bucket-eu-west-1/list/"
    FILE_NAME=`aws s3 ls $BUCKET  | sort | tail -n 1 | awk '{print $4}'`
    TARGET_FILE_PATH=target/datdump/
    TARGET_FILE=${TARGET_FILE_PATH}localData.json.gz

    echo $FILE_NAME
    echo $TARGET_FILE

    aws s3 sync $BUCKET $TARGET_FILE_PATH --exclude "*" --include "*$FILE_NAME*"

    cp target/datdump/$FILE_NAME $TARGET_FILE

p.s. Merci @ David Murray

2
AjitChahal

S'il s'agit d'un fichier fraîchement téléchargé, vous pouvez utiliser Lambda pour exécuter un morceau de code sur le nouvel objet S3.

Si vous devez vraiment obtenir le plus récent, vous pouvez nommer vos fichiers avec la date en premier, trier par nom et prendre le premier objet.

1
Jonathan Turpie