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

时间:2015-07-16 16:56:56

标签: javascript amazon-web-services amazon-s3 aws-sdk

我想通过将它们添加到S3的日期/时间在存储桶中的特定子目录中查询S3中的项目。我无法找到任何明确的文档,所以我想知道它是如何实现的?

我想要执行的查询类型如下所示......

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

3 个答案:

答案 0 :(得分:2)

您可以将日期前缀的文件存储在最终目录中,例如:

images/user1/2016-01-12_{actual file name}

然后,在执行查询的脚本中,您可以生成时间段中的日期列表,并相应地构造前缀,并分别查询所有日期的S3,并使结果微不足道。它应该比获取完整列表和过滤LastModified字段更快(这取决于你在给定目录中有多少文件,我认为比不到1000的任何文件都值得付出努力。)

使用' Marker'实际上有更好的方法。 listObjects调用中的参数,因此您将标记设置为键,listObjects将仅返回目录中该键之后的键。我们确实在关键名称中有日期和时间。

答案 1 :(得分:1)

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

一般来说,最好为数据库层服务。它可以是轻快的(如redis),但您应该知道您拥有的对象以及给定请求所需的对象。

您可以通过两次复制对象来作弊,例如,images/latest.jpgimages/user1/latest.jpg。但是在“日期查询”示例中,您当然应该在S3外部执行此操作。

答案 2 :(得分:0)

更新3/19/2019

显然,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. 特定日期之后的所有文件

    export YESTERDAY=`date -v-1w +%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从其开始列出的位置。AmazonS3在此指定密钥之后开始列出。StartAfter可以是存储桶中的任何密钥”

因此--start-after会不断获取您的对象,因此,如果您想限制项目数,请尝试指定一个--max-items标志。

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