У меня есть вариант использования, когда я программно вызываю экземпляр EC2, копирую исполняемый файл из S3, запускаю его и закрываю экземпляр (выполняется в пользовательских данных). Мне нужно получить только последний добавленный файл из S3. Есть ли способ получить последний измененный файл / объект из корзины S3 с помощью интерфейса командной строки?
80
Event/Lambda
объект, который запускаетсяObjectCreation
. выборка последнего объекта среди 2M + объектов с использованием s3 cli или api работает медленнее.Ответы:
Вы можете перечислить все объекты в ведре с помощью
aws s3 ls $BUCKET --recursive
:Они отсортированы в алфавитном порядке по ключу, но в первом столбце указано время последнего изменения. Быстро
sort
отсортирует их по дате:tail -n 1
выбирает последнюю строку иawk '{print $4}'
извлекает четвертый столбец (имя объекта).И последнее, но не менее важное: вставьте это,
aws s3 cp
чтобы загрузить объект:источник
awk
нужно будет выбрать второй элемент (вместо 4-го), и--recursive
он понадобится, например,KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $2}'` ; aws s3 cp s3://$BUCKET/$KEY ./latest-object --recursive
aws s3 cp s3://$BUCKET/$KEY ./latest-object
предыдущий сценарий вернется"object"
Через некоторое время есть небольшое обновление, как сделать это немного элегантнее:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'sort_by(Contents, &LastModified)[-1].Key' --output=text
Вместо дополнительной
reverse
функции мы можем получить последнюю запись из списка через[-1]
Старый ответ:
Эта команда просто выполняет работу без каких-либо внешних зависимостей:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text
источник
--query 'reverse(sort_by(Contents[?contains(Key, `myKey`)], &LastModified))[:1].Key'
--filter
Можно применить штатную опцию для уменьшения спискаисточник
list-objects-v2
есть ограничение на максимальное количество предметов, поэтому, если в вашем ведре больше предметов, чем это - это может не дать точного ответаIsTruncated
установлено значение true, если доступно больше ключей для возврата.Ниже приведен сценарий bash, который загружает последний файл из S3 Bucket. Я использовал AWS S3 SynchВместо этого команду , чтобы она не загружала файл с S3, если он уже существует.
--exclude, исключает все файлы
--include, включает все файлы, соответствующие шаблону
ps Спасибо @ Дэвид Мюррей
источник
Если это только что загруженный файл, вы можете использовать Lambda для выполнения фрагмента кода на новом объекте S3.
Если вам действительно нужно получить самый последний объект, вы можете сначала назвать файлы с датой, отсортировать по имени и взять первый объект.
источник