データベースバックアップを含むS3バケットがあります。私は最新のバックアップをダウンロードするスクリプトを作成しています(最終的にはどこか他の場所に復元します)が、バケットから最新のファイルのみを取得する方法がわかりません。
AWS CLIツールを使用して、s3バケットからローカルディレクトリに最新のファイルのみをコピーすることは可能ですか?
これはあなたが取ることができるアプローチです。
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
そして、これは@ 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
上記のソリューションは、次のスクリプトを使用して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 ***")
}