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

Ale*_*ejo 1 amazon-s3 amazon-web-services aws-billing

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

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

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

谢谢大家

mar*_*nue 6

受欢迎的

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

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

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

  1. 这并不能很好地扩展,尤其是对于大存储桶,它对最小化数据出站没有多大帮助。
  2. 它不会减少 S3 API 调用的次数,因为该--query参数不在服务器端执行。它恰好是这个 aws-cli 命令的一个特性。为了说明这一点,这就是它的外观boto3,正如您所看到的,我们仍然需要在客户端查询它:
aws s3api list-objects-v2 --bucket your-bucket-name --query 'Contents[?contains(LastModified, `$DATE`)]'
Run Code Online (Sandbox Code Playgroud)

大概

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

完美(有点)

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

  • 检查完我的成本后,每 1000 个请求为 0.005 美元,因此在您给出的示例中,列出 100 万个对象将花费 0,005 美元(1000 个 LIST 请求,每个请求 1000 个对象) (5认同)
  • 这是正确的。您只需为该一项请求付费。给您一个想法,使用 LIST 检索 100 万个对象将是 1000 x 1000,这将花费您大约 5 美元。您可以尝试在 https://calculator.s3.amazonaws.com/ 中尝试 (2认同)