AWS S3 दो बाल्टी के बीच फाइलों और फ़ोल्डरों की नकल करता है


112

मैं एक टूल की तलाश में हूं, जो मुझे AWS S3 बाल्टी की सामग्री को दूसरे AWS S3 बाल्टी में कॉपी करने में मदद करने के लिए पहले बिना स्थानीय फ़ाइल सिस्टम में सामग्री डाउनलोड किए।

मैंने एडब्ल्यूएस एस 3 कंसोल कॉपी विकल्प का उपयोग करने की कोशिश की है, लेकिन इसके परिणामस्वरूप कुछ नेस्टेड फाइलें गायब हैं।

मैंने Transmit ऐप (पैनिक द्वारा) का उपयोग करने की कोशिश की है। डुप्लिकेट कमांड पहले फ़ाइलों को स्थानीय सिस्टम में डाउनलोड करता है और फिर उन्हें दूसरी बाल्टी में अपलोड करता है, जो काफी अक्षम है।


अपने समवर्ती अनुरोध को बढ़ाने पर विचार करें aws configure set default.s3.max_concurrent_requests 200 अधिक जानकारी और विकल्पों के लिए इस पोस्ट को देखें stackoverflow.com/questions/4663016/…
Balmipour

जवाबों:


176

S3 बाल्टी के बीच कॉपी करें

AWS (अभी हाल ही में) ने बाल्टी के बीच नकल के लिए एक कमांड लाइन इंटरफ़ेस जारी किया।

http://aws.amazon.com/cli/

$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..

यह एक टारगेट बकेट से दूसरी बकेट में कॉपी हो जाएगा

यहाँ प्रलेखन देखें: S3 CLI प्रलेखन


EC2 से इसे दौड़ाया और लगभग 5s में 80MB कॉपी किया।
स्टू-औ

1
वास्तव में मुझे क्या चाहिए था, क्योंकि aws-sdk मणि में एक बार में एक पूरी बाल्टी को कॉपी करने या सिंक करने की कोई सुविधा नहीं है। धन्यवाद!
अप्रीलिटी

यह निम्न त्रुटि फेंकता हैA client error (PermanentRedirect) occurred when calling the ListObjects operation: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
Giovanni Bitliner

@GOVanniBitliner आपके द्वारा उपयोग की जा रही बाल्टी का नाम गलत है। आप या तो गलत उपसर्ग का उपयोग कर रहे हैं, या बाल्टी के संदर्भ में पुराने तरीके का उपयोग कर रहे हैं। अपने व्यवस्थापक कंसोल में अपने बकेट का नाम ठीक से जांचें।
Layke

8
ध्यान दें कि यदि यह आपके द्वारा पहली बार cli टूल का उपयोग करने की आवश्यकता है, तो आपको 'aws कॉन्फ़िगर' चलाने और अपने क्रेडेंशियल दर्ज करने की आवश्यकता है
S ..

41

Aws-sdk रत्न का उपयोग करके एक सरल उदाहरण:

AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')

यदि आप विभिन्न बाल्टियों के बीच प्रतिलिपि बनाना चाहते हैं, तो लक्ष्य बकेट नाम निर्दिष्ट करें:

s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')

41

अब आप इसे S3 व्यवस्थापक इंटरफ़ेस से कर सकते हैं। बस एक बाल्टी में जाओ अपने सभी फ़ोल्डर्स का चयन करें actions->copy। फिर अपनी नई बाल्टी में कदम रखें actions->paste


4
बहुत बढ़िया! वह वेब इंटरफेस की बात कर रहा है। अन्य लोगों के विपरीत, मैं एक iPad से ऐसा कर सकता था।
जैकब फोशी ने

2
यह बेतरतीब ढंग से सबफ़ोल्डर्स में नेस्टेड ऑब्जेक्ट्स को छोड़ देता है - 3 साल बाद और AWS अभी भी इस तरह के बेसिक बग को ठीक नहीं कर सकता है!
रनऑलॉप

क्या यह समान क्षेत्रों या सभी के लिए है?
हकीको

1
क्या ये मुद्दे अमेज़न द्वारा कहीं भी प्रलेखित हैं? @RunLoop
davetapley

1
@dukedave मुझे नहीं पता है और काफी समय से दोबारा परीक्षण नहीं किया है क्योंकि मैंने कमांड लाइन के माध्यम से कॉपी करने का सहारा लिया है क्योंकि यह पूरी तरह से काम करता है।
रनऑल

8

यह हाल ही में aws-sdk मणि के साथ संभव है , कोड नमूना देखें:

require 'aws-sdk'

AWS.config(
  :access_key_id     => '***',
  :secret_access_key => '***',
  :max_retries       => 10
)

file     = 'test_file.rb'
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'}
bucket_1 = {:name => 'bucket_to',   :endpoint => 's3.amazonaws.com'}

s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint])
bucket_from       = s3_interface_from.buckets[bucket_0[:name]]
bucket_from.objects[file].write(open(file))

s3_interface_to   = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint])
bucket_to         = s3_interface_to.buckets[bucket_1[:name]]
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from})

अधिक विवरण: aws-s3 मणि का उपयोग करके बाल्टी भर में फ़ाइल की प्रतिलिपि कैसे करें


सर्वर पर कॉपी करने का तरीका दिखाने के लिए धन्यवाद। मैं हमें सिंगापूर सर्वर से सर्वर से कॉपी करने की कोशिश कर रहा हूं।
आर्कोलाई

@Arcolye अब AWS सिंगापुर में विलंबता कैसे है? यह एक साल पहले धीमा और असंगत था।
अनातोली

7

विभिन्न क्षेत्रों में बाल्टियों के बीच की नकल

$ aws s3 cp s3://src_bucket/file  s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1

उपरोक्त कमांड यूरोप (यूरोप-पश्चिम -1) में एक बाल्टी से जापान (एपी-पूर्वोत्तर -1) की एक फ़ाइल की प्रतिलिपि बनाता है। आप इस आदेश के साथ अपने बाल्टी क्षेत्र के लिए कोड नाम प्राप्त कर सकते हैं:

$ aws s3api get-bucket-location --bucket my_bucket

वैसे, एस 3 वेब कंसोल में कॉपी और पेस्ट का उपयोग करना आसान है, लेकिन यह स्रोत बाल्टी से ब्राउज़र में डाउनलोड करने के लिए लगता है, और फिर गंतव्य बाल्टी पर अपलोड करें। "Aws s3" का उपयोग करना मेरे लिए बहुत तेज़ था।


6

मैंने s3s3mirror का डॉकियर निष्पादन योग्य बनाया है टूल । AWS S3 बाल्टी से दूसरे में कॉपी और मिरर करने की उपयोगिता।

यह समानांतर COPY और बहुत स्मृति कुशल की अनुमति देता है, यह सफल होता है जहां s3cmd पूरी तरह से विफल रहता है।

उपयोग:

docker run -e AWS_ACCESS_KEY_ID=FOO -e AWS_SECRET_ACCESS_KEY=BAR pmoust/s3s3mirror [OPTIONS] source_bucket[/prefix] dest_bucket[/prefix]

विकल्पों की पूरी सूची के लिए प्रयास करें:

docker run pmoust/s3s3mirror 

5

नीचे दिए गए प्रलेखन की जाँच करें। मुझे लगता है कि तुम क्या देख रहे हो। http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html

राइटअव्स जेम के S3Interface में एक कॉपी फंक्शन है जो ऊपर करता है।

http://rubydoc.info/gems/right_aws/3.0.0/RightAws/S3Interface#copy-instance_method


5

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

यह एक अपाचे लाइसेंस के तहत github पर है: https://github.com/cobbzilla/s3s3mirror

जब आपके पास एक बहुत बड़ी बाल्टी होती है और अधिकतम प्रदर्शन की तलाश होती है, तो यह कोशिश करने लायक हो सकती है।

यदि आप इसे एक कोशिश देने का फैसला करते हैं तो कृपया मुझे बताएं कि क्या आपके पास कोई प्रतिक्रिया है।


मुझे s3s3mirror के साथ एक अच्छा अनुभव था। मैं इसे m1.small EC2 नोड पर सेट करने और लगभग 2 घंटे में 1.5 मिलियन ऑब्जेक्ट कॉपी करने में सक्षम था। मावेन और जावा के साथ मेरी अपरिचितता के कारण सेटअप थोड़ा कठिन था, लेकिन यह सब कुछ स्थापित करने के लिए केवल उबंटू पर कुछ उपयुक्त आदेश प्राप्त कर लेता है। एक अंतिम नोट: यदि (मेरी तरह) आप एक बड़ी, महत्वपूर्ण s3 बाल्टी पर एक अज्ञात स्क्रिप्ट चलाने के बारे में चिंतित हैं, तो एक विशेष उपयोगकर्ता बनाएं, जो केवल कॉपी-टू-बाल्टी पर पहुंच के साथ-साथ उन क्रेडेंशियल्स का उपयोग करें। आकस्मिक विलोपन का शून्य मौका।
मीका

4

यदि आप शेल में हैं और कई फाइलों को कॉपी करना चाहते हैं, लेकिन सभी फाइलों को नहीं: s3cmd cp --recursive s3: // BUCKET1 / OBJECT1 s3: // BUCKET2 [/ OBJET2]


3

मैंने एक स्क्रिप्ट लिखी है जो एक S3 बाल्टी का बैक अप देती है: https://github.com/roseperrone/aws-backup-rake-task

#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time

def main():
    s3_ID = sys.argv[1]
    s3_key = sys.argv[2]
    src_bucket_name = sys.argv[3]
    num_backup_buckets = sys.argv[4]
    connection = S3Connection(s3_ID, s3_key)
    delete_oldest_backup_buckets(connection, num_backup_buckets)
    backup(connection, src_bucket_name)

def delete_oldest_backup_buckets(connection, num_backup_buckets):
    """Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
    buckets = connection.get_all_buckets() # returns a list of bucket objects
    num_buckets = len(buckets)

    backup_bucket_names = []
    for bucket in buckets:
        if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
            backup_bucket_names.append(bucket.name)

    backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())

    # The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
    delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
    if delete <= 0:
        return

    for i in range(0, delete):
        print 'Deleting the backup bucket, ' + backup_bucket_names[i]
        connection.delete_bucket(backup_bucket_names[i])

def backup(connection, src_bucket_name):
    now = datetime.datetime.now()
    # the month and day must be zero-filled
    new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
    print "Creating new bucket " + new_backup_bucket_name
    new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
    copy_bucket(src_bucket_name, new_backup_bucket_name, connection)


def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
    src_bucket = connection.get_bucket(src_bucket_name);
    dst_bucket = connection.get_bucket(dst_bucket_name);

    result_marker = ''
    while True:
        keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)

        for k in keys:
            print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name

            t0 = time.clock()
            dst_bucket.copy_key(k.key, src_bucket_name, k.key)
            print time.clock() - t0, ' seconds'

        if len(keys) < maximum_keys:
            print 'Done backing up.'
            break

        result_marker = keys[maximum_keys - 1].key

if  __name__ =='__main__':main()

मैं इसे एक रेक कार्य में उपयोग करता हूं (रेल एप्लिकेशन के लिए):

desc "Back up a file onto S3"
task :backup do
     S3ID = "AKIAJM3NRWC7STXWUWVQ"
     S3KEY = "0A5kuzV+E1dkaPjZxHQAezz1GlSddJd0iS5sNpry"
     SRCBUCKET = "primary-mzgd"
     NUM_BACKUP_BUCKETS = 2

     Dir.chdir("#{Rails.root}/lib/tasks")
     system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end

1

मैंने सुना है कि अगर आप जावास्क्रिप्ट में हैं, तो उसके लिए एक नोड मॉड्यूल है: पी

से नॉक्स कॉपी डॉक्स:

knoxCopy = require 'knox-copy'

client = knoxCopy.createClient
  key: '<api-key-here>'
  secret: '<secret-here>'
  bucket: 'backups'

client.copyBucket
  fromBucket: 'uploads'
  fromPrefix: '/nom-nom'
  toPrefix: "/upload_backups/#{new Date().toISOString()}"
  (err, count) ->
     console.log "Copied #{count} files"

यह जावास्क्रिप्ट नहीं है, क्षमा करें ... (हाँ, मैं कॉफ़ीस्क्रिप्ट से अवगत हूं और आप इसका उपयोग कर सकते हैं, फिर भी, जावास्क्रिप्ट नहीं)
विक्टर श्रोडर

1

मुझे बताया गया कि आप EM3 क्लस्टर पर s3distcp का उपयोग करके भी ऐसा कर सकते हैं। बड़ी फ़ाइलों वाली डेटा के लिए इसे तेज़ माना जाता है। यह डेटा के छोटे सेट पर काफी अच्छी तरह से काम करता है - लेकिन मैंने सीखने के कर्व को देखते हुए एक और समाधान पसंद किया होगा जो इतने कम डेटा के लिए सेट किया गया हो (मैंने पहले कभी EMR के साथ काम नहीं किया है)।

यहां AWS डॉक्यूमेंटेशन से एक लिंक दिया गया है: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

अपडेट: समान डेटा सेट के लिए, s3s3mirror s3distcp या AWS cli की तुलना में बहुत तेज था। सेट अप करने के लिए बहुत आसान है।


1

एक S3 बाल्टी से एक ही या दूसरे S3 बाल्टी को स्थानीय डाउनलोड किए बिना कॉपी करने के लिए, इसके बहुत सरल। नीचे के शेल कमांड का उपयोग करें।

hdfs dfs -cp -f "s3://AccessKey:SecurityKey@ExternalBucket/SourceFoldername/*.*" "s3://AccessKey:SecurityKey@ExternalBucket/TargetFoldername"

यह बाल्टी के SourceFoldernameफ़ोल्डर को लक्षित करने के लिए स्रोत बाल्टी के फ़ोल्डर से सभी फ़ाइलों को कॉपी करेगा TargetFoldername। उपरोक्त कोड में, कृपया की जगह AccessKey, SecurityKeyऔर ExternalBucketअपने इसी मूल्यों के साथ।


क्या है hdfs?
एंथनी काँग

1

AWS cli https://aws.amazon.com/cli/ से आप कर सकते हैं

aws s3 ls - यह सभी S3 बाल्टी को सूचीबद्ध करेगा

aws cp --recursive s3://<source bucket> s3://<destination bucket> - यह फाइलों को एक बाल्टी से दूसरी में कॉपी करेगा

नोट * क्रॉस क्षेत्र प्रतिकृति बाल्टी बनाते समय बहुत उपयोगी है, उपरोक्त कार्य करके, आप सभी फ़ाइलों को ट्रैक कर रहे हैं और स्रोत क्षेत्र फ़ाइल के लिए एक अद्यतन प्रतिकृति बाल्टी में प्रचारित किया जाएगा। सब कुछ लेकिन फ़ाइल विलोपन समन्‍वयित हैं।

CRR के लिए सुनिश्चित करें कि आपके पास बाल्टियों पर सक्षम संस्करण है।


0

कैसे aws s3 syncक्ली कमांड के बारे में aws s3 सिंक s3: // bucket1 / s3: // bucket2 /


0

जैसा कि नील भगत ने इस ब्लॉग में समझाया है , कई अलग-अलग उपकरण हैं जिनका उपयोग इस उद्देश्य के लिए किया जा सकता है। कुछ एडब्ल्यूएस प्रदान किए गए हैं, जहां अधिकांश तीसरे पक्ष के उपकरण हैं। इन सभी टूल के लिए आपको टूल में ही अपने AWS अकाउंट की और सीक्रेट को सेव करना होगा। तीसरे पक्ष के उपकरण का उपयोग करते समय बहुत सतर्क रहें, क्योंकि आपके द्वारा बचाए गए क्रेडेंशियल आपको खर्च कर सकते हैं, आपकी पूरी कीमत और आपको मृत कर सकते हैं।

इसलिए, मैं हमेशा इस उद्देश्य के लिए AWS CLI का उपयोग करने की सलाह देता हूं । आप बस इस लिंक से इसे स्थापित कर सकते हैं । इसके बाद, निम्न कमांड चलाएँ और अपनी कुंजी, गुप्त मानों को AWS CLI में सहेजें।

aws configure

और अपने स्थानीय मशीन में अपने एडब्ल्यूएस एस 3 बाल्टी को सिंक करने के लिए निम्न कमांड का उपयोग करें। (स्थानीय मशीन में AWS CLI स्थापित होना चाहिए)

aws s3 sync <source> <destination>

उदाहरण:

1) स्थानीय भंडारण के लिए AWS S3 के लिए

aws s3 sync <S3Uri> <LocalPath>

2) स्थानीय भंडारण से लेकर एडब्ल्यूएस एस 3 तक

aws s3 sync <LocalPath> <S3Uri>

3) AWS s3 बाल्टी से दूसरी बाल्टी तक

aws s3 sync <S3Uri> <S3Uri> 

0

S3 बाल्टी को कॉपी करने का सबसे अच्छा तरीका AWS CLI है

इसमें ये 3 चरण शामिल हैं:

  1. अपने सर्वर पर AWS CLI इंस्टॉल करना।
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. यदि आप दो AWS खातों के बीच बाल्टी की नकल कर रहे हैं, तो आपको प्रत्येक बाल्टी के साथ सही नीति संलग्न करनी होगी।

  2. इसके बाद एक बाल्टी से दूसरी बाल्टी में कॉपी करने के लिए इस कमांड का उपयोग करें।

aws s3 sync s3://sourcebucket s3://destinationbucket

चरण 2 और चरण 3 का विवरण इस लिंक में दिया गया है:

https://aws.amazon.com/premiumsupport/knowledge-center/account-transfer-s3/


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