Загрузка последнего файла в ведро S3 с использованием AWS CLI?

У меня есть ведро S3, содержащее резервные копии базы данных. Я создаю script, который хотел бы загрузить последнюю резервную копию (и, в конечном счете, восстановить ее где-то в другом месте), но я не уверен, как перейти только к захвату самого последнего файла из ведра.

Возможно ли скопировать только последний файл из корзины s3 в локальный каталог с помощью инструментов AWS CLI?

Ответ 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

И вот bash script создать на основе ответа @error2007s. Этот script требует, чтобы ваш профиль aws и имя ведра были переменными, и загружает последний объект в папку ~/Downloads:

#!/bin/sh
PROFILE=your_profile
BUCKET=your_bucket

OBJECT="$(aws s3 ls --profile $PROFILE $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}')"
aws s3 cp s3://$BUCKET/$OBJECT ~/Downloads/$OBJECT --profile $PROFILE

Ответ 3

Решения Above - это Bash, если вы хотите сделать то же самое в Powershell для загрузки в Windows с помощью следующего сценария:

$s3location = 's3://bucket/'
$filename=C:\Progra~1\Amazon\AWSCLI\aws.exe s3 ls s3://bucket/PROD_FULL/ -- 
recursive | sort |select -last 3 
$Dpath='I:\Data_S3'

foreach($files in $filename)
{
#$files.ToString()
$testpath1 = Split-Path $path -leaf
$testpath1
$path=$s3location+$files

C:\Progra~1\Amazon\AWSCLI\aws.exe s3 cp $path $Dpath
echo(" ***Files Downloaded ***")

}