AWS S3 দুটি বালতির মধ্যে ফাইল এবং ফোল্ডারগুলি অনুলিপি করে


112

স্থানীয় ফাইল সিস্টেমে কন্টেন্টটি প্রথমে ডাউনলোড না করেই আমাকে একটি এডাব্লুএস এস 3 বালতির কন্টেন্টটিকে দ্বিতীয় এডাব্লু এস এস বালতিতে অনুলিপি করতে সহায়তা করার জন্য আমি একটি সরঞ্জামের সন্ধান করছি।

আমি AWS S3 কনসোল অনুলিপি বিকল্পটি ব্যবহার করার চেষ্টা করেছি কিন্তু এর ফলে কিছু নেস্টেড ফাইলগুলি অনুপস্থিত রয়েছে।

আমি ট্রান্সমিট অ্যাপ্লিকেশনটি (আতঙ্কের দ্বারা) ব্যবহার করার চেষ্টা করেছি। সদৃশ কমান্ড ফাইলগুলি প্রথমে স্থানীয় সিস্টেমে ডাউনলোড করে তারপরে সেগুলি আবার দ্বিতীয় বালতিতে আপলোড করে, যা বেশ কার্যকর।


ক্রমবর্ধমান আপনার সমবর্তী অনুরোধ গণনা বিবেচনা করুন aws configure set default.s3.max_concurrent_requests 200 আরো বিস্তারিত জানার এবং বিকল্পের জন্য এই পোস্ট দেখতে stackoverflow.com/questions/4663016/...
Balmipour

উত্তর:


175

এস 3 বালতিগুলির মধ্যে অনুলিপি করুন

অ্যাডাব্লুএস (সম্প্রতি সম্প্রতি) বালতিগুলির মধ্যে অনুলিপি করার জন্য একটি কমান্ড লাইন ইন্টারফেস প্রকাশ করেছে।

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

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

এটি একটি লক্ষ্য বালতি থেকে অন্য বালতিতে অনুলিপি করবে

ডকুমেন্টেশন এখানে দেখুন: এস 3 সি এল এল ডকুমেন্টেশন


এটি ইসি 2 থেকে চালান এবং প্রায় 5 এস মধ্যে 80 এমবি অনুলিপি পেয়েছিলেন।
স্টিউ-অউ

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.
ফেলেছে

@ জিওভান্নি বিটলিনার আপনি যে বালতি নামটি ব্যবহার করছেন তা ভুল। আপনি হয় ভুল উপসর্গ ব্যবহার করছেন, বা বালতি উল্লেখ করার পুরানো উপায় ব্যবহার করছেন। আপনার অ্যাডমিন কনসোলে ঠিক আপনার বালতির নাম পরীক্ষা করুন।
লেকে

8
নোট করুন যদি এটি প্রথমবারের মতো ক্লাইপ সরঞ্জামটি ব্যবহার করে আপনাকে 'আওস কনফিগার' চালাতে হবে এবং আপনার শংসাপত্রগুলি প্রবেশ করতে হবে
এস ..

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

আপনি এখন এটি এস 3 অ্যাডমিন ইন্টারফেস থেকে করতে পারেন। কেবল একটি বালতিতে যান আপনার সমস্ত ফোল্ডার নির্বাচন করুন actions->copy। তারপরে আপনার নতুন বালতিতে সরান actions->paste


4
অসাধারণ! তিনি ওয়েব ইন্টারফেসের কথা উল্লেখ করছেন। অন্যান্য বেশিরভাগের থেকে পৃথক, আমি এটি কোনও আইপ্যাড থেকে করতে পারি।
জ্যাকব ফোশি

2
এটি এলোমেলোভাবে সাবফোল্ডারগুলিতে নেস্টেড বস্তুগুলি ফেলে দেয় - 3 বছর পরে এবং এডাব্লুএস এখনও এই ধরণের বেসিক বাগটি ঠিক করতে পারে না!
রানলুপ

এটি একই অঞ্চল বা সকলের জন্য?
হকিকো

1
এই বিষয়গুলি আমাজন দ্বারা কোথাও নথিভুক্ত করা হয়েছে? @ রুনলুপ
ডেভেটপ্লে

1
@ দুদকভেভ আমি জানি না এবং কমান্ড লাইনের মাধ্যমে অনুলিপিটি পুরোপুরি কার্যকরভাবে কাজ করার বিষয়ে অবলম্বন করায় বেশিক্ষণে আবার পরীক্ষাও করিনি।
রানওলুপ

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})

আরও বিশদ: আউস-এস 3 রত্ন ব্যবহার করে বালতি জুড়ে কীভাবে ফাইল অনুলিপি করবেন


সার্ভারগুলি জুড়ে কীভাবে অনুলিপি করবেন তা দেখানোর জন্য ধন্যবাদ। আমি আমাদের সার্ভার থেকে সিঙ্গাপুরের সার্ভারে অনুলিপি করার চেষ্টা করছি।
আর্কিলে

@ আরকোলয়ে এখন এডাব্লুএস সিঙ্গাপুরে কীভাবে বিলম্ব হচ্ছে? এক বছর আগে এটি ধীর এবং বেমানান ছিল।
আনাতোলি

7

বিভিন্ন অঞ্চলে বালতিগুলির মধ্যে অনুলিপি করুন

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

উপরের কমান্ডটি ইউরোপের বালতি থেকে একটি ফাইল (ইউরোপীয়-পশ্চিম -১) জাপানে (এপি-উত্তর-পূর্ব -১) অনুলিপি করেছে। আপনি এই কমান্ডটি দিয়ে আপনার বালতির অঞ্চলের কোডের নাম পেতে পারেন:

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

যাইহোক, এস 3 ওয়েব কনসোলে অনুলিপি এবং আটকানো ব্যবহার করা সহজ তবে মনে হয় উত্স বালতি থেকে ব্রাউজারে ডাউনলোড করুন এবং তারপরে গন্তব্য বালতিতে আপলোড করুন। "Aws s3" ব্যবহার করা আমার পক্ষে অনেক দ্রুত ছিল।


6

আমি এস 3 এস 3 এমিরর সরঞ্জামটির কার্যকর করতে সক্ষম একটি ডকার তৈরি করেছি । AWS S3 বালতি থেকে অন্যটিতে অনুলিপি এবং মিরর করার একটি ইউটিলিটি।

এটি সমান্তরাল কপি এবং খুব স্মৃতিশক্তির দক্ষতার সাথে থ্রেডযুক্ত, এটি সফল হয় যেখানে এস 3 সেমিডি সম্পূর্ণরূপে ব্যর্থ হয়।

ব্যবহার:

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

রাইটএউজ রত্নের এস 3 ইন্টারফেসের একটি অনুলিপি ফাংশন রয়েছে যা উপরেরটি করে।

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


5

আমি ভেবেছিলাম আপনি এখনই সম্ভবত একটি ভাল সমাধান খুঁজে পেয়েছেন, তবে অন্য যারা এই সমস্যাটির মুখোমুখি হয়েছেন (যেমন আমি সম্প্রতি ছিলাম), আমি একটি সাধারণ ইউটিলিটি বিশেষত একটি এস 3 বালতি অন্যকে মিরর করার উদ্দেশ্যে তৈরি করেছি in একটি অত্যন্ত সমবর্তী, তবুও সিপিইউ এবং মেমরি দক্ষ পদ্ধতি।

এটি এখানে অ্যাপাচি লাইসেন্সের অধীনে গিথুবে রয়েছে: https://github.com/cobbzilla/s3s3mirror

আপনার কাছে যখন খুব বড় বালতি রয়েছে এবং সর্বাধিক পারফরম্যান্সের সন্ধান করছেন তখন এটি চেষ্টা করার মতো হতে পারে।

যদি আপনি এটি চেষ্টা করার সিদ্ধান্ত নেন তবে আপনার কোনও প্রতিক্রিয়া থাকলে দয়া করে আমাকে জানান।


এস 3 এস 3 এমিরর দিয়ে আমার দুর্দান্ত অভিজ্ঞতা ছিল। আমি এটি এম 1.সামান্য ইসি 2 নোডে সেট আপ করতে এবং প্রায় 2 ঘন্টার মধ্যে 1.5 মিলিয়ন অবজেক্টগুলি অনুলিপি করতে সক্ষম হয়েছি। মাভেন এবং জাভার সাথে আমার অপরিচিততার কারণে সেটআপটি কিছুটা শক্ত ছিল, তবে সব কিছু ইনস্টল করতে কেবল উবুন্টুতে কয়েকটি অ্যাপ-গেট কমান্ড লাগল took একটি সর্বশেষ নোট: যদি (আমার মতো) আপনি যদি একটি বড়, গুরুত্বপূর্ণ এস 3 বালতিতে অজানা স্ক্রিপ্ট চালানোর বিষয়ে উদ্বিগ্ন হন তবে অনুলিপিটি কপিরাইট থেকে বালিতে কেবল পাঠযোগ্য অ্যাক্সেস সহ একটি বিশেষ ব্যবহারকারী তৈরি করুন এবং সেই শংসাপত্রগুলি ব্যবহার করুন। দুর্ঘটনা মোছার জিরো সুযোগ।
মিকাহ

4

আপনি যদি শেল হয়ে থাকেন এবং একাধিক ফাইলগুলি অনুলিপি করতে চান তবে সমস্ত ফাইল নয়: s3cmd সিপি - রেকর্ডিং এস 3: // বুকেট 1 / ওবিজেইসিটি 1 এস: // বুকেট 2 [/ ওবিজেসিটি 2]


3

আমি একটি স্ক্রিপ্ট লিখেছিলাম যা একটি এস 3 বালতি ব্যাক আপ করে: 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"

এটি জাভাস্ক্রিপ্ট নয়, দুঃখিত ... (হ্যাঁ, আমি coffeescript সম্পর্কে অবগত এবং আপনি এটি ব্যবহার করতে পারেন, এখনও, জাভাস্ক্রিপ্ট নয়)
ভিক্টর শ্রডার

1

আমাকে জানানো হয়েছিল যে আপনি ইএমআর ক্লাস্টারে s3distcp ব্যবহার করে এটিও করতে পারেন। এটি বড় ফাইলযুক্ত ডেটার জন্য দ্রুত হওয়ার কথা। এটি ডেটাগুলির ছোট সেটগুলিতে যথেষ্ট ভাল কাজ করে - তবে আমি এত অল্প ডেটা স্থাপন করতে শেখার বক্ররেখাকে গ্রহণ করার পরে অন্য একটি সমাধান পছন্দ করতাম (আমি এর আগে কখনও ইএমআরের সাথে কাজ করি নি)।

এখানে ডেস্কটপ AWS ডকুমেন্টেশন থেকে একটি লিঙ্ক আছে: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

আপডেট: একই ডেটা সেট করার জন্য, এস 3 এস 3 এমিররটি এস 3 ডিস্টিপপি বা এডাব্লুএস ক্লাইমের চেয়ে অনেক দ্রুত ছিল। সেট আপ করাও অনেক সহজ।


1

লোকালকে ডাউনলোড না করেই একটি এস 3 বালতি থেকে একই বা অন্য এস 3 বালতিতে অনুলিপি করা, এটি খুব সহজ। নীচের শেল কমান্ড ব্যবহার করুন।

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

এটি বালতিটির SourceFoldernameফোল্ডারটিকে লক্ষ্য করে উত্স বালতির ফোল্ডার থেকে সমস্ত ফাইল অনুলিপি করবে TargetFoldername। উপরের কোড, দয়া করে প্রতিস্থাপন AccessKey, SecurityKeyএবং ExternalBucketআপনার সংশ্লিষ্ট মান।



1

এডাব্লুএস ক্লিপ https://aws.amazon.com/cli/ থেকে আপনি করতে পারেন

aws s3 ls - এটি সমস্ত এস 3 বালতি তালিকাবদ্ধ করবে

aws cp --recursive s3://<source bucket> s3://<destination bucket> - এটি ফাইলগুলি এক বালতি থেকে অন্য বালিতে অনুলিপি করবে

দ্রষ্টব্য * উপরের কাজটি করে ক্রস অঞ্চল প্রতিলিপি বালতি তৈরি করার সময় খুব দরকারী, আপনার ফাইলগুলি সমস্ত ট্র্যাক করা হয়েছে এবং উত্স অঞ্চল ফাইলের একটি আপডেট প্রতিলিপি বালতিতে প্রচার করা হবে। ফাইল মুছে ফেলা বাদে সমস্ত কিছু সিঙ্ক হয়েছে।

সিআরআরের জন্য নিশ্চিত করুন যে আপনি বালতিতে সংস্করণ সক্ষম করেছেন।


0

aws s3 syncক্লাইম কমান্ড সম্পর্কে । এউএস এস 3 সিঙ্ক সি 3: // বালতি 1 / এস 3: // বালতি 2 /


0

যেমনটি নীল ভাত এই ব্লগে ব্যাখ্যা করেছেন , এই উদ্দেশ্যে ব্যবহার করা যেতে পারে এমন অনেকগুলি আলাদা সরঞ্জাম রয়েছে। কিছু AWS সরবরাহ করা হয়, যেখানে বেশিরভাগ তৃতীয় পক্ষের সরঞ্জাম। এই সমস্ত সরঞ্জামগুলির জন্য আপনার নিজের AWS অ্যাকাউন্ট কীটি এবং সরঞ্জামটিতেই গোপনীয়তা সংরক্ষণ করা দরকার। তৃতীয় পক্ষের সরঞ্জামগুলি ব্যবহার করার সময় খুব সতর্ক থাকুন, আপনি যে শংসাপত্রগুলি সংরক্ষণ করেন সেগুলি আপনার মূল্য, আপনার পুরো মূল্য এবং আপনার মরে যেতে পারে।

অতএব, আমি সবসময় এই উদ্দেশ্যে AWS CLI ব্যবহার করার পরামর্শ দিই । আপনি এই লিঙ্কটি থেকে সহজেই এটি ইনস্টল করতে পারেন । এরপরে, নিম্নলিখিত কমান্ডটি চালনা করুন এবং আপনার কী, গোপনীয় মানগুলি এডাব্লুএস সি এল এলিতে সংরক্ষণ করুন।

aws configure

এবং আপনার স্থানীয় মেশিনে আপনার AWS S3 বালতি সিঙ্ক করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন। (স্থানীয় মেশিনে AWS CLI ইনস্টল করা উচিত)

aws s3 sync <source> <destination>

উদাহরণ:

1) স্থানীয় স্টোরেজ থেকে এডাব্লুএস এস 3 এর জন্য

aws s3 sync <S3Uri> <LocalPath>

2) লোকাল স্টোরেজ থেকে এডাব্লুএস এস 3 এ

aws s3 sync <LocalPath> <S3Uri>

3) এডাব্লুএস এস 3 বালতি থেকে অন্য বালতিতে

aws s3 sync <S3Uri> <S3Uri> 

0

এস 3 বালতি অনুলিপি করার সর্বোত্তম উপায় হ'ল এডাব্লুএস সি এল আই

এটি এই 3 টি পদক্ষেপ জড়িত:

  1. আপনার সার্ভারে AWS CLI ইনস্টল করা হচ্ছে।
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. আপনি যদি দুটি এডাব্লুএস অ্যাকাউন্টের মধ্যে বালতিগুলি অনুলিপি করছেন তবে আপনাকে প্রতিটি বালতিতে সঠিক নীতি যুক্ত করতে হবে।

  2. এর পরে এই কমান্ডটি একটি বালতি থেকে অন্য বালিতে অনুলিপি করতে ব্যবহার করুন।

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

পদক্ষেপ 2 এবং 3 ধাপের বিশদটি এই লিঙ্কটিতে দেওয়া হয়েছে:

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


0

আপনি একটি জাভা অ্যাপ্লিকেশন লিখতে পারেন - এমনকি এমন একটি জিইউআই সুইং অ্যাপ্লিকেশন যা AWS জাভা এপিআই ব্যবহার করে বস্তুগুলি অনুলিপি করতে দেখুন -

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.