使用 AWS CLI 从 S3获取最后修改的对象

我有一个用例,我通过编程打开一个 EC2实例,从 S3复制一个可执行文件,运行它并关闭该实例(在用户数据中完成)。我只需要从 S3获取最后添加的文件。

有没有一种方法可以使用 AWS CLI工具从 S3 bucket 获取最后修改的文件/对象?

137445 次浏览

如果这是一个新上传的文件,您可以使用 Lambda在新的 S3对象上执行一段代码。

If you really need to get the most recent one, you can name you files with the date first, sort by name, and take the first object.

您可以使用 aws s3 ls $BUCKET --recursive列出 bucket 中的所有对象:

$ 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 selects the last row, and awk '{print $4}' extracts the fourth column (the name of the object).

$ 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

下面是 bash 脚本,它从 S3Bucket 下载最新的文件。我使用了 AWS S3 Synch命令,这样如果文件已经存在,它就不会从 S3下载文件。

排除,排除所有文件

—— 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

aws s3api list-objects-v2 --bucket "bucket-name" |jq  -c ".[] | max_by(.LastModified)|.Key"

Updated answer

过了一会儿,有一个小小的更新如何做得更优雅一些:

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