簡體   English   中英

如何快速/快速地在 S3 存儲桶之間復制單個對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM