【问题标题】:S3 multipart upload - complete multipart upload asyncronouslyS3 分段上传 - 异步完成分段上传
【发布时间】:2020-03-19 12:17:34
【问题描述】:

我正在尝试使用我用 python 编写的 lambda (aws) 完成分段上传。下面是我正在使用的代码。大约有 120 个部分,总大小为 30GB。以下操作似乎没有在 5 分钟内完成,因此 lambda 关闭并且上传似乎没有完成。 S3 是否提供异步多部分上传功能?我相信这将确保文件得到合并,而不管 lambda 关闭。

resp = s3.complete_multipart_upload(Bucket=bucket_name, Key=result_filename, UploadId=upload_id, MultipartUpload={'Parts': parts_mapping})

【问题讨论】:

  • 所以你运行了很多 Lambda,每个上传一个部分,然后一个最终的 Lambda 来完成分段上传?
  • 是的,没错。
  • 您有两种选择:减小每个部分的大小或增加内存大小(这会增加网络带宽)或两者兼而有之。我很好奇你为什么选择 Lambda 来实现这个功能。
  • @JohnHanley 谢谢。 Lambda 的内存大小为最大值。我有 122 个部分,每个部分只有 100 MB 的数据。我想当我进行多部分上传时,一切都发生在 S3 的幕后,我假设 S3 需要 5 分钟以上的时间来处理。这是一个现有的过程,它适用于具有大约 10 Gb 数据的其他文件,因此尝试重用相同的文件。在使用完整的分段上传 api 将所有详细信息传递给 S3 后,S3 不支持异步处理吗?
  • 我在 boto3 SDK(或更一般地在 S3 REST API 中)中看不到任何支持异步完成分段上传的内容。鉴于它可能需要“几分钟”才能完成并且您显然超过了 Lambda 5m 超时,您可能需要寻找另一个选项(例如带有调用 complete_multipart_upload() 的 userdata 脚本的 EC2,一旦完成,就会关闭EC2 实例)。

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


【解决方案1】:

AWS Lambda 将单次调用的最长执行时间限制为 5 分钟。您可以将执行长时间运行任务的 Lambda 函数编写为递归函数。

context.get_remaining_time_in_millis()

当您的函数被调用时,上下文对象允许您找出当前调用还剩多少时间。

尽量减少没有。对于递归,我们的函数将:

  • 限制零件大小,使用小批量。
  • 在每批结束时, 调用 context.getRemainingTimeInMillis() 来检查有多少时间 留在这个调用中
  • 如果剩余时间超过 1 分钟 调用然后处理另一批;否则递归

示例链接: Recursive Lambda Function Recursive Lambda the right way

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2021-05-21
    • 2013-03-29
    相关资源
    最近更新 更多