我想通过将它们添加到S3的日期/时间在存储桶中的特定子目录中查询S3中的项目。我无法找到任何明确的文档,所以我想知道它是如何实现的?
我想要执行的查询类型如下所示......
images
images/user1/
中返回最近创建的文件的URL
X
Y
中日期时间images
和日期时间images/user1
之间创建的所有项目的网址
醇>
答案 0 :(得分:2)
您可以将日期前缀的文件存储在最终目录中,例如:
images/user1/2016-01-12_{actual file name}
然后,在执行查询的脚本中,您可以生成时间段中的日期列表,并相应地构造前缀,并分别查询所有日期的S3,并使结果微不足道。它应该比获取完整列表和过滤LastModified字段更快(这取决于你在给定目录中有多少文件,我认为比不到1000的任何文件都值得付出努力。)
使用' Marker'实际上有更好的方法。 listObjects调用中的参数,因此您将标记设置为键,listObjects将仅返回目录中该键之后的键。我们确实在关键名称中有日期和时间。
答案 1 :(得分:1)
S3可以list
存储桶中的所有对象,或具有前缀的所有对象(例如“目录”)。然而,这不是一个廉价的操作,它肯定不是为每次请求而设计的。
一般来说,最好为数据库层服务。它可以是轻快的(如redis),但您应该知道您拥有的对象以及给定请求所需的对象。
您可以通过两次复制对象来作弊,例如,images/latest.jpg
或images/user1/latest.jpg
。但是在“日期查询”示例中,您当然应该在S3外部执行此操作。
答案 2 :(得分:0)
更新3/19/2019
显然,s3api可以让您轻松完成此操作
一种解决方案可能是使用s3api
。如果您的对象少于1000个,那么它很容易工作,否则您需要进行分页。
s3api
可以列出所有对象,并且具有s3中导入的键的lastmodified
属性的属性。然后可以对其进行排序,查找日期之后或之前的文件,匹配日期...
运行该选项的示例
给定日期的所有文件
DATE=$(date +%Y-%m-%d)
aws s3api list-objects-v2 --bucket test-bucket-fh --query 'Contents[?
contains(LastModified, `$DATE`)]'
特定日期之后的所有文件
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