S3 ListObjectsV2 可以返回按最新到最旧排序的键吗?

问题描述 投票:0回答:2

我的 AWS S3 存储桶包含数百个顶级前缀(文件夹)。每个前缀包含 5000 到几百万个文件 - 大多数以每年 10-100k 的速度增长。 99% 的时候,我关心的只是每个文件夹中最新的 1-2000 左右...

使用 ListObjectV2 返回 1000 个文件,这是最大值(将“MaxKeys”设置为更高的值仍会将列表截断为 1000)。 这将相当不错,但是(根据文档)它按字母升序返回我的文件列表(鉴于我的键/文件名中包含日期,有效地导致最旧->最新排序)...这是与它返回给我最新文件(或反向字母顺序)相比,用处要小得多。

一个选择是执行延续,允许我拉出整个前缀,然后根据需要使用整个键数组的尾部......但这对于大型“文件夹”来说(最重要的是)会很慢。 包含 200 万个文件的前缀需要 2,000 个单独的 API 调用,才能获取最新的数百个文件名。 (更不用说提取整个遗愿清单所产生的成本,尽管我只对最新的 1-2000 个文件真正感兴趣。)

有没有办法让 ListObjectV2 调用(或任何其他 s3 调用)为我提供最新(或反向字母顺序)文件的列表? 新文件每隔几分钟就会出现 - 最重要的文件是最新的文件,因此执行 S3 Inventory 似乎并不能解决问题。

(或者,也许,一个给我创建日期范围内的文件名的调用......?)

使用 javascript - 但我确信每种语言在尝试列出 S3 存储桶中的对象时都具有或多或少相同的功能。

编辑:奇怪的想法:如果 AWS 不为其最受欢迎的服务之一的基本 API 调用提供“排序”选项...在 dynamo 表中记录所有文件名/键并查询是否有意义相反?

amazon-web-services amazon-s3
2个回答
2
投票

不。

ListObjectsV2()
将始终按请求的前缀中的字母顺序返回最多 1000 个对象。

您可以使用 Amazon S3 Inventory,它可以提供每日或每周列出所有对象的 CSV 文件。

如果您需要实时或相当快速地访问所有可用对象的列表,您的另一个选择是在创建/删除对象时触发 AWS Lambda 函数。 Lambda 函数将“在数据库中存储/更新信息”(例如 DynamoDB),该数据库可以提供对对象列表的快速访问。您需要编写此解决方案的代码。


0
投票

类似于在文件名中添加时间戳前缀,而是使用“负时间戳”作为前缀,并且最新的项目将始终位于第一个。

给定的“负时间戳”

2024-09-09T09:09:09Z

,我的意思是像以下之一的编码:

9 的补码

7975-90-90T90:90:90Z

- 将每个数字“反转”

9 - x
最长时间倒计时

251676427850

-

MAX_TIME - x
“反转”(零填充,ofc)
哪里

MAX_TIME = 253402300799

,即

9999-12-31-23:59:59Z
    

© www.soinside.com 2019 - 2024. All rights reserved.