【问题标题】:How to list *recent* files in AWS S3 bucket with AWS CLI or Python如何使用 AWS CLI 或 Python 列出 AWS S3 存储桶中的*最近*文件
【发布时间】:2021-02-12 18:37:53
【问题描述】:

我有一个摄像头,它每小时都会向我的 AWS S3 存储桶添加新文件,除非它没有。为了快速排除故障,我希望能够在 S3 文件夹中找到(列出或查看)最新文件。或列出自特定日期/时间以来的所有文件。 FWIW,文件名由 UNIX 纪元日期戳组成,因此我可以查找包含大于 161315000 的数字的文件名。

到目前为止,我唯一的解决方案是列出所有文件,通过管道传输到文本文件,然后我可以对其进行解析。这需要太长时间...我有数万个文件。

我很乐意使用 AWS CLI、s3cmd、Boto... 任何可行的方法。

【问题讨论】:

  • 桶中有多少个对象?

标签: python amazon-s3 boto3 aws-cli s3cmd


【解决方案1】:

这是单独使用 S3 无法做到的,因为 S3 不是文件系统,而是对象存储。因此,它针对大量对象进行了优化,而不是针对快速列出。

如果您可以控制对象键的格式,则可以在它们前面加上当前日期(如2021/02/11/161315000)。如果您只是出于调试目的手动查找最新对象,则可以轻松找到最新对象。

如果无法更改对象键的格式,则必须求助于更复杂的选项。

虽然存在S3 inventory 报告,它确实提供了所有对象及其最后修改时间的列表,但这可能对您也不起作用,因为这些报告每天只生成一次并且可能不包括最近添加的对象。

另一种可能更适合您的用例的替代方法是使用 S3 event notifications 来处理新创建的对象以触发 AWS Lambda 函数。然后,此 AWS Lambda 函数可以将最后修改对象的 S3 密钥存储在某处(例如将其记录到 Amazon CloudWatch,您可以在其中简单地检查最近创建的 S3 对象的最新日志记录)。

【讨论】:

  • 我总是听到这样的说法:“S3 不是文件系统,而是对象存储。”我确信这是正确的,并且可能是为什么处理它如此困难的原因,但任何存储系统肯定都需要有用的工具来检查其内容。让我完全困惑的是,这并不简单。
【解决方案2】:

您可以简单地使用LastModified 日期,而不是使用文件名(“密钥”),S3 在创建对象时自动附加该日期。

要根据该日期列出最近的对象,您可以使用:

aws s3api list-objects --bucket my-bucket --query 'sort_by(Contents, &LastModified)[-1].Key' --output text

列出自给定日期以来的对象(我怀疑是UTC时区):

aws s3api list-objects --bucket my-bucket --query "Contents[?LastModified>='2021-01-29'].[Key]" --output text

如果您希望通过 Python 进行此操作,则需要检索所有对象的列表,然后您可以解析对象键或 LastModified 日期。

【讨论】:

  • 上面的命令也会列出所有对象,之后只会在客户端过滤它们,因此它们对于具有大量对象的 S3 存储桶并不可行。
  • 没错。所有过滤都是“本地”完成的。 AWS CLI 实际上只是一个 Python 程序,可以访问与任何使用 boto3 的程序相同的 API 调用。
  • 有没有办法在本地(在 S3 上)执行此操作,然后移动较小的结果?喜欢:ls -la |尾巴 > lastentrys.txt ?我当前列出的 S3 文件夹大小为 7 MB,超过 120,000 行。当然,如果 AWS ls 命令接受 --exclude 参数,我可以减少这种情况,但它没有,对吧? (wtf?)
  • 不,这是不可能的。 ListObject() 命令一次返回 1000 个对象。对于 120,000 个对象,这将需要 120 次 API 调用。替代方法是使用Amazon S3 Inventory(由@Dunedan 建议),或维护您自己的对象数据库——这将涉及查询数据库以查找对象,而不是直接查询存储桶。
猜你喜欢
  • 2016-08-26
  • 2017-08-24
  • 2023-03-17
  • 2016-11-18
  • 2017-06-03
  • 2017-04-25
  • 1970-01-01
  • 2019-12-02
  • 2017-05-06
相关资源
最近更新 更多