簡體   English   中英

兩個不同帳戶/連接之間來自boto3或boto api的存儲桶/密鑰的並行副本

[英]parallell copy of buckets/keys from boto3 or boto api between 2 different accounts/connections

我想使用boto3 api從2個不同帳戶之間的存儲桶中復制密鑰。 在boto3中,我執行了以下代碼,復制成功了

source =  boto3.client('s3')
destination = boto3.client('s3')
destination.put_object(source.get_object(Bucket='bucket', Key='key'))

基本上,我是從GET獲取數據並將其與PUT粘貼到另一個帳戶中。

在boto api的類似代碼行中,我完成了以下操作

source = S3Connection()
source_bucket = source.get_bucket('bucket')
source_key = Key(source_bucket, key_name)

destination = S3Connection()
destination_bucket = destination.get_bucket('bucket')
dist_key = Key(destination_bucket, source_key.key)
dist_key.set_contents_from_string(source_key.get_contents_as_string())

上面的代碼達到了復制任何類型數據的目的。 但是速度確實非常慢。 我大約需要15-20秒才能復制1GB的數據。 而且我必須復制100GB以上。 我嘗試了python mutithreading,其中每個線程都執行復制操作。 由於復制1GB需要30秒,因此性能很差。 我懷疑GIL可能是這里的問題。 我進行了多處理,得到的結果與單處理相同,即1GB文件需要15-20秒。

我正在使用具有48個內核和128GB RAM的非常高端的服務器。 我的環境中的網絡速度為10GBPS。 大多數搜索結果表明,是在同一帳戶中的存儲桶之間而不是跨帳戶中的存儲桶之間復制數據。 任何人都可以在這里指導我。 我的方法錯了嗎? 有誰有更好的解決方案?

是的,這是錯誤的方法。

不應該下載文件。 您正在使用AWS基礎設施,因此您應該利用有效的AWS后端調用來完成工作。 您的方法浪費資源。

boto3.client.copy會做得更好。

另外,您沒有描述您要實現的目標(例如,是否存在某種復制要求?)。

因為在正確了解自己的需求后,您甚至可能不需要服務器來完成該工作:S3存儲桶事件觸發器,lambda等都可以在沒有服務器的情況下執行復制工作。

要在兩個不同的AWS賬戶之間復制文件,您可以簽出此鏈接在AWS賬戶之間復制S3對象

注意 :

S3對每個人來說都是一個巨大的虛擬對象存儲,這就是為什么存儲桶名稱必須唯一的原因。 這也意味着,S3“控制器”可以完成許多類似於文件服務器的奇特工作,例如復制,復制,在后端移動文件,而不涉及網絡流量。

只要您為目標存儲桶設置正確的IAM權限/策略,對象就可以在存儲桶中移動而無需其他服務器。

這幾乎類似於文件服務器。 用戶可以在沒有“下載/上傳”的情況下互相復制文件,而是只創建一個對所有人都具有寫許可權的文件夾,而從另一位用戶復制文件則是在文件服務器內完成的,具有最快的原始磁盤I / O性能。 使用后端S3復制API, 您不需要強大的實例,也不需要高性能的網絡

您的方法類似於使用同一文件服務器嘗試從用戶FTP下載文件,這會產生不必要的網絡流量。

您應該在boto3中簽出TransferManager 它將以有效的方式自動處理分段上傳的線程。 請參閱文檔以獲取更多詳細信息。

基本上,您必須使用upload_file方法,TransferManager將負責其余的工作。

import boto3

# Get the service client
s3 = boto3.client('s3')

# Upload tmp.txt to bucket-name at key-name
s3.upload_file("tmp.txt", "bucket-name", "key-name")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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