Mengubah tipe konten secara rekursif untuk file dari ekstensi yang diberikan di Amazon S3

12

Saya memiliki ember S3 besar dengan struktur "folder" bersarang yang berisi (antara lain) file .json dan .md statis. File-file ini dilayani oleh S3 text/plaindaripada yang benar application/jsondan text/markdown.

Saya telah memperbarui bucket secara default sehingga unggahan baru akan memiliki tipe konten yang benar.

Apa cara terbaik untuk berjalan di "pohon" dan memperbarui jenis konten untuk file yang cocok dengan ekstensi tertentu?

Gabriel Bauman
sumber

Jawaban:

25

Berikut adalah contoh bagaimana melakukan ini dengan alat aws cli. Alat cp memungkinkan penggunaan opsi rekursif, yang menurut saya tidak bisa dilakukan oleh alat s3api. Dalam hal ini, saya sedang memperbaiki banyak SVG. Hapus opsi --dryrun ketika Anda siap untuk melepaskannya.

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/
t1m0
sumber
Saya mengerti konsep dasar dari perintah. Tetapi apakah ini akan menghapus versi file karena itu adalah direktif ganti? Ember saya dikonfigurasikan dengan versi dan setiap file memiliki beberapa versi. Mengganti itu akan menghapus semua versi dan membuat file baru atau akankah memperhitungkan semua versi selama penggantian?
Joze
Itu pertanyaan yang bagus. Pasti layak diuji dalam ember sekali pakai. Harapan saya adalah bahwa permintaan untuk mengganti hanya metadata tidak akan menghapus versi tetapi ...
t1m0
Saya melakukan tes, dan ternyata versi itu tetap ada, namun versi modifikasi metadata menjadi versi terbaru, versi yang lebih lama memiliki metadata sebelumnya. Saya mencoba menemukan cara untuk memodifikasi metadata dari semua versi secara rekursif sekarang, yaitu tanpa membuat skrip rumit yang akan mencantumkan setiap versi dan kemudian memodifikasi metadata-nya ...
Joze
Perintah ini me-reset acl. Jika Anda membutuhkan nilai non-default, tambahkan--acl=...
Vasiliy Zverev
3

Kecuali Anda ingin mendapatkan kotor tangan Anda menggunakan boto / python atau API AWS lain, saya menduga Anda terbaik akan menggunakan $ aws s3api copy-objectdengan --content-typebendera untuk menyalin objek untuk dirinya sendiri, pengaturan jenis konten baru.

Berikut dokumentasi untuk s3api.

Tak perlu dikatakan bahwa Anda harus menguji ini terlebih dahulu, sebelum menjalankannya secara rekursif pada seluruh ember Anda.

EEAA
sumber
1
Mengenai pengujian, gunakan bendera "dry run" di Amazon CLI.
bart
3

Setelah menggali, saya menemukan bahwa s3cmdalat tersebut dapat melakukan ini. Misalnya, untuk mengatur file JSON ke application / json:

s3cmd --recursive modify --acl-public \
       --add-header='content-type':'application/json' \
       --exclude '' --include '.json' \
       s3://bucket/
Gabriel Bauman
sumber
3

Seperti yang disebutkan sebelumnya, Anda dapat menggunakan awsalat oleh Amazon dan menggunakan s3api untuk menyalin-objek ke dirinya sendiri, dan gunakan metadata-directive=REPLACEuntuk mengubah tipe konten.

Saya meletakkan ini di sini, karena kadang-kadang Anda ingin beralih pada nama file yang disimpan dalam database, dan ini adalah bagaimana Anda dapat melakukannya melalui cli.

aws s3api copy-object \
          --content-type="application/vnd.android.package-archive" \
          --metadata-directive="REPLACE" \
          --copy-source "MYBUCKET/FILE.apk" \
          --bucket "MYBUCKET" \
          --key "FILE.apk" \
          --acl public-read
gilm
sumber
Ini menggantikan hanya satu file. Bagaimana Anda menjalankan perintah ini terhadap semua file bertipe .apk?
Bart
@Bart lihat jawaban saya untuk cara rekursif.
t1m0