【问题标题】:What is the cost of listing all files in AWS S3 bucket?列出 AWS S3 存储桶中的所有文件的成本是多少?
【发布时间】:2020-10-23 17:18:30
【问题描述】:

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

我将不得不对数千个文件进行一些查询,而且我不想对我的计费感到意外。

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

提前谢谢大家

【问题讨论】:

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


    【解决方案1】:

    流行

    人们常用的方法是通过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

    【讨论】:

    • 非常感谢您花时间编写这个详细的答案。我将查看您提到的 S3 库存。虽然我仍然没有找到原始问题的答案:如果我查询所有项目以在本地对它们进行排序,我会为检索到的每个对象付费吗?还是会针对单个请求向我收费?
    • 乐于助人。是的,您仍然需要付费,具体取决于您用于检索所有对象的元数据的 S3 API 请求类型,ListObjects (LIST) 本身。
    • 如果我理解正确:每列出 1000 个对象,我将被收取一个请求,对吗?
    • 没错。您只需为那一个请求付费。给你一个想法,使用 LIST 检索 100 万个对象将是 1000 x 1000,这将花费你大约 5 美元。你可以试试calculator.s3.amazonaws.com
    • 查看我的成本后,每 1000 个请求为 0.005 美元,因此在您放置的示例中,列出 100 万个对象将花费 0,005(1000 个 LIST 请求,每个请求 1000 个对象)跨度>
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 2020-01-24
    • 2016-10-29
    • 2019-05-10
    • 2017-12-07
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多