aws 中最便宜的方法 move/obtain 基于日期的文件子集

Cheapest way in aws to move/obtain a subset of files based on date

我的主要问题是:
我如何才能根据日期范围移动文件,而不会引起客户端 api 付费调用?

背景:
我想将 AWS S3 存储桶中的一部分文件下载到 linux 服务器上,但在一个文件夹中有数百万个文件,除了序列号外没有任何区别;根据创建日期,我需要其中的一部分。 (实际上,文件内部是一个事件时间戳,所以我想先按创建日期减少体积)。

坦率地说,我不知道每次我在该数据集上执行 ls 时会产生什么成本,例如用于测试。

目前我正在考虑:

aws s3api list-objects --bucket "${S3_BUCKET}" --prefix "${path_from}" --query "Contents[?LastModified>='${low_extract_date}'].{Key: Key}"

但如果我理解正确的话,那是客户端。所以我想先根据创建日期将相关文件移动到不同的文件夹。

然后 运行 aws S3 ls 在那个集合上。

这可能吗?

因为那样的话,我会:

  1. 将文件移动到另一个文件夹,同时限制在我感兴趣的日期范围 (2-5%)
  2. 列出所有这些文件(据我了解,这是产生成本的地方?),然后提取它们(并将它们移动到存档)
  3. 删除子文件夹

或:

  1. 将存储桶同步到新存储桶
  2. 从该存储桶中删除我不需要的所有文件(早于日期 X)
  3. 运行 ls 在剩余的集合上

或: 其他方式?

而且:这比使用查询列出文件便宜吗?

谢谢!

PS 澄清一下:我想做一个服务器端操作来减少集合,然后列出结果。

我认为一个好的方法如下:

  • 如果您的实例在 VPC 中,请为 S3 创建一个 VPC 端点,以允许直接私有连接到 Amazon S3,而不是通过互联网
  • 移动您想要的对象键,包括前缀(最好是 Y/m/d),例如prefix/randomfile.txt 可能会变成 2020/07/04/randomfile.txt。如果您打算废弃其余文件,则将其移至新存储桶而不是同一个存储桶中。
  • 根据前缀获取对象(对于本月的所有文件,前缀为 2020/07

您可以从 CLI 使用当前语法移动文件

aws s3 mv s3://bucketname/prefix/randomfile.txt s3://bucketname/2020/07/04/randomfile.txt

要复制特定前缀的文件,您可以运行在 CLI 上执行以下操作

aws s3 cp s3://bucketname/2020/07 .

要获取特定日期的文件,您可以运行以下

aws s3api list-objects-v2 --bucket bucketname --query 'Contents[?contains(LastModified, `$DATE`)]'

运行宁的结果需要通过 CLI运行