Setel kontrol cache untuk seluruh bucket S3 secara otomatis (menggunakan kebijakan bucket?)

125

Saya perlu menyetel header kontrol cache untuk seluruh bucket s3, baik file yang sudah ada maupun yang akan datang, dan berharap melakukannya dalam kebijakan bucket. Saya tahu saya dapat mengedit yang sudah ada dan saya tahu bagaimana menentukannya jika saya mengunggahnya sendiri tetapi sayangnya aplikasi yang mengunggahnya tidak dapat mengatur tajuk karena menggunakan s3fs untuk menyalin file di sana.

thattommyhall
sumber

Jawaban:

208

Sekarang ada 3 cara untuk menyelesaikan ini: melalui Konsol AWS , melalui baris perintah , atau melalui alat baris perintah s3cmd .


Instruksi Konsol AWS

Ini sekarang adalah solusi yang direkomendasikan. Ini jelas, tetapi dapat memakan waktu.

  • Masuk ke AWS Management Console
  • Masuk ke bucket S3
  • Pilih semua file dengan rute
  • Pilih "Lainnya" dari menu
  • Pilih "Ubah metadata"
  • Di kolom "Key", pilih "Cache-Control" dari menu drop-down max-age = 604800Enter (7 hari) untuk Nilai
  • Tekan tombol "Simpan"

( terima kasih kepada @biplob - tolong beri dia cinta di bawah )


Solusi AWS Command Line

Awalnya, ketika saya membuat kebijakan ember ini tidak ada jalannya, jadi saya memikirkan cara melakukannya menggunakan aws-cli, dan ini cukup apik. Ketika meneliti, saya tidak dapat menemukan contoh apa pun di alam liar, jadi saya pikir saya akan memposting beberapa solusi saya untuk membantu mereka yang membutuhkan.

CATATAN: Secara default, aws-cli hanya menyalin metadata file saat ini, BAHKAN JIKA ANDA MENENTUKAN METADATA BARU.

Untuk menggunakan metadata yang ditentukan pada baris perintah, Anda perlu menambahkan tanda '--metadata-directive REPLACE'. Berikut ini beberapa contohnya.

Untuk satu file

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Untuk seluruh bucket (note --recursive flag):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Sedikit gotcha saya temukan, jika Anda hanya ingin menerapkannya ke jenis file tertentu, Anda perlu mengecualikan semua file, lalu sertakan yang Anda inginkan.

Hanya jpg dan png:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

Berikut adalah beberapa tautan ke manual jika Anda membutuhkan info lebih lanjut:

Masalah Dikenal:

"Unknown options: --metadata-directive, REPLACE"

ini dapat disebabkan oleh awscli yang sudah kadaluwarsa - lihat jawaban @ eliotRosewater di bawah


Alat S3cmd

S3cmd adalah "Alat baris perintah untuk mengelola layanan Amazon S3 dan CloudFront". Meskipun solusi ini membutuhkan git pull, ini mungkin solusi yang lebih sederhana dan lebih komprehensif.

Untuk instruksi lengkap, lihat posting @ ashishyadaveee11 di bawah ini


Semoga membantu!

Dan Williams
sumber
6
Terima kasih atas contoh sebenarnya tentang apa yang harus dilakukan. Saya mengalami kesulitan menemukan apa yang mungkin terjadi hanya dengan membaca dokumen.
danneu
2
Saya mendapatkan "Opsi tidak diketahui: --metadata-directive, REPLACE" saat menjalankan salah satu perintah di atas. Tolong bantu saya.
pengguna3722785
1
Catatan, SEKARANG ADA CARA YANG LEBIH MUDAH. Anda sekarang dapat mengubah meta data untuk SEMUA file dalam satu keranjang melalui AWS Console. Lihat jawaban CoderBoy di bawah ini: stackoverflow.com/a/47072736/2538952
Martin Tschammer
1
Perhatikan bahwa menggunakan REPLACE --meta-directive akan menimpa semua metadata sebelumnya yang tidak disalin dalam perintah! Misalnya "content-encoding gzip" akan dihapus jika tidak ditambahkan secara eksplisit ke perintah cp.
Harmen Janssen
1
Apakah cpdownload dan upload ulang semuanya?
mlissner
37

Sekarang, itu dapat berubah dengan mudah dari konsol AWS.

  • Masuk ke AWS Management Console
  • Masuk ke bucket S3
  • Pilih semua file dengan rute
  • Pilih "Lainnya" dari menu
  • Pilih "Ubah metadata"
  • Di kolom "Key", pilih "Cache-Control" dari menu drop down
  • max-age = 604800Enter (7 hari) untuk Value
  • Tekan tombol "Simpan"

Perlu waktu untuk mengeksekusinya bergantung pada file bucket Anda. Ulangi dari awal jika Anda tidak sengaja menutup browser.

biplob
sumber
6
Apa yang dimaksud dengan "pilih semua file dengan rute"?
Tamzin Blake
1
Pilih semua / beberapa file dari direktori yang ingin Anda atur meta
biplob
Maaf karena terlambat membalas. Tidak, tidak. Anda harus mengaturnya dari aplikasi Anda.
biplob
Apakah ini menggantikan metadata sebelumnya atau menambahnya? (Saya tidak ingin kehilangan semua jenis konten saya!)
Chris
Saya baru saja mengonfirmasi bahwa TIDAK menghapus nilai yang ada. Hanya menyetel kunci yang Anda tentukan (menimpa kunci jika ada)
rynop
21

Langkah

  1. git clone https://github.com/s3tools/s3cmd
  2. Jalankan s3cmd --configure (Anda akan diminta untuk dua kunci - salin dan tempel dari email konfirmasi Anda atau dari halaman akun Amazon Anda. Hati-hati saat menyalinnya! Mereka peka huruf kapital dan harus dimasukkan secara akurat atau Anda akan terus mendapatkan kesalahan tentang tidak valid tanda tangan atau yang serupa. Ingatlah untuk menambahkan s3:ListAllMyBucketsizin ke kunci atau Anda akan mendapatkan AccessDeniedkesalahan saat menguji akses.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
ashishyadaveee11
sumber
Jawaban super. Terima kasih! Apakah ada cara untuk HANYA memperbarui yang belum memiliki pengaturan tajuk ini?
PKHunter
Adakah yang punya solusi serupa untuk digunakan dengan S3Express jendela?
Joe
12

Jika skor reputasi saya> 50, saya hanya akan berkomentar. Tapi ini belum (belum) jadi inilah jawaban lengkap lainnya.


Saya telah membenturkan kepala saya pada masalah ini untuk sementara waktu sekarang. Sampai saya menemukan & membaca dokumennya. Berbagi itu di sini kalau-kalau itu membantu orang lain:

Apa yang akhirnya berhasil dengan andal bagi saya adalah perintah ini. Saya memilih waktu kedaluwarsa 1 detik untuk pengujian guna memverifikasi hasil yang diharapkan:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEdiperlukan saat " cp" mengubah metadata pada file yang ada di S3
  • max-age menyetel usia cache Browser, dalam hitungan detik
  • s-maxage mengatur cache CloudFront, dalam hitungan detik

Demikian juga, jika mengatur nilai header Kontrol-Cache ini pada file saat mengunggah ke S3, perintahnya akan terlihat seperti:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file
ayam jantan
sumber
8

Saya tidak berpikir Anda dapat menentukan ini di level bucket tetapi ada beberapa solusi untuk Anda.

  1. Salin objek ke dirinya sendiri di S3 dengan menyetel cache-controlheader yang sesuai untuk operasi penyalinan.

  2. Tentukan header tanggapan di url ke file . Anda perlu menggunakan url yang sudah ditandatangani sebelumnya agar ini berfungsi, tetapi Anda dapat menentukan header respons tertentu di querystring termasuk cache-controldan expires. Untuk daftar lengkap opsi yang tersedia lihat: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

Geoff Appleford
sumber
Terima kasih Geoff, saya tahu tentang (1) tetapi tidak (2). Bukan yang saya harapkan (meskipun saya khawatir itu tidak mungkin)
thattommyhall
Apakah Anda memiliki contoh perintah AWS CLI tentang cara melakukan # 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm
3

Anda selalu dapat mengonfigurasi lambda dengan pemicu pada PUTOBJECT di S3, lambda hanya akan mengubah header dari objek khusus ini yang baru saja diletakkan.

Kemudian Anda dapat menjalankan perintah salin yang disebutkan di atas untuk terakhir kalinya, dan semua objek baru akan diperbaiki oleh lambda.

MEMPERBARUI:

Berikut adalah tempat yang baik untuk memulai: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /

Ibrahim Bou Ncoula
sumber
Bisakah Anda memberikan lebih banyak detail tentang cara membuat lamba ini? Sepertinya solusi yang bagus.
Wouter
1
@Wouter yakin, saya menemukan tautan yang sebenarnya dapat membantu Anda mencapainya dengan mudah, aaronfagan.ca/blog/2017/… Jika Anda memerlukan bantuan atau dukungan, saya akan dengan senang hati membantu.
Ibrahim Bou Ncoula
Saya tahu ini sudah tua namun saya menemukan sumber daya ini berguna untuk apa yang saya cari. Terima kasih untuk ini. suara positif untuk Anda teman saya!
terbuang 2000
1

Untuk mereka yang mencoba menggunakan jawaban Dan dan mendapatkan kesalahan:

"Opsi tidak diketahui: --metadata-directive, REPLACE"

Saya mengalami masalah, dan masalahnya adalah saya menginstal awscli menggunakan

sudo apt-get install awscli

Ini menginstal versi lama dari awscli yang tidak memiliki perintah --metadata-directive. Jadi saya menggunakan sudo apt-get remove awscli untuk menghapusnya.

Kemudian instal ulang mengikuti prosedur dari amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

Satu-satunya perbedaan adalah saya harus menggunakan sudo -H karena masalah izin yang mungkin dihadapi orang lain juga.

eliotRosewater
sumber