S3 बाल्टी के बीच फ़ाइलों को स्थानांतरित करने का सबसे अच्छा तरीका है?


89

मैं प्रोडक्शन बकेट की कुछ फाइलों को एक डवलपमेंट बकेट से कॉपी करना चाहता हूं।

उदाहरण के लिए: प्रतिलिपि बनाएँ productionbucket / feed / feedname / date to developmentbucket / feed / feedname / date

क्योंकि मुझे जो फ़ाइलें चाहिए वे फ़ोल्डर संरचना में बहुत गहरी हैं, प्रत्येक फ़ोल्डर में जाने और कॉपी / पेस्ट करने में बहुत समय लगता है।

मैंने प्रत्येक बकेट में बढ़ते ड्राइव के साथ खेला है और विंडोज़ बैच स्क्रिप्ट लिख रहा हूं, लेकिन यह बहुत धीमा है और यह अनावश्यक रूप से सभी फाइलों / फ़ोल्डरों को स्थानीय सर्वर पर डाउनलोड करता है और फिर से बैकअप देता है।

जवाबों:


109

अपडेट करें

जैसा कि अलबरगे (+1) द्वारा बताया गया है , आजकल उत्कृष्ट AWS कमांड लाइन इंटरफ़ेस, AWS (लगभग) सभी चीजों के साथ बातचीत करने के लिए सबसे बहुमुखी दृष्टिकोण प्रदान करता है - इस बीच यह अधिकांश सेवाओं के API को कवर करता है और आपके साथ काम करने के लिए उच्च स्तर S3 कमांड भी देता है। विशेष रूप से केस का उपयोग करें, S3 के लिए AWS CLI संदर्भ देखें :

  • सिंक - सिंक निर्देशिका और S3 उपसर्ग। आपके उपयोग के मामले से आच्छादित है उदाहरण 2 (अधिक ठीक से उपयोग कणों --exclude, --includeऔर उपसर्ग आदि से निपटने में भी उपलब्ध है):

    निम्नलिखित सिंक कमांड एक निर्दिष्ट उपसर्ग और बाल्टी के तहत वस्तुओं को एक और निर्दिष्ट उपसर्ग और बाल्टी के तहत वस्तुओं को s3 वस्तुओं की प्रतिलिपि बनाकर सिंक करता है। [...]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    

पूर्णता के लिए, मैं उल्लेख करूंगा कि S3api उप कमांड के माध्यम से निचले स्तर के S3 कमांड अभी भी उपलब्ध हैं , जो अंततः अपने उच्च स्तर की कार्यक्षमता को अपनाने से पहले AWS CLI पर किसी भी SDK आधारित समाधान का अनुवाद करने की अनुमति देगा।


प्रारंभिक उत्तर

S3 बाल्टियों के बीच चल रही फ़ाइलों को PUT ऑब्जेक्ट के माध्यम से प्राप्त किया जा सकता है - कॉपी एपीआई (इसके बाद DELETE ऑब्जेक्ट ):

PUT ऑपरेशन के इस कार्यान्वयन से एक ऑब्जेक्ट की प्रतिलिपि बनाई जाती है जो पहले से ही अमेज़ॅन S3 में संग्रहीत है। PUT कॉपी ऑपरेशन GET और फिर PUT प्रदर्शन करने के समान है। अनुरोध शीर्षलेख, x-amz-copy-source को जोड़कर, PUT ऑपरेशन को स्रोत वस्तु को गंतव्य बकेट में कॉपी करता है। स्रोत

सभी मौजूदा एडब्ल्यूएस एसडीके के लिए संबंधित नमूने उपलब्ध हैं, एक एकल ऑपरेशन में ऑब्जेक्ट को कॉपी करना देखें । स्वाभाविक रूप से, एक स्क्रिप्टिंग आधारित समाधान यहां स्पष्ट पहली पसंद होगी, इसलिए रूबी के लिए एडब्ल्यूएस एसडीके का उपयोग करते हुए एक ऑब्जेक्ट की प्रतिलिपि बनाएँ एक अच्छा प्रारंभिक बिंदु हो सकता है; यदि आप इसके बजाय पाइथन पसंद करते हैं, तो बोटो के माध्यम से भी प्राप्त किया जा सकता है , copy_key()बोटो के एस 3 एपीआई प्रलेखन के भीतर विधि देखें ।

PUT Objectकेवल फ़ाइलों की प्रतिलिपि बनाता है, इसलिए आपको DELETE Objectएक सफल प्रतिलिपि कार्रवाई के बाद भी किसी फ़ाइल को स्पष्ट रूप से हटाने की आवश्यकता होगी , लेकिन यह केवल एक और कुछ पंक्तियां होंगी, जब बाल्टी और फ़ाइल नामों को संभालने वाली समग्र स्क्रिप्ट मौजूद है (संबंधित उदाहरण भी हैं देखें, उदाहरण के लिए प्रति अनुरोध एक वस्तु को हटाना )।


मैंने AWS SDK के साथ ऑपरेशन की पटकथा को .NET में समाप्त कर दिया
मैट डेल

1
@MattDell क्या आप इस प्रश्न का .NET उत्तर जोड़ सकते हैं?
बेलाकांद्रे

1
इस बारे में क्या बेकार है कि अमेज़ॅन इस बात पर बहुत स्पष्ट नहीं है कि कॉपी कमांड सफल था या नहीं, इसलिए ऑपरेशन के बाद हटाना खतरनाक लगता है।
जेम्स मैकमोहन

बस स्पष्ट होने के लिए, मैं विशेष रूप से जावा एपीआई का उल्लेख कर रहा था। मैंने एक अलग प्रश्न खोला है stackoverflow.com/questions/17581582
जेम्स मैकमोहन

हमें अभी भी एकल आईडी बनाने और एक बाल्टी से पढ़ने और दूसरी बाल्टी से लिखने में सक्षम कुंजी के कुछ सरल तरीके की आवश्यकता है। खासतौर पर अगर बाल्टियां खाते हैं।
CMCDragonkai

65

नया आधिकारिक AWS CLI मूल रूप से अधिकांश कार्यक्षमता का समर्थन करता है s3cmd। मैं पहले s3cmdइस तरह की चीजों को करने के लिए या AWS SDK का उपयोग कर रहा हूं , लेकिन आधिकारिक CLI इसके लिए बहुत अच्छा काम करता है।

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

aws s3 sync s3://oldbucket s3://newbucket

4
यह सूची के शीर्ष पर मतदान होना चाहिए। यह बाल्टी को सिंक करने का उचित तरीका है और इन सभी उत्तरों में सबसे ऊपर है।
dft

यदि आपको 403 पहुंच अस्वीकृत त्रुटियों से परेशानी है, तो इस ब्लॉग पोस्ट को देखें। यह मदद करता है। alfielapeter.com/posts/…
crlane

3
क्रॉस क्षेत्र प्रतिaws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
समतुल्य

यदि आपको सर्वर पर इस ower नाइट को nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 & thegeekstuff.com/2010/12/5-ways-to-execute-linux-command का
समतुल्य

@alberge कमांड लाइन तर्क का उपयोग करते हुए पहुंच कुंजी और रहस्य प्रदान करने का कोई तरीका है?
इम्पेटडाटा

28

एक बाल्टी से दूसरी बाल्टी या एक ही बाल्टी में स्थानांतरित करने / कॉपी करने के लिए मैं s3cmd टूल का उपयोग करता हूं और ठीक काम करता हूं। उदाहरण के लिए:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1

28

मैंने इसके लिए आवश्यक प्रतियों को समानांतर करने के लिए अपने स्वयं के कस्टम उपकरण लिखने में दिन बिताए, लेकिन फिर मैं प्रलेखन पर चला गया कि बड़े पैमाने पर समानांतर के साथ बाल्टी को सिंक्रनाइज़ करने के लिए AWS S3 CLI सिंक कमांड कैसे प्राप्त करें । निम्नलिखित कमांड एडब्ल्यूएस सीएलआई को नौकरियों को निष्पादित करने के लिए 1,000 थ्रेड्स (प्रत्येक छोटी फ़ाइल या मल्टीपार्ट कॉपी का एक हिस्सा) का उपयोग करने के लिए बताएंगे और आगे 100,000 नौकरियों को देखेंगे:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

इन्हें चलाने के बाद, आप सरल सिंक कमांड का उपयोग इस प्रकार कर सकते हैं:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

मेरे मामले के लिए एक M4.xlarge मशीन (AWS - 4 कोर, 16GB RAM में) पर, सिंक / कॉपी स्पीड लगभग 9.5MiB / s से 700 + MiB / s तक गई, एक गति वृद्धि डिफ़ॉल्ट कॉन्फ़िगरेशन पर 70x।

अद्यतन: ध्यान दें कि S3CMD वर्षों में अद्यतन किया गया है और ये परिवर्तन अब केवल तब प्रभावी होते हैं जब आप बहुत सारी छोटी फ़ाइलों के साथ काम कर रहे होते हैं। यह भी ध्यान दें कि विंडोज पर (केवल विंडोज पर) S3CMD समग्र थ्रूपुट में गंभीर रूप से सीमित है और यह केवल 3Gbps प्रति प्रक्रिया के बारे में प्राप्त कर सकता है, चाहे आप किस आकार या सेटिंग्स का उपयोग करें। S5CMD जैसी अन्य प्रणालियों में भी यही समस्या है। मैंने इस बारे में S3 टीम से बात की है और वे इसे देख रहे हैं।


धन्यवाद, अपने विन्यास के साथ 900 से अधिक + MiB / s प्राप्त करने में कामयाब, डिफ़ॉल्ट रूप से बड़ी गति।
कोज़ेयर

@ नाम: क्या एपीआई इतनी उच्च गति हस्तांतरण प्राप्त करने में हमें सीमित करता है? मैं 2 जीबी फ़ाइल ट्रांसफर करने के लिए एक T2 EC2 मशीन से AWS Java SDK बनाम CLI द्वारा प्रदान की गई ट्रांसफरमैनेजर एपी का उपयोग कर रहा हूं। समय का अंतर ~ 5.5 गुना (सीएलआई - 14 सेकंड) बनाम (एसडीके - 80 सेकंड) है। इसके अलावा, मैं एसडीके में s3.max_queue_size के लिए कोई विकल्प नहीं देख रहा हूं। कोई टिप्पणी?
द्वारपाल

@ डावरियर, ये दोनों सेटिंग्स सीएलआई के लिए हैं। एसडीके का उपयोग करते समय, आपको सभी अनुरोधों का प्रबंधन स्वयं करना होगा। AWS समर्थन का दावा है कि EC2 और S3 के बीच अधिकतम 80% संभव है जो लिनक्स का उपयोग कर रहा है (यानी विज्ञापित EC2 उदाहरण नेटवर्क थ्रूपुट)। विंडोज AWS पर द्वितीय श्रेणी का नागरिक है और अमेज़न द्वारा दिए गए टूल के साथ वह आधा भी नहीं पा सकता है, और ऐसा लगता है कि वे इसे ठीक करने की योजना नहीं बनाते हैं। :-( एक T2 मशीन के साथ, AWS यह निर्दिष्ट नहीं करता है कि आपको कितना बैंडविड्थ मिलता है, हालांकि अगर आप S3 VPC समापन बिंदु सेट करते हैं तो चीजें कुछ हद तक सुधर जाती हैं।
जेम्स

@ नाम मैं स्पार्क में क्लस्टर पर फ़ाइलों की अपनी सूची को समानांतर करने की सीमा तक गया, प्रत्येक विभाजन के भीतर समानांतरकरण के साथ संयोजन और फिर किसी भी फ़ाइल के लिए समानांतर अपलोड के लिए ट्रांसफ़ॉर्मर का उपयोग करना। मुझे ऐसा करने के बाद 80 से 45 सेकंड तक सुधार दिखाई देता है, लेकिन अभी भी ईसी 2 से सीएलआई को संभालने के तरीके से गायब है। धन्यवाद, हालांकि इस सेटअप के लिए। इसने खिड़कियों के प्रदर्शन में भी काफी सुधार किया। एसडीके में, हम अधिकतम कनेक्शन सेट कर सकते हैं लेकिन कतार आकार नहीं, इसलिए मुझे लगता है कि हमें इसके साथ छोड़ना पड़ सकता है। :) कतार का प्रबंधन करने के बारे में कोई संकेत, कोई भी नमूना कोड जिसे मैं आधार रेखा के रूप में ले सकता हूं।
5

2
S5Cmd ( github.com/peakgames/s5cmd ) AWS की सहायता है जो अधिकतम थ्रूपुट के लिए उपयोग किए जाने वाले लोगों का समर्थन करता है। इंस्टेंस का आकार बड़ा बदलाव करता है। नई c5n सीरीज़ नेटवर्किंग के लिए बहुत ही किफायती है और यह 100Gbps की अद्भुत क्षमता तक जाती है।
जेम्स

13

.NET उदाहरण अनुरोध के रूप में:

using (client)
{
    var existingObject = client.ListObjects(requestForExisingFile).S3Objects; 
    if (existingObject.Count == 1)
    {
        var requestCopyObject = new CopyObjectRequest()
        {
            SourceBucket = BucketNameProd,
            SourceKey = objectToMerge.Key,
            DestinationBucket = BucketNameDev,
            DestinationKey = newKey
        };
        client.CopyObject(requestCopyObject);
    }
}

क्लाइंट के साथ कुछ ऐसा है

var config = new AmazonS3Config { CommunicationProtocol = Protocol.HTTP, ServiceURL = "s3-eu-west-1.amazonaws.com" };
var client = AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretAccessKey, config);

एक बेहतर तरीका हो सकता है, लेकिन यह सिर्फ कुछ त्वरित कोड है जो मैंने कुछ फ़ाइलों को स्थानांतरित करने के लिए लिखा था।


1
यह एक अच्छा समाधान की तरह लगता है। लेकिन क्या होता है अगर आपके पास 2 बाल्टी के लिए अलग-अलग क्रेडेंशियल्स हैं?
रोई गैवरिल

2
क्रेडेंशियल्स प्रतिलिपि कमांड के निष्पादन के लिए हैं। उन एकल क्रेडेंशियल को स्रोत / लक्ष्य बकेट में उपयुक्त पढ़ने / लिखने की अनुमति की आवश्यकता होती है। खातों के बीच कॉपी करने के लिए, फिर आपको दूसरे खाते के क्रेडेंशियल्स से बाल्टी तक पहुंच की अनुमति देने के लिए एक बाल्टी नीति का उपयोग करने की आवश्यकता है।
मैट हाउसर

9

यदि आपके पास AWS के भीतर एक यूनिक्स होस्ट है, तो s3tools.org से s3cmd का उपयोग करें। अनुमतियाँ सेट करें ताकि आपकी कुंजी आपके विकास की बाल्टी तक पहुंच पढ़ सके। फिर भागो:

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname

सर्वर साइड? S3 के लिए कोई सर्वर साइड नहीं है। सभी आदेश दूरस्थ क्लाइंट से किए जाते हैं।
डी.के.

यह आदेश इंटरनेट पर ठीक काम करने लगता है, वैसे!
गेब कोपले

3
"सर्वर साइड" प्रश्न मान्य है। क्या s3cmd ट्रांसफर क्लाइंट के लिए सभी डेटा को अलग कर देता है, या यह S3 से S3 ट्रांसफर के लिए सीधा है? यदि पूर्व, बाहरी वैन हस्तांतरण से बचने के लिए एडब्ल्यूएस क्लाउड में इसे चलाना बेहतर होगा।
ब्रूस एज

1
प्रतिलिपि S3 पर सभी दूरस्थ रूप से होती है।
डी.के.

यह भी ध्यान दें कि यदि आप गलती से इस प्रक्रिया s3cmd cpको बाधित करते हैं --skip-existing, तो विकल्प को स्वीकार नहीं करते हैं , फिर भी आप s3cmd syncवर्तमान में स्किप करने के बजाय भाग सकते हैं
ianstarz

9

मेरे लिए निम्नलिखित कमांड बस काम किया:

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive

2
सरल और सीधे आगे समाधान ... क्यों इस तरह के सरल कार्य के लिए 3 पार्टी उपकरण या workarounds का उपयोग करें जब यह aws cli के साथ किया जा सकता है ?!
Fr0zenFyr

7

यहाँ इस प्रदर्शन के लिए एक रूबी वर्ग है: https://gist.github.com/4080793

उदाहरण का उपयोग:

$ gem install aws-sdk
$ irb -r ./bucket_sync_service.rb
> from_creds = {aws_access_key_id:"XXX",
                aws_secret_access_key:"YYY",
                bucket:"first-bucket"}
> to_creds = {aws_access_key_id:"ZZZ",
              aws_secret_access_key:"AAA",
              bucket:"first-bucket"}
> syncer = BucketSyncService.new(from_creds, to_creds)
> syncer.debug = true # log each object
> syncer.perform

5

वास्तव में हाल ही में जैसे ही मैंने AWS s3 इंटरफ़ेस में कॉपी + पेस्ट क्रिया का उपयोग किया। बस उन फ़ाइलों को नेविगेट करें जिन्हें आप कॉपी करना चाहते हैं, "एक्शन" पर क्लिक करें -> "कॉपी करें" फिर गंतव्य बकेट और "एक्शन" पर नेविगेट करें -> "पेस्ट"

यह फाइलों को बहुत तेजी से स्थानांतरित करता है और ऐसा लगता है कि यह कम जटिल समाधान है जिसमें किसी भी प्रोग्रामिंग की आवश्यकता नहीं है, या इस तरह के शीर्ष समाधान पर।


हाँ। मुझे कुछ मिनट पहले ही पता चला है। मैंने उत्थान किया, इसलिए अधिक लोग समय
बचाएंगे

मैंने कोशिश की कि बाल्टी पर बाल्टी में 134,364 ऑब्जेक्ट्स के साथ कॉपी करें। घंटों लग गए। और गंतव्य केवल 134,333 फाइलों के साथ समाप्त हुआ - प्रतिलिपि ने कहा कि यह "सफल" था, लेकिन लापता फाइलों के लिए कोई स्पष्टीकरण नहीं था।
Warrens

अन्य पदों में वर्णित "aws s3 सिंक" प्रकार कमांड का उपयोग करते हुए, सभी 134,364 वस्तुओं को लगभग 20 मिनट में कॉपी किया गया था।
Warrens

4

स्नोप्लो में हमारी ईटीएल नौकरियों के साथ हमारे पास यह सटीक समस्या थी , इसलिए हमने अपने समानांतर फ़ाइल-कॉपी कोड (रूबी, कोहरे के शीर्ष पर बनाया गया ), अपने स्वयं के रूबी मणि में निकाला , जिसे स्लुइस कहा जाता है:

https://github.com/snowplow/sluice

स्लुइस एस 3 फाइल डिलीट, मूव और डाउनलोड को भी हैंडल करता है; यदि कोई ऑपरेशन विफल हो जाता है (जो यह आश्चर्यजनक रूप से अक्सर होता है) तो सभी समानांतर और स्वचालित री-ट्राई के साथ। मुझे आशा है कि यह उपयोगी है!


1

मुझे पता है कि यह एक पुराना धागा है लेकिन दूसरों के लिए जो मेरा सुझाव है कि उत्पादन की बाल्टी से विकास की सामग्री की नकल करने के लिए एक निर्धारित काम बनाना है।

आप उपयोग कर सकते हैं। यदि आप .NET का उपयोग करते हैं तो यह लेख आपकी मदद कर सकता है

https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.