web-dev-qa-db-ja.com

S3 CLIから最後に変更されたオブジェクトを取得する

プログラムでEC2インスタンスを起動し、S3から実行可能ファイルをコピーして実行し、インスタンスをシャットダウンする(ユーザーデータで行われた)ユースケースがあります。 S3から最後に追加されたファイルのみを取得する必要があります。 CLIを使用してS3バケットから最後に変更されたファイル/オブジェクトを取得する方法はありますか?

52
wishy

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
114
David Murray
aws s3api list-objects-v2 --bucket "bucket-name" |jq  -c ".[] | max_by(.LastModified)|.Key"
9
AlexLoo

以下は、S3バケットから最新のファイルをダウンロードするbashスクリプトです。代わりにAWS S3 Synchコマンドを使用したため、既に存在する場合はS3からファイルをダウンロードしません。

--exclude、すべてのファイルを除外します

--include、パターンに一致するすべてのファイルを含めます

#!/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

追伸ありがとう@David Murray

2
AjitChahal

これが新しくアップロードされたファイルである場合、 Lambda を使用して、新しいS3オブジェクトでコードを実行できます。

本当に最新のものを取得する必要がある場合は、最初に日付を付けてファイルに名前を付け、名前でソートし、最初のオブジェクトを取得できます。

1
Jonathan Turpie