列出AWS S3存储桶中的所有文件的成本是多少?

时间:2020-10-23 17:18:30

标签: amazon-web-services amazon-s3 aws-billing

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

我将不得不查询几千个文件,而且我不想在帐单上感到惊讶。

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

提前谢谢大家

1 个答案:

答案 0 :(得分:4)

受欢迎

人们常用的一种方法是通过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广告资源的好用例。它将为您提供每日文件,该文件由对象列表及其基于您的规范的元数据信息组成。参见https://docs.aws.amazon.com/AmazonS3/latest/user-guide/configure-inventory.html