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?
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
aws s3api list-objects-v2 --bucket "bucket-name" |jq -c ".[] | max_by(.LastModified)|.Key"
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
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.