Cara terbaik untuk memindahkan file di antara bucket S3?


90

Saya ingin menyalin beberapa file dari keranjang produksi ke keranjang pengembangan setiap hari.

Misalnya: Salin keranjang produksi / feed / feedname / tanggal ke developmentbucket / feed / feedname / date

Karena file yang saya inginkan berada sangat dalam di struktur folder, memakan waktu terlalu lama untuk membuka setiap folder dan menyalin / menempel.

Saya telah bermain-main dengan memasang drive ke setiap ember dan menulis skrip batch windows, tetapi itu sangat lambat dan tidak perlu mengunduh semua file / folder ke server lokal dan mencadangkan lagi.

Jawaban:


110

Memperbarui

Seperti yang ditunjukkan oleh alberge (+1), saat ini Antarmuka Baris Perintah AWS yang luar biasa menyediakan pendekatan paling serbaguna untuk berinteraksi dengan (hampir) semua hal AWS - sementara itu mencakup sebagian besar API layanan dan juga menampilkan perintah S3 tingkat yang lebih tinggi untuk menangani Anda kasus penggunaan khusus, lihat referensi AWS CLI untuk S3 :

  • sync - Menyinkronkan direktori dan prefiks S3. Kasus penggunaan Anda dicakup oleh Contoh 2 (penggunaan yang lebih halus dengan --exclude, --includedan penanganan awalan dll. Juga tersedia):

    Perintah sinkronisasi berikut menyinkronkan objek dengan awalan dan keranjang yang ditentukan ke objek di bawah awalan dan keranjang yang ditentukan lain dengan menyalin objek s3. [...]

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

Untuk kelengkapan, saya akan menyebutkan bahwa perintah S3 tingkat yang lebih rendah juga masih tersedia melalui sub perintah s3api , yang akan memungkinkan untuk langsung menerjemahkan solusi berbasis SDK apa pun ke AWS CLI sebelum akhirnya mengadopsi fungsionalitas tingkat yang lebih tinggi.


Jawaban Awal

Memindahkan file di antara bucket S3 dapat dilakukan dengan Objek PUT - Salin API (diikuti dengan DELETE Object ):

Implementasi operasi PUT ini membuat salinan objek yang sudah disimpan di Amazon S3. Operasi penyalinan PUT sama seperti melakukan GET lalu PUT. Menambahkan header permintaan, x-amz-copy-source, membuat operasi PUT menyalin objek sumber ke keranjang tujuan. Sumber

Terdapat sampel masing-masing untuk semua AWS SDK yang ada, lihat Menyalin Objek dalam Operasi Tunggal . Secara alami, solusi berbasis skrip akan menjadi pilihan pertama yang jelas di sini, jadi Menyalin Objek Menggunakan AWS SDK untuk Ruby mungkin merupakan titik awal yang baik; jika Anda lebih memilih Python, hal yang sama juga dapat dicapai melalui boto , tentu saja, lihat metode copy_key()dalam dokumentasi API S3 boto .

PUT Objecthanya menyalin file, jadi Anda harus secara eksplisit menghapus file melalui DELETE Objectstill setelah operasi penyalinan berhasil, tetapi itu hanya akan menjadi beberapa baris setelah keseluruhan skrip yang menangani nama bucket dan file ada di tempatnya (ada contoh masing-masing juga , lihat misalnya Menghapus Satu Objek Per Permintaan ).


Saya akhirnya membuat skrip operasi dengan AWS SDK di .NET
Matt Dell

1
@MattDell dapatkah Anda menambahkan jawaban .NET untuk pertanyaan ini?
balexandre

1
Apa yang menyebalkan tentang ini adalah bahwa Amazon tidak begitu jelas tentang apakah perintah salin berhasil atau tidak, jadi penghapusan setelah operasi tampaknya berbahaya.
James McMahon

Untuk memperjelas, saya merujuk secara khusus ke Java API. Saya telah membuka pertanyaan terpisah stackoverflow.com/questions/17581582
James McMahon

Kita masih membutuhkan cara sederhana untuk membuat satu id dan kunci yang mampu membaca dari satu wadah dan menulis ke wadah lainnya. Terutama jika ember ada di seluruh akun.
CMCDragonkai

66

AWS CLI resmi baru secara native mendukung sebagian besar fungsi s3cmd. Saya sebelumnya telah menggunakans3cmd atau ruby ​​AWS SDK untuk melakukan hal-hal seperti ini, tetapi CLI resmi berfungsi sangat baik untuk ini.

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

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

4
Ini harus dipilih ke atas daftar. Ini adalah cara yang tepat untuk menyinkronkan keranjang dan yang paling mutakhir dalam semua jawaban ini.
dft

Jika Anda mengalami masalah dengan kesalahan 403 akses ditolak, lihat entri blog ini. Itu membantu. alfielapeter.com/posts/…
crlane

3
salinan lintas wilayahaws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
setara

jika Anda perlu menjalankan malam ini di server, gunakan 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
ekuivalen8

@alberge Apakah ada cara untuk menyediakan kunci akses & rahasia menggunakan argumen baris perintah?
EmptyData

29

Untuk memindahkan / menyalin dari satu ember ke ember lain atau ember yang sama saya menggunakan alat s3cmd dan berfungsi dengan baik. Contohnya:

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

29

Saya menghabiskan waktu berhari-hari menulis alat kustom saya sendiri untuk memparalelkan salinan yang diperlukan untuk ini, tetapi kemudian saya menemukan dokumentasi tentang cara mendapatkan perintah sinkronisasi AWS S3 CLI untuk menyinkronkan bucket dengan paralelisasi besar-besaran . Perintah berikut akan memberi tahu AWS CLI untuk menggunakan 1.000 utas untuk menjalankan pekerjaan (masing-masing file kecil atau satu bagian dari salinan multi bagian) dan menunggu 100.000 pekerjaan:

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

Setelah menjalankan ini, Anda dapat menggunakan perintah sinkronisasi sederhana sebagai berikut:

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

Pada mesin m4.xlarge (dalam AWS - 4 core, 16GB RAM), untuk kasus saya (file 3-50GB) kecepatan sinkronisasi / salin berubah dari sekitar 9,5MiB / s menjadi 700 + MiB / s, peningkatan kecepatan sebesar 70x melebihi konfigurasi default.

Pembaruan: Perhatikan bahwa S3CMD telah diperbarui selama bertahun-tahun dan perubahan ini sekarang hanya efektif saat Anda bekerja dengan banyak file kecil. Perhatikan juga bahwa S3CMD di Windows (hanya di Windows) sangat terbatas dalam keseluruhan throughput dan hanya dapat mencapai sekitar 3Gbps per proses, apa pun ukuran instans atau pengaturan yang Anda gunakan. Sistem lain seperti S5CMD memiliki masalah yang sama. Saya telah berbicara dengan tim S3 tentang ini dan mereka sedang memeriksanya.


Terima kasih, berhasil mendapatkan lebih dari 900 + MiB / s dengan konfigurasi Anda, kecepatan tinggi melebihi default.
kozyr

@ James: Apakah API membatasi kita dalam mencapai transfer berkecepatan tinggi seperti itu? Saya menggunakan api transfermanager yang disediakan oleh AWS Java SDK vs CLI dari mesin T2 EC2 untuk mentransfer file 2 GB. Perbedaan waktu ~ 5,5 kali (CLI - 14 detik) vs (SDK - 80 detik). Selain itu, saya tidak melihat opsi apa pun untuk s3.max_queue_size di SDK. Ada komentar?
Dwarrior

@ Dwarrior, kedua pengaturan ini untuk CLI. Saat menggunakan SDK, Anda harus mengelola semua permintaan yang mengantri sendiri. Dukungan AWS mengklaim telah mencapai sekitar 80% dari throughput maksimum yang mungkin antara EC2 dan S3 menggunakan Linux (yaitu throughput jaringan instans EC2 yang diiklankan). Windows adalah warga negara kelas dua di AWS dan bahkan tidak bisa mendapatkan setengahnya dengan alat yang disediakan Amazon, dan sepertinya mereka tidak berencana untuk memperbaikinya. :-( Dengan mesin T2, AWS tidak menentukan dengan tepat berapa banyak bandwidth yang Anda dapatkan, meskipun akan sedikit meningkat jika Anda menyiapkan titik akhir VPC S3.
James

@James Saya pergi sampai sejauh mana memparalelkan daftar file saya di atas cluster dalam percikan, menggabungkan dengan paralelisasi dalam setiap partisi dan kemudian menggunakan transfermanager untuk unggahan paralel untuk file yang diberikan. Saya melihat peningkatan dari 80 menjadi 45 detik setelah melakukan itu tetapi masih hilang pada cara menangani CLI dari EC2. Terima kasih, untuk penyiapan ini. Ini meningkatkan kinerja melalui jendela juga secara drastis. Di SDK, kita dapat mengatur koneksi maksimal tetapi bukan ukuran antrian, jadi saya pikir kita mungkin harus membiarkannya. :) Setiap petunjuk tentang cara mengelola antrian, kode contoh apa pun yang dapat saya ambil sebagai baseline.
Dwarrior

2
S5Cmd ( github.com/peakgames/s5cmd ) adalah utilitas yang digunakan orang-orang yang mendukung AWS untuk hasil maksimum. Ukuran instans memang membuat perbedaan besar. Seri c5n baru sangat hemat biaya untuk jaringan dan mencapai 100Gbps yang menakjubkan.
Yakobus

13

Contoh .NET seperti yang diminta:

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

dengan klien menjadi sesuatu seperti

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

Mungkin ada cara yang lebih baik, tetapi itu hanya beberapa kode cepat yang saya tulis untuk mentransfer beberapa file.


1
Sepertinya itu solusi yang bagus. tetapi apa yang terjadi jika Anda memiliki kredensial yang berbeda untuk 2 kelompok?
Roee Gavirel

2
Kredensial untuk eksekusi perintah salin. Kredensial tunggal tersebut memerlukan izin baca / tulis yang sesuai di bucket sumber / target. Untuk menyalin antar akun, Anda perlu menggunakan kebijakan keranjang untuk mengizinkan akses ke keranjang dari kredensial akun lain.
Matt Houser

9

Jika Anda memiliki host unix dalam AWS, gunakan s3cmd dari s3tools.org. Siapkan izin agar kunci Anda sebagai akses baca ke keranjang pengembangan Anda. Lalu lari:

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

Sisi server? Tidak ada sisi server untuk s3. Semua perintah dilakukan dari klien jarak jauh.
dk.

Ngomong-ngomong, perintah ini tampaknya berfungsi dengan baik melalui internet!
Gabe Kopley

3
Pertanyaan "sisi server" valid. Apakah s3cmd mentransfer shunt semua data ke klien, atau apakah itu transfer S3 langsung ke S3? Jika yang pertama, akan lebih baik jika menjalankan ini di cloud AWS untuk menghindari transfer WAN eksternal.
Bruce Edge

1
Penyalinan terjadi dari jarak jauh di S3.
dk.

Perhatikan juga bahwa jika Anda secara tidak sengaja menghentikan proses s3cmd cpini tidak menerima --skip-existingopsi, namun Anda dapat menjalankannya s3cmd syncdengan melewatkan yang ada
ianstarz

9

Bagi saya perintah berikut baru saja berfungsi:

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

2
solusi sederhana dan mudah ... mengapa menggunakan alat pihak ketiga atau solusi untuk tugas sederhana seperti itu padahal hal ini dapat dilakukan dengan aws cli ?!
Fr0zenFyr

7

Berikut adalah kelas ruby ​​untuk melakukan ini: https://gist.github.com/4080793

Contoh penggunaan:

$ 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

6

Sebenarnya baru-baru ini saya hanya menggunakan tindakan salin + tempel di antarmuka AWS s3. Cukup buka file yang ingin Anda salin, klik "Tindakan" -> "Salin" lalu buka keranjang tujuan dan "Tindakan" -> "Tempel"

Ini mentransfer file dengan cukup cepat dan sepertinya solusi yang tidak terlalu berbelit-belit yang tidak memerlukan pemrograman apa pun, atau solusi yang berlebihan seperti itu.


Iya. Saya telah menemukan hal yang sama beberapa menit yang lalu. Saya memberi suara positif, jadi lebih banyak orang akan menghemat waktu :)
JCarlosR

Saya mencobanya pada ember ke salinan ember dengan 134.364 objek di dalamnya. Butuh berjam-jam. Dan tujuan berakhir dengan hanya 134.333 file - salinannya mengatakan "Berhasil", tetapi tidak ada penjelasan untuk file yang hilang.
Warrens

Menggunakan perintah jenis "sinkronisasi aws s3" yang dijelaskan dalam posting lain di sini, semua 134.364 objek disalin dalam waktu sekitar 20 menit.
Warrens

4

Kami memiliki masalah yang sama persis dengan pekerjaan ETL kami di Snowplow , jadi kami mengekstrak kode salinan file paralel kami (Ruby, dibangun di atas Fog ), ke dalam permata Ruby miliknya, yang disebut Sluice:

https://github.com/snowplow/sluice

Sluice juga menangani penghapusan, pemindahan, dan unduhan file S3; semua diparalelkan dan dengan percobaan ulang otomatis jika suatu operasi gagal (yang sering terjadi). Semoga bermanfaat!



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.