Domanda ottiene l'ultimo oggetto modificato dalla CLI S3


Ho un caso d'uso in cui porto in modo programmatico un'istanza EC2, copia ed eseguibile da S3, eseguilo e chiudi l'istanza (fatta in user-data). Ho bisogno di ottenere solo l'ultimo file aggiunto da S3. C'è un modo per ottenere l'ultimo file / oggetto modificato da un bucket S3 utilizzando la CLI?


36
2018-06-25 23:17


origine


risposte:


È possibile elencare tutti gli oggetti nel bucket con 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

Sono ordinati alfabeticamente per chiave, ma quella prima colonna è l'ultima volta modificata. Un veloce sort li riordineremo per data:

$ 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 seleziona l'ultima riga, e awk '{print $4}' estrae la quarta colonna (il nome dell'oggetto).

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

Ultimo ma non meno importante, rilasciatelo aws s3 cp per scaricare l'oggetto:

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object

78
2018-06-26 03:26



aws s3api list-objects-v2 --bucket "bucket-name" |jq  -c ".[] | max_by(.LastModified)|.Key"

7
2018-03-31 07:53



Di seguito è riportato lo script di bash, che scarica l'ultimo file da un bucket S3. Ho usato AWS S3 synch comando invece, in modo che non scarichi il file da S3 se già esistente.

- esclude, esclude tutti i file

--include, include tutti i file che corrispondono al modello

#!/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

post scriptum Grazie a David Murray


2
2017-12-21 17:00



Se questo è un file appena caricato, puoi usare Lambda per eseguire un pezzo di codice sul nuovo oggetto S3.

Se hai davvero bisogno di ottenere quello più recente, puoi prima nominare i file con la data, ordinare per nome e prendere il primo oggetto.


1
2018-06-25 23:32