Bagaimana cara memindahkan file antara dua ember S3 dengan biaya minimum?

44

Saya memiliki jutaan file dalam ember Amazon S3 dan saya ingin memindahkan file-file ini ke ember dan folder lain dengan biaya minimum atau tanpa biaya jika memungkinkan. Semua ember berada di zona yang sama.

Bagaimana saya bisa melakukannya?

Daniel Cukier
sumber

Jawaban:

53

Jutaan adalah jumlah besar - saya akan kembali lagi nanti.

Terlepas dari pendekatan Anda, mekanisme yang mendasarinya perlu menyalin secara langsung dari satu ember ke ember lainnya - dengan cara ini (karena ember Anda berada di wilayah yang sama) Anda tidak dikenai biaya untuk bandwidth. Pendekatan lain apa pun tidak efisien (misalnya mengunduh dan mengunggah ulang file).

Menyalin antar bucket dilakukan dengan menggunakan 'PUT copy' - itu adalah permintaan PUT yang menyertakan tajuk 'x-amz-copy-source' - Saya yakin ini digolongkan sebagai permintaan COPY. Ini akan menyalin file dan secara default meta-data terkait. Anda harus memasukkan 'x-amz-acl' dengan nilai yang benar jika Anda ingin mengatur ACL pada saat yang sama (jika tidak, itu akan menjadi standar untuk pribadi). Anda akan dikenai biaya untuk permintaan COPY Anda ($ 0,01 / 1.000 permintaan). Anda dapat menghapus file yang tidak dibutuhkan setelah disalin (HAPUS permintaan tidak dikenakan biaya). (Satu hal yang saya tidak jelas adalah apakah permintaan COPY atau tidak juga menimbulkan biaya permintaan GET, karena objek tersebut harus terlebih dahulu diambil dari ember sumber - jika ya, biaya akan menjadi tambahan $ 0,01 / 10.000 permintaan).

Biaya di atas tampaknya tidak dapat dihindari - untuk satu juta objek yang Anda cari sekitar $ 10 (atau $ 11). Karena pada akhirnya Anda harus benar-benar membuat file pada bucket tujuan, pendekatan lain (mis. Tar-gzipping file, Amazon Impor / Ekspor, dll) tidak akan menyiasati biaya ini. Meskipun demikian, mungkin bernilai saat Anda menghubungi Amazon jika Anda memiliki lebih dari beberapa juta objek untuk ditransfer.

Mengingat hal di atas (harga yang tidak dapat dihindarkan), hal selanjutnya yang harus diperhatikan adalah waktu, yang akan menjadi faktor besar ketika menyalin 'jutaan file'. Semua alat yang dapat melakukan penyalinan langsung antar bucket akan dikenakan biaya yang sama. Sayangnya, Anda memerlukan satu permintaan per file (untuk menyalin), satu permintaan untuk dihapus, dan mungkin satu permintaan untuk membaca data ACL (jika file Anda memiliki ACL yang bervariasi). Kecepatan terbaik akan datang dari apa pun yang dapat menjalankan operasi paling paralel.

Ada beberapa pendekatan command line yang mungkin cukup layak:

  • s3cmd-modifikasi (permintaan tarikan tertentu) mencakup perintah paralel cp dan mv dan harus menjadi pilihan yang baik untuk Anda.
  • Konsol AWS dapat melakukan penyalinan secara langsung - saya tidak dapat berbicara berapa paralelnya.
  • Skrip aws Tim Kay dapat melakukan penyalinan - tetapi tidak paralel - Anda harus membuatnya untuk menjalankan salinan lengkap yang Anda inginkan (mungkin bukan opsi terbaik dalam kasus ini - meskipun, ini adalah skrip yang hebat).
  • CloudBerry S3 Explorer , Bucket Explorer , dan CloudBuddy semua harus dapat melakukan tugas, meskipun saya tidak tahu bagaimana efisiensi masing-masing tumpukan. Saya percaya bahwa fitur multi-threaded dari sebagian besar ini memerlukan pembelian perangkat lunak.
  • Buat skrip sendiri menggunakan salah satu SDK yang tersedia.

Ada beberapa kemungkinan bahwa s3fs dapat berfungsi - cukup paralel, apakah mendukung salinan antara bucket yang sama - TIDAK mendukung salinan antara bucket yang berbeda, tetapi mungkin mendukung perpindahan di antara bucket yang berbeda.

Saya akan mulai dengan s3cmd-modifikasi dan melihat apakah Anda berhasil atau hubungi Amazon untuk solusi yang lebih baik.

cyberx86
sumber
Bucket Explorer tampaknya berfungsi baik untuk saya (memindahkan file di antara dua ember saat ini)
Mie
3
Di mana aws s3 sync s3://source s3://destinationcocok?
Olivier Lalonde
7

Topik lama, tapi ini untuk siapa pun yang menyelidiki skenario yang sama. Seiring dengan waktu saya, untuk lebih dari 20.000 objek. Berjalan di AWS Linux / Centos, setiap objek menjadi gambar untuk sebagian besar, bersama dengan beberapa video dan berbagai file media.

Menggunakan AWS CLI Tools untuk menyalin file dari Bucket A ke Bucket B.

A. Buat ember baru

$ aws s3 mb s3://new-bucket-name

B. Sinkronkan ember lama dengan ember baru

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Menyalin 20.000 objek ...

Mulai 17:03

Berakhir pada 17:06

Total waktu untuk 20.000+ objek = sekitar 3 menit

Setelah ember baru dikonfigurasi dengan benar, yaitu izin, kebijakan dll. Dan Anda ingin menghapus ember lama.

C. Lepas / hapus ember lama

$ aws s3 rb --force s3://old-bucket-name
pengguna1360528
sumber
Penyelamat hidup. Saya menyalin 300 + GB. Kiat: jika Anda menyalin dari ember di wilayah yang sama jauh lebih cepat daripada di wilayah lain (dan menurut saya harganya lebih murah).
Marcelo Agimóvel
Saya punya masalah dengan metode Anda: privasi file semua diatur ke PRIVATE, bahkan sebagian besar objek menjadi publik, apa yang terjadi?
Marcelo Agimóvel
5

Saya tidak yakin ini adalah pendekatan terbaik tetapi konsol manajemen AWS memiliki fitur cut / copy / paste. sangat mudah digunakan dan efisien.

Itikos Kleinos
sumber
6
Itu tidak akan bekerja dengan baik dengan sejuta file.
James
@ James dengan susah payah mengonfirmasi bahwa;)
merampok
3

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

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

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

cobbzilla
sumber
Saya memiliki pengalaman hebat dengan s3s3mirror. Saya dapat mengaturnya pada simpul EC1 m1.small dan menyalin 1,5 juta objek dalam waktu sekitar 2 jam. Setup agak sulit, karena ketidaktahuan saya dengan Maven dan Java, tetapi hanya butuh beberapa perintah apt-get di Ubuntu untuk menginstal semuanya. Satu catatan terakhir: Jika (seperti saya) Anda khawatir menjalankan skrip yang tidak dikenal pada bucket s3 penting, buat pengguna khusus dengan akses hanya baca pada bucket copy-from dan gunakan kredensial tersebut. Peluang penghapusan tanpa disengaja.
Mikha
Apakah ini dapat diterapkan pada kotak di antara akun yang berbeda?
Oliver Burdekin
@ OliverBurdekin ya ada --cross-account-copyopsi ( -Csingkatnya) untuk melakukan ini. Perhatikan bahwa saat menyalin di seluruh akun, ACL tidak disalin; pemilik bucket tujuan akan memiliki izin penuh untuk data yang disalin.
cobbzilla
Terima kasih @ rfcreader Bagaimana saya bisa memperkirakan biaya ini? Saya mengetahui adanya kalkulator biaya AWS tetapi tidak tahu proses apa yang akan dilakukan dalam hal jumlah permintaan, dll. Saya membayangkan cukup mudah untuk menghitung metrik ini menggunakan CLI tetapi jika Anda tahu lebih banyak, silakan menghubungi kami. Dukungan AWS menyarankan "peminta membayar". Ha!
Oliver Burdekin
@OliverBurdekin s3s3mirror tidak melacak jumlah permintaan AWS berdasarkan jenis (DAPATKAN, SALIN, HAPUS, dll). Statistik ini dicetak secara berkala saat berjalan, dan terakhir di akhir. Anda dapat melakukan uji coba terbatas untuk menyalin subset kecil dari objek, ini akan memberi Anda perasaan umum tentang berapa banyak total permintaan yang diperlukan untuk menyalin seluruh set data.
cobbzilla
2

AWS CLI menyediakan cara untuk menyalin satu ember ke ember lainnya dalam proses paralel. Diambil dari https://stackoverflow.com/a/40270349/371699 :

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 melihat ke depan 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 meningkat dari sekitar 9,5MiB / dtk ke 700 + MiB / dtk, peningkatan kecepatan dari 70x lebih dari konfigurasi default.

tepat waktu
sumber
0

Di bucket yang hilang, pilih file yang ingin Anda salin ke bucket lain.

  • Di bawah Tindakan, pilih 'Salin'.
  • Pergi ke ember mendapatkan.
  • Di bawah Tindakan, pilih 'Tempel'
john
sumber
1
Mengapa mengulangi solusi yang disebutkan orang lain satu tahun sebelumnya?
Benjamin