[英]How to copy individual objects between S3 buckets quickly / in a fast manner?
我們有一個 lambda 被一些 S3 文件觸發並且應該將它們復制到不同的存儲桶。 基本上代碼看起來像
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
操作實際上並沒有將 object 下載到 lambda 並再次上傳,而是完全由 S3 處理副本,我希望這可以很快完成。 但是lambda(配置有例如 1024MB RAM)在 15 分鍾后超時並且 object 沒有出現在目標桶中。
如果我通過復制 object
aws s3 cp s3://source-bucket/5_gb.data s3://target-bucket/5_gb.data
復制在大約 2.5 分鍾后完成。
為什么 python 代碼比aws
cli 調用慢這么多?
復制操作由 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 調用的復制速度。 在我的測試中,為 lambda 提供 512MB RAM 就足夠了,它復制了文件而沒有接近超時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.