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

wis*_*shy 59 amazon-s3 amazon-ec2 amazon-web-services

我有一个用例,我以编程方式从S3启动EC2实例,复制和可执行文件,运行它并关闭实例(在用户数据中完成).我只需要从S3中获取最后添加的文件.有没有办法使用CLI从S3存储桶中获取最后修改的文件/对象?

Dav*_*ray 121

您可以列出存储桶中的所有对象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
Run Code Online (Sandbox Code Playgroud)

它们按键按字母顺序排序,但第一列是最后修改的时间.快速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
Run Code Online (Sandbox Code Playgroud)

tail -n 1选择最后一行,并awk '{print $4}'提取第四列(对象的名称).

$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,将其放入aws s3 cp以下载对象:

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object
Run Code Online (Sandbox Code Playgroud)

  • 这对于大型水桶来说是不切实际的 (13认同)
  • 这不会对包含大量对象的存储桶造成问题吗? (6认同)
  • 精彩的帖子。由于每个命令的解释特别有用。谢谢。 (4认同)
  • 这不适用于包含超过 1000 个项目的存储桶,因为这是可以返回的最多 https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html (4认同)
  • S3仅按键索引对象.如果存储桶有足够的对象来进行"全表扫描"以找到您正在寻找的对象是不切实际的,那么您需要构建自己的单独索引.我能想到的最懒的选择是在你编写之后将最近编写的对象的键放在s3:// $ BUCKET/current中,并让读者在那里查找他们应该拉出哪一个. (3认同)

Rom*_*kin 33

过了一会儿,有一个小更新,如何优雅地做到这一点:

aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'sort_by(Contents, &LastModified)[-1].Key' --output=text
Run Code Online (Sandbox Code Playgroud)

reverse我们可以通过以下方式从列表中获取最后一个条目,而不是额外的功能[-1]

旧答案:

这个命令只做没有任何外部依赖的工作:

aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text
Run Code Online (Sandbox Code Playgroud)

  • --query 在本地执行,因此如果存储桶中有超过 1000 个文件,则不能保证首先获取最后修改的文件。 (9认同)
  • 出色的。如果还需要对象名称匹配某个字符串: `--query 'reverse(sort_by(Contents[?contains(Key, \`myKey\`)], &LastModified))[:1].Key'` (4认同)
  • 如果您将查询用双引号而不是单引号括起来,则此方法可以在 Windows cmd 中使用。 (2认同)

小智 10

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

  • 我认为`list-objects-v2`对最大项目有限制,所以如果你的桶有更多的对象 - 这可能无法得到准确答案 (3认同)