网站搜索

javascript - 如何按创建日期从 AWS S3 查询项目


我想根据添加到 S3 的日期/时间,从存储桶中的特定子目录查询项目。我一直找不到关于这方面的明确文档,所以我想知道该如何实现?

我想要执行的查询类型看起来像这样...

  1. 返回 S3 存储桶 images 下目录 images/user1/ 中最近创建的文件的 URL
  2. 返回在 S3 存储桶 images 的目录 images/user1 下,于日期时间 X 与日期时间 Y 之间创建的所有项目的 URL

答案#1

更新 2019/3/19

显然 s3api 允许你很容易地做到这一点

一个解决方案可能是使用 s3api。如果你的对象少于1000个,它使用起来很容易,否则你需要处理分页。

s3api 可以列出所有对象,并且有一个属性用于查看导入到 s3 的键的 lastmodified 属性。然后可以对其进行排序,查找某个日期之后或之前的文件,或者匹配某个日期...

运行此类选项的示例

  1. 指定日期的所有文件

    DATE=$(date +%Y-%m-%d)
    aws s3api list-objects-v2 --bucket test-bucket-fh \
      --query "Contents[?contains(LastModified, \`$DATE\`)]"
    
  2. 某日期之后的所有文件

    YESTERDAY=`date -d '-1 day' +%F`
    aws s3api list-objects-v2 --bucket test-bucket-fh \
      --query "Contents[?LastModified > \`$YESTERDAY\`]"
    

s3api 将返回一些元数据,以便您可以筛选特定元素

DATE=$(date +%Y-%m-%d)
aws s3api list-objects-v2 --bucket test-bucket-fh \
  --query "Contents[?contains(LastModified, \`$DATE\`)].Key"

旧答案

AWS-SDK/CLI 确实应该实现某种 按日期检索 的标志,这会让生活更 轻松 和 更便宜。

如果您没有在文件名前加上日期或标签,您也可能想尝试使用该标志

--start-after (string)

如果您知道要开始列出的最新文件,可以使用 list-objects-v2 命令并加上 --start-after 标志。

"StartAfter 是您希望 Amazon S3 开始列出的位置。Amazon S3 会在此指定的键之后开始列出。StartAfter 可以是存储桶中的任意键"

所以 --start-after 会持续获取你的对象,因此如果你想限制项目数量,可以尝试指定 --max-items 标志。

https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html

答案#2

S3 可以 列出 存储桶中的所有对象,或者列出具有特定前缀(例如“目录”)的所有对象。然而,这不是一个廉价的操作,它肯定不是为在每个请求中执行而设计的。

一般来说,对于这个问题,使用数据库层是最合适的。它可以是轻量且快速的(比如 redis),但你应该清楚自己有哪些对象,以及在特定请求中需要哪个对象。

你可以通过复制对象两次来某种程度上作弊——例如,images/latest.jpg 或 images/user1/latest.jpg。但在“日期查询”的例子中,你肯定应该在 S3 外部执行此操作。