AWS S3 menyalin file dan folder antara dua bucket

112

Saya telah mencari alat untuk membantu saya menyalin konten dari bucket AWS S3 ke dalam bucket AWS S3 kedua tanpa mengunduh konten terlebih dahulu ke sistem file lokal.

Saya telah mencoba menggunakan opsi salinan konsol AWS S3 tetapi itu mengakibatkan beberapa file bersarang hilang.

Saya telah mencoba menggunakan aplikasi Transmit (oleh Panic). Perintah duplikat mengunduh file terlebih dahulu ke sistem lokal kemudian mengunggahnya kembali ke keranjang kedua, yang cukup tidak efisien.

cnicolaou.dll
sumber
Pertimbangkan untuk meningkatkan jumlah permintaan serentak Anda aws configure set default.s3.max_concurrent_requests 200 Lihat posting ini untuk detail dan opsi lebih lanjut stackoverflow.com/questions/4663016/…
Balmipour

Jawaban:

175

Salin antara S3 Bucket

AWS (baru-baru ini) merilis antarmuka baris perintah untuk menyalin antar bucket.

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

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

Ini akan menyalin dari satu keranjang target ke keranjang lain.

Lihat dokumentasi di sini: Dokumentasi CLI S3

Layke
sumber
Jalankan dari EC2 dan 80MB disalin dalam waktu sekitar 5 detik.
Stew-au
1
Persis yang saya butuhkan, karena permata aws-sdk tidak memiliki fitur untuk menyalin atau menyinkronkan seluruh keranjang sekaligus. Terima kasih!
odigity
Ini melempar kesalahan berikutA 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
@GiovanniBitliner Nama bucket yang Anda gunakan salah. Anda menggunakan awalan yang salah, atau menggunakan cara lama untuk merujuk ke keranjang. Periksa nama keranjang Anda persis di konsol admin Anda.
Layke
8
Perhatikan jika ini adalah pertama kalinya Anda menggunakan alat cli, Anda perlu menjalankan 'aws configure' dan masukkan kredibilitas Anda
S ..
41

Contoh sederhana menggunakan permata 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')

Jika Anda ingin melakukan penyalinan di antara keranjang yang berbeda, tentukan nama keranjang target:

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

Anda sekarang dapat melakukannya dari antarmuka admin S3. Cukup masuk ke satu ember pilih semua folder Anda actions->copy. Kemudian pindah ke keranjang baru Anda actions->paste.

KDEx
sumber
4
Hebat! Dia mengacu pada antarmuka web. Tidak seperti kebanyakan yang lain, saya dapat melakukan ini dari iPad.
Jacob Foshee
2
Ini secara acak meninggalkan objek bersarang di subfolder - 3 tahun kemudian dan AWS masih tidak dapat memperbaiki bug dasar seperti itu!
RunLoop
apakah ini untuk wilayah yang sama atau semua?
hakiko
1
Apakah masalah ini didokumentasikan di mana saja oleh Amazon? @RunLoop
davin
1
@dukedave Saya tidak tahu dan belum menguji lagi dalam beberapa waktu karena saya terpaksa melakukan penyalinan melalui baris perintah karena itu bekerja dengan sempurna.
RunLoop
8

Mungkin saja dengan permata aws-sdk terbaru , lihat contoh kode:

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

detail lebih lanjut: Cara menyalin file di seluruh ember menggunakan permata aws-s3

Anatoly
sumber
Terima kasih telah menunjukkan cara menyalin di seluruh server. Saya mencoba menyalin dari server AS ke server Singapura.
Arcolye
@Arcolye bagaimana latensi di AWS Singapura sekarang? Itu lambat dan tidak konsisten setahun yang lalu.
Anatoly
7

Salin di antara keranjang di berbagai wilayah

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

Perintah di atas menyalin file dari bucket di Eropa (eu-west-1) ke Jepang (ap-east-east). Anda bisa mendapatkan nama kode untuk wilayah bucket Anda dengan perintah ini:

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

Omong-omong, menggunakan Salin dan Tempel di konsol web S3 itu mudah, tetapi tampaknya mengunduh dari keranjang sumber ke dalam browser, lalu mengunggah ke keranjang tujuan. Bagi saya, menggunakan "aws s3" jauh lebih cepat.

Adam Gawne-Cain
sumber
6

Saya telah membuat Docker yang dapat dieksekusi dari alat s3s3mirror . Utilitas untuk menyalin dan mencerminkan dari bucket AWS S3 ke yang lain.

Itu berulir memungkinkan COPY paralel dan sangat efisien memori, itu berhasil di mana s3cmd benar-benar gagal.

Pemakaian:

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

Untuk daftar lengkap opsi coba:

docker run pmoust/s3s3mirror 
Panagiotis Moustafellos
sumber
5

Saya membayangkan Anda mungkin telah menemukan solusi yang baik sekarang, tetapi bagi orang lain yang mengalami masalah ini (seperti yang saya baru-baru ini), saya telah membuat utilitas sederhana khusus untuk tujuan mencerminkan satu ember S3 ke yang lain di dengan cara yang sangat konkuren, namun dengan CPU dan memori yang efisien.

Ada di github di bawah Lisensi Apache di sini: https://github.com/cobbzilla/s3s3mirror

Jika Anda memiliki bucket yang sangat besar dan mencari performa maksimal, mungkin ada baiknya Anda mencoba.

Jika Anda memutuskan untuk mencobanya, beri tahu saya jika Anda memiliki masukan.

cobbzilla.dll
sumber
Saya memiliki pengalaman hebat dengan s3s3mirror. Saya dapat mengaturnya pada node EC2 m1.small dan menyalin 1,5 juta objek dalam waktu sekitar 2 jam. Penyiapannya agak sulit, karena ketidaktahuan saya dengan Maven dan Java, tetapi hanya perlu beberapa perintah apt-get di Ubuntu untuk menginstal semuanya. Satu catatan terakhir: Jika (seperti saya) Anda khawatir tentang menjalankan skrip yang tidak dikenal di bucket s3 yang besar dan penting, buat pengguna khusus dengan akses hanya baca di bucket copy-from dan gunakan kredensial tersebut. Nol kemungkinan penghapusan tidak disengaja.
Mikha
4

Jika Anda berada di shell dan ingin menyalin banyak file tetapi tidak semua file: s3cmd cp --recursive s3: // BUCKET1 / OBJECT1 s3: // BUCKET2 [/ OBJECT2]

pengguna1978008
sumber
3

Saya menulis skrip yang mencadangkan bucket 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()

Saya menggunakan ini dalam tugas menyapu (untuk aplikasi Rails):

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
Rose Perrone
sumber
1

Saya mendengar ada modul node untuk itu jika Anda menyukai javascript: p

Dari dokumen knox-copy :

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"
hurrymaplelad
sumber
Ini bukan javascript, maaf ... (ya, saya mengetahui coffeescript dan Anda masih dapat menggunakannya, tetap saja, bukan javascript)
Victor Schröder
1

Saya diberitahu bahwa Anda juga dapat melakukan ini menggunakan s3distcp pada cluster EMR. Ini seharusnya lebih cepat untuk data yang berisi file besar. Ini berfungsi cukup baik pada kumpulan data kecil - tetapi saya lebih suka solusi lain mengingat kurva pembelajaran yang diperlukan untuk menyiapkan data yang sangat sedikit (saya belum pernah bekerja dengan EMR sebelumnya).

Berikut tautan dari Dokumentasi AWS: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

Pembaruan: Untuk kumpulan data yang sama, s3s3mirror jauh lebih cepat daripada s3distcp atau AWS cli. Jauh lebih mudah untuk disiapkan juga.

George yang penasaran
sumber
1

Untuk menyalin dari satu bucket S3 ke bucket S3 yang sama atau lainnya tanpa mengunduh ke lokal, itu cukup sederhana. Gunakan perintah shell di bawah ini.

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

Ini akan menyalin semua file dari SourceFoldernamefolder keranjang sumber ke folder keranjang target TargetFoldername. Pada kode di atas, harap ganti AccessKey, SecurityKeydan ExternalBucketdengan nilai Anda yang sesuai.

Sarath Avanavu
sumber
Apa hdfs?
Anthony Kong
1

dari AWS cli https://aws.amazon.com/cli/ bisa Anda lakukan

aws s3 ls - Ini akan mencantumkan semua bucket S3

aws cp --recursive s3://<source bucket> s3://<destination bucket> - Ini akan menyalin file dari satu wadah ke wadah lain

Catatan * Sangat berguna saat membuat keranjang replikasi lintas wilayah, dengan melakukan hal di atas, semua file Anda terlacak dan pembaruan ke file wilayah sumber akan disebarkan ke keranjang yang direplikasi. Semuanya kecuali penghapusan file disinkronkan.

Untuk CRR, pastikan Anda telah mengaktifkan pembuatan versi di bucket.

vredrav
sumber
0

Bagaimana dengan aws s3 syncperintah cli. aws s3 sync s3: // bucket1 / s3: // bucket2 /


sumber
0

Seperti yang dijelaskan Neel Bhaat di blog ini , ada banyak alat berbeda yang dapat digunakan untuk tujuan ini. Beberapa di antaranya disediakan AWS, di mana sebagian besar adalah alat pihak ketiga. Semua alat ini mengharuskan Anda untuk menyimpan kunci dan rahasia akun AWS Anda di alat itu sendiri. Berhati-hatilah saat menggunakan alat pihak ketiga, karena kredensial yang Anda simpan mungkin membebani Anda, seluruh nilai Anda, dan membuat Anda mati.

Oleh karena itu, saya selalu merekomendasikan penggunaan AWS CLI untuk tujuan ini. Anda cukup menginstal ini dari tautan ini . Selanjutnya, jalankan perintah berikut dan simpan kunci Anda, nilai rahasia di AWS CLI.

aws configure

Dan gunakan perintah berikut untuk menyinkronkan AWS S3 Bucket Anda ke mesin lokal Anda. (Mesin lokal harus menginstal AWS CLI)

aws s3 sync <source> <destination>

Contoh:

1) Untuk AWS S3 ke Penyimpanan Lokal

aws s3 sync <S3Uri> <LocalPath>

2) Dari Penyimpanan Lokal ke AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Dari ember AWS s3 ke ember lain

aws s3 sync <S3Uri> <S3Uri> 
Keet Sugathadasa
sumber
0

Cara terbaik untuk menyalin bucket S3 menggunakan AWS CLI .

Ini melibatkan 3 langkah ini:

  1. Menginstal AWS CLI di server Anda.
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. Jika Anda menyalin keranjang di antara dua akun AWS, Anda perlu melampirkan kebijakan yang benar dengan setiap keranjang.

  2. Setelah ini gunakan perintah ini untuk menyalin dari satu wadah ke wadah lain.

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

Rincian langkah 2 dan langkah 3 diberikan di tautan ini:

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

Shubham Upadhyay
sumber