web-dev-qa-db-ja.com

AWS CLIを使用してS3バケットに最新のファイルをダウンロードしますか?

データベースバックアップを含むS3バケットがあります。私は最新のバックアップをダウンロードするスクリプトを作成しています(最終的にはどこか他の場所に復元します)が、バケットから最新のファイルのみを取得する方法がわかりません。

AWS CLIツールを使用して、s3バケットからローカルディレクトリに最新のファイルのみをコピーすることは可能ですか?

22
Abe Miessler

これはあなたが取ることができるアプローチです。

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}'は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
39
error2007s

そして、これは@ error2007sの答えに基づいて作成されたbashスクリプトです。このスクリプトは、変数として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
5
JBaczuk

上記のソリューションは、次のスクリプトを使用してWindowsでダウンロードするためにPowershellで同じことをしたい場合のBashです:

$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 ***")

}
0
Nikki Ganju