【问题标题】:How to parse Boto3 200 response for copy_object request如何解析复制对象请求的 Boto3 200 响应
【发布时间】:2021-05-14 16:13:39
【问题描述】:

我是 Python 新手,我正在编写一个 AWS lambda,它将文件从一个存储桶复制到另一个存储桶。我正在使用 Boto3 库,并且在文档中遇到了以下内容:

当 Amazon S3 收到复制请求或在 Amazon S3 复制文件时,复制请求可能会返回错误。如果错误在复制操作开始之前发生,您会收到标准的 Amazon S3 错误。如果在复制操作期间发生错误,则错误响应嵌入到 200 OK 响应中。这意味着 200 OK 响应可以包含成功或错误。设计您的应用程序以解析响应的内容并适当地处理它。 如果复制成功,您会收到包含所复制对象信息的响应。

成功的响应如下所示(潜在的敏感数据替换为“...”):

Response : {'ResponseMetadata': {'RequestId': 'ID....', 'HostId': 'ID...', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': '...', 'x-amz-request-id': '...', 'date': 'Wed,
            10 Feb 2021 21: 48: 48 GMT', 'content-type': 'application/xml', 'content-length': '234', 'server': 'AmazonS3'
        }, 'RetryAttempts': 0
    }, 'CopyObjectResult': {'ETag': '"..."', 'LastModified': datetime.datetime(2021,
        2,
        10,
        21,
        48,
        48, tzinfo=tzlocal())
    }
}

我想知道如何解析 200 响应以检查错误。文档说,如果复制成功,那么您将收到包含有关复制对象信息的响应。我猜这是 CopyObjectResult 部分?

我正在访问响应:

   response = s3_client.copy_object(CopySource=copy_source_object, Bucket=destination_bucket_name, Key=destination_key_prefix+file_key_name)

我现在想写一条语句,说明如果对象复制成功,然后从源存储桶中删除该对象。我需要检查响应不仅是 200 响应,而且它还没有包含嵌入的错误。我找不到包含错误的示例 200 响应,以确保我已正确编写它,因此我向可信赖的 SO 社区寻求帮助。

提前致谢。

【问题讨论】:

    标签: python amazon-web-services amazon-s3 aws-lambda boto3


    【解决方案1】:

    我认为这里的文档可能具有误导性 - 它们描述的是较低级别的 Amazon API,而不是较高级别的面向客户端的库 boto3 的行为。

    你不需要解析它并检查错误,boto3/botocore 本身已经解析了结果。如果该方法完全返回了一个值,并且嵌入了 CopyObjectResult dict 和 ETag,那么就没有错误。如果发生错误,客户端库将引发异常。

    如果您想处理错误的可能性,那么您需要围绕 API 调用构建一个 try/except

    我的推理是基于查看源代码,这里注册了一个后处理钩子:

    https://github.com/boto/botocore/blob/1.20.5/botocore/handlers.py#L964-L967

    实现在这里:

    https://github.com/boto/botocore/blob/1.20.5/botocore/handlers.py#L83-L108

    copy_object服务器端失败的情况下提示500错误。

    【讨论】:

    • 内容丰富,非常感谢链接。非常感谢。
    • 在问题上加了一个赏金,看看代码中除了cmets还有什么
    • 而且...什么都没有:D
    猜你喜欢
    • 2021-03-15
    • 2015-09-26
    • 2019-12-12
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2021-08-23
    相关资源
    最近更新 更多