Подтвердить что ты не робот

Получить последний измененный объект из S3 CLI

У меня есть прецедент, когда я программным образом вывожу экземпляр, копию и исполняемый файл EC2 из S3, запускаю его и завершаю экземпляр (выполняется в пользовательских данных). Мне нужно получить только последний добавленный файл из S3. Есть ли способ получить последний измененный файл/объект из ведра S3 с помощью CLI?

4b9b3361

Ответ 1

Вы можете перечислить все объекты в ведре с помощью 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

Они сортируются по алфавиту по ключу, но этот первый столбец является последним измененным временем. Быстрый sort будет изменять порядок их по дате:

$ 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 выбирает последнюю строку, а awk '{print $4}' извлекает четвертый столбец (имя объекта).

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

И последнее, но не менее важное: отбросьте это на aws s3 cp, чтобы загрузить объект:

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

Ответ 2

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

Ответ 3

Ниже приведено bash script, который загружает последний файл из S3 Bucket. Вместо этого я использовал команду AWS S3 Synch, чтобы она не загружала файл из S3, если он уже существует.

- исключить, исключая все файлы

- включить, включает в себя все файлы, соответствующие шаблону

#!/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. Спасибо @David Murray

Ответ 4

Если это только что загруженный файл, вы можете использовать Lambda для выполнения фрагмента кода на новом объекте S3.

Если вам действительно нужно получить самую последнюю, вы можете сначала назвать файлы с датой, отсортировать по имени и взять первый объект.

Ответ 5

Эта команда просто выполняет работу без каких-либо внешних зависимостей:

aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text