【问题标题】:aws boto3 s3 put_object error handling/testingaws boto3 s3 put_object 错误处理/测试
【发布时间】:2016-12-24 20:29:08
【问题描述】:

对于 python AWS boto3 s3 put_object,应该如何处理/测试错误?例如:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('foo')
bucket.put_object(Key='bar', Body='foobar')

可能出现的错误是否记录在某处?以下是否是正确的文档页面(它似乎是针对boto3.client('s3') 客户端,而不是boto3.resource('s3')),如果是,错误记录在哪里?

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.put_object

像不存在的存储桶这样的简单错误似乎很容易测试,但是否会发生虚假错误?如果是,如何测试这种错误处理?上传速度有限制吗?我尝试了以下操作,并惊讶地发现在运行大约 2 分钟后成功创建了所有 10000 个文件。当超过某个速率时,s3 是否会阻塞而不是错误?

from concurrent.futures import ThreadPoolExecutor

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('foo')

def put(i):
    bucket.put_object(Key='bar/%d' % i, Body='foobar')

executor = ThreadPoolExecutor(max_workers=1024)

for i in range(10000):
    executor.submit(put, i)

如果出现错误,重试put_object 调用 1 次或多次是否是一种好习惯?

【问题讨论】:

  • 为什么不使用try: except?在这种情况下?
  • 类似以下的答案表明正在进行一些自动重试:*.com/questions/29378763/…。此外,一些 boto3 错误不会引发异常,例如lambda 调用响应状态码包含错误信息boto3.readthedocs.io/en/latest/reference/services/…
  • 取决于上传频率。在使用 PUT 请求重试之前,您可能需要使用 GET 验证上传。由于 AWS 对 PUT($0.01/1k 请求)的收费是 GET($0.01/10k 请求)的 10 倍

标签: python amazon-web-services amazon-s3 error-handling boto3


【解决方案1】:

AWS s3 不限制基于请求的上传。限制仅适用于大小: 例如: 1 个 POST 请求将上传最大 5GB 的文件 2 PUT 最多可以上传 160 GB 的大小

您尝试或期望处理的错误只不过是一次上传多个文件时的客户端/浏览器限制。

Boto3 Upload 接口确实有一个名为 'config' 的参数,您可以在其中指定并发上传: # 为了减少下行带宽消耗,降低最大并发 config = TransferConfig(max_concurrency=5)

【讨论】: