如何在S3存储桶之间快速复制单个对象



我们有一个lambda,它是为一些S3文件触发的,应该将它们复制到不同的bucket中。基本上代码看起来像

import boto3
def handler(event, context):
boto3.client("s3").copy_object(Bucket="target-bucket", Key="5_gb.data", CopySource={"Bucket": "source-bucket", "Key": "5_gb.data"})

知道CopyObject操作实际上并没有将对象下载到lambda中并再次上传,而是完全由S3处理拷贝,我希望这能很快完成但是lambda(配置有例如1024MB RAM(在15分钟后超时,并且对象没有出现在目标bucket中。

如果我通过复制对象

aws s3 cp s3://source-bucket/5_gb.data s3://target-bucket/5_gb.data

复制大约在2.5分钟后完成。

为什么python代码比awscli调用慢得多?

复制操作由S3内部处理,但对于较大的文件来说速度相当慢。

cli本身也在后台使用boto,但它使用了不同的复制文件的方法,它使用多部分上传/复制操作,并并行复制文件的部分内容(至少只要文件足够大(,从而实现更高的复制性能
如果您检查aws-cli代码,您可以看到它使用了来自boto的TransferManager,您也可以执行完全相同的操作,并将lambda重写为:

import boto3
from s3transfer.manager import TransferManager, TransferConfig
def handler(event, context):
manager = TransferManager(boto3.client("s3"), TransferConfig(max_request_concurrency=20))
manager.copy(bucket="target-bucket", key="5_gb.data", copy_source={"Bucket": "source-bucket", "Key": "5_gb.data"}).result()

这将导致lambda实现与本地cli调用类似的复制速度。在我的测试中,提供一个512MB RAM的lambda就足够了,它在没有接近超时的情况下复制了文件。

相关内容

  • 没有找到相关文章

最新更新