1

我正在用python编写一个脚本,我需要在存储桶中获取最新修改的文​​件(使用前缀),但据我所知,我不能直接从python进行查询(至少使用boto3),所以我必须检索我存储桶中每个对象的信息。

我将不得不对数千个文件进行一些查询,而且我不想在我的计费中得到任何惊喜。

如果我在查询中检索存储桶中所有对象的元数据以便稍后在本地对它们进行排序,我是作为单个请求收费还是计为每个对象的请求?

谢谢大家

4

1 回答 1

6

受欢迎的

人们使用的一种常用方法是通过s3api将多个调用合并到一个针对每 1000 个对象的单个 LIST 请求中,然后用于--query定义您的过滤操作,例如:

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

尽管请记住,这不是一个好的解决方案,原因有两个:

  1. 这并不能很好地扩展,尤其是对于大型存储桶,并且对最小化出站数据没有太大帮助。
  2. 它不会减少 S3 API 调用的数量,因为该--query参数不在服务器端执行。它恰好是这个 aws-cli 命令的一个功能。为了说明,这就是它的样子boto3,正如你所看到的,我们仍然需要在客户端查询它:
import boto3

client = boto3.client('s3',region_name='us-east-1')

response = client.list_objects_v2(Bucket='your-bucket-name')

results = sorted(response['Contents'], key=lambda item: item['LastModified'])[-1])

大概

根据您的特定用例,您可能*可能*做的一件事是利用 S3 事件通知自动发布一个事件SQS,让您有机会轮询所有 S3 对象事件及其更轻量级的元数据信息。这仍然会花费一些钱,如果你已经有一个现有的大桶开始,它就不会起作用。此外,您必须主动轮询消息,因为它们不会持续太久。

完美(有点)

在我看来,这听起来像是 S3 Inventory 的一个很好的用例。它将根据您的规范为您提供包含对象列表及其元数据信息的每日文件。请参阅https://docs.aws.amazon.com/AmazonS3/latest/user-guide/configure-inventory.html

于 2020-10-23T18:19:00.837 回答