S3 klasörünün tamamı için önbellek denetimini otomatik olarak ayarlayın (klasör politikalarını mı kullanıyorsunuz?)


124

Hem mevcut hem de gelecekteki dosyalar için bir s3 paketinin tamamı için önbellek kontrol üstbilgileri ayarlamam gerekiyor ve bunu bir paket politikasında yapmayı umuyordum. Var olanları düzenleyebileceğimi ve bunları kendim yüklersem bunları nasıl belirteceğimi biliyorum, ancak maalesef bunları yükleyen uygulama, dosyaları oraya kopyalamak için s3fs kullandığından başlıkları ayarlayamıyor.

Yanıtlar:


208

: 3 Bu halletmek için yöntemler var AWS Konsolu aracılığıyla , komut satırı üzerinden veya s3cmd komut satırı aracı ile .


AWS Konsolu Talimatları

Bu artık önerilen çözümdür. Açıktır, ancak biraz zaman alabilir.

  • AWS Management Console'da oturum açın
  • S3 kovasına gidin
  • Tüm dosyaları rotaya göre seçin
  • Menüden "Diğer" i seçin
  • "Meta veriyi değiştir" i seçin
  • "Anahtar" alanında, açılır menüden "Önbellek Kontrolü" seçeneğini seçin max-age = 604800 Değer için Giriş (7 gün)
  • "Kaydet" düğmesine basın

( @biplob'a teşekkürler - lütfen ona aşağıda biraz sevgi verin )


AWS Komut Satırı Çözümü

Başlangıçta, bu kova politikalarını oluşturduğumda işe yaramazdı, bu yüzden aws-cli kullanarak nasıl yapılacağını düşündüm ve oldukça kaygan. Araştırma yaparken vahşi doğada herhangi bir örnek bulamadım, bu yüzden ihtiyacı olanlara yardım etmek için çözümlerimden bazılarını göndereceğimi düşündüm.

NOT: Varsayılan olarak, aws-cli, YENİ META VERİLERİ BELİRSENİZ BİLE, bir dosyanın yalnızca mevcut meta verilerini kopyalar.

Komut satırında belirtilen meta verileri kullanmak için '--metadata-directive REPLACE' bayrağını eklemeniz gerekir. İşte bazı örnekler.

Tek bir dosya için

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

Bütün bir paket için (not - 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

Biraz anladım, sadece belirli bir dosya türüne uygulamak istiyorsanız, tüm dosyaları dışlamanız ve ardından istediğiniz dosyaları eklemeniz gerekir.

Yalnızca jpgs ve pngs:

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

Daha fazla bilgiye ihtiyacınız varsa, işte kılavuza bazı bağlantılar:

Bilinen Sorunlar:

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

bunun nedeni güncel olmayan bir awscli olabilir - bkz. @ eliotRosewater'ın aşağıdaki cevabı


S3cmd aracı

S3cmd, "Amazon S3 ve CloudFront hizmetlerini yönetmek için bir komut satırı aracıdır". Bu çözüm bir git çekme gerektirse de daha basit ve daha kapsamlı bir çözüm olabilir.

Talimatların tamamı için aşağıdaki @ ashishyadaveee11 gönderisine bakın


Umarım yardımcı olur!


6
Tam olarak ne yapılacağına dair gerçek örnekler için teşekkürler. Dokümanları okurken bile neyin mümkün olduğunu keşfetmekte güçlük çekiyordum.
danneu

2
Yukarıdaki komutlardan herhangi birini çalıştırdığımda "Bilinmeyen seçenekler: --metadata-directive, REPLACE" mesajını alıyorum. Lütfen bana yardım edin.
user3722785

1
Unutmayın, ARTIK DAHA KOLAY BİR YOL VAR. Artık bir paketteki TÜM dosyaların meta verilerini AWS Konsolu aracılığıyla değiştirebilirsiniz. Aşağıdaki CoderBoy'un cevabına bakın: stackoverflow.com/a/47072736/2538952
Martin Tschammer

1
--Meta-direktifinin DEĞİŞTİRİLMESİ kullanıldığında, komutta kopyalanmamış tüm önceki meta verilerin üzerine yazılacağını unutmayın! Örneğin "içerik kodlama gzip", cp komutuna açıkça eklenmediğinde kaldırılacaktır.
Harmen Janssen

1
Her cpşeyi indirip yeniden yüklüyor mu?
mlissner

37

Artık AWS konsolundan kolayca değiştirilebilir.

  • AWS Management Console'da oturum açın
  • S3 kovasına gidin
  • Tüm dosyaları rotaya göre seçin
  • Menüden "Diğer" i seçin
  • "Meta veriyi değiştir" i seçin
  • "Anahtar" alanında, açılır menüden "Önbellek Kontrolü" nü seçin
  • max-age = 604800 Değer için (7 gün) girin
  • "Kaydet" düğmesine basın

Yürütme, paket dosyalarınıza bağlı olarak zaman alır. Tarayıcıyı yanlışlıkla kapatırsanız baştan tekrar yapın.


6
"Tüm dosyaları rotaya göre seç" ne anlama geliyor?
Tamzin Blake

1
Meta ayarlamak istediğiniz
dizinden

Geç yanıt için üzgünüm. Hayır değil. Bunu uygulamanızdan ayarlamalısınız.
biplob

Bu önceki meta verilerin yerini mi alıyor yoksa ona bir şey mi ekliyor? (Tüm içerik türlerimi kaybetmek istemiyorum!)
Chris,

Sadece mevcut değerleri KALDIRMADIĞINI doğruladım. Yalnızca belirlediğiniz anahtarları ayarlar (varsa anahtarın üzerine yazma)
rynop

21

adımlar

  1. git clone https://github.com/s3tools/s3cmd
  2. Çalıştır s3cmd --configure (Sizden iki anahtar istenecektir - bunları onay e-postanızdan veya Amazon hesap sayfanızdan kopyalayıp yapıştırın. Bunları kopyalarken dikkatli olun! Bunlar büyük / küçük harfe duyarlıdır ve doğru girilmeleri gerekir, aksi takdirde geçersiz hakkında hatalar almaya devam edersiniz imzalar veya benzeri. s3:ListAllMyBucketsAnahtarlara izinler eklemeyi unutmayın, yoksa AccessDeniederişimi test ederken bir hata alırsınız .)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

Süper cevap. Teşekkür ederim! YALNIZCA bu başlık ayarına sahip olmayanları güncellemenin bir yolu var mı?
PKHunter

Pencerenin S3Express ile kullanmak için benzer bir çözümü olan var mı?
Joe

12

İtibar puanım> 50 olsaydı, sadece yorum yapardım. Ama (henüz) değil, işte başka bir tam cevap.


Bir süredir bu soruna kafa yoruyorum. Belgeleri bulup okuyana kadar. Başkasına yardımcı olma ihtimaline karşı burada paylaşmak:

Benim için güvenilir bir şekilde işe yarayan şey bu komuttu. Beklenen sonuçları doğrulamak için test için 1 saniyelik bir son kullanma süresi seçtim:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEcpS3'teki mevcut bir dosyadaki meta verileri " " değiştirirken gereklidir
  • max-age Tarayıcı önbelleğe alma yaşını saniye cinsinden ayarlar
  • s-maxage CloudFront önbelleğe almayı saniyeler içinde ayarlar

Aynı şekilde, S3'e yüklerken bu Cache-Control başlık değerlerini bir dosyada ayarlarsanız, komut şöyle görünür:

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

8

Bunu kova düzeyinde belirtebileceğinizi sanmıyorum, ancak sizin için birkaç geçici çözüm var.

  1. Kopyalamacache-control işlemi için uygun başlıkları ayarlayarak nesneyi S3'te kendisine kopyalayın.

  2. Dosyaların url'sinde yanıt başlıklarını belirtin . Bunun çalışması için önceden imzalanmış url'ler kullanmanız gerekir, ancak sorgu dizesinde cache-controlve dahil olmak üzere belirli yanıt başlıklarını belirtebilirsiniz expires. Mevcut seçeneklerin tam listesi için bkz: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


Teşekkürler Geoff, (1) 'i biliyordum ama (2)' yi bilmiyordum.
Umduğum

# 1'in nasıl yapılacağına dair örnek bir AWS CLI komutunuz var mı? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

S3'te PUTOBJECT üzerinde bir tetikleyici olan bir lambda'yı her zaman yapılandırabilirsiniz, lambda, yeni yerleştirilen bu belirli nesnenin başlığını değiştirecektir.

Daha sonra yukarıda bahsedilen copy komutunu son bir kez çalıştırabilirsiniz ve tüm yeni nesneler lambda tarafından düzeltilecektir.

GÜNCELLEME:

İşte başlamak için iyi bir yer: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


Bu lambanın nasıl yapılacağına dair biraz daha ayrıntı verebilir misiniz? Harika bir çözüm gibi görünüyor.
Wouter

1
@Elbette, size oraya kolayca ulaşmanıza gerçekten yardımcı olabilecek bir bağlantı buldum, aaronfagan.ca/blog/2017/… Herhangi bir yardıma veya desteğe ihtiyacınız olursa yardımcı olmaktan çok mutlu olurum.
Ibrahim Bou Ncoula

Bunun eski olduğunu biliyorum, ancak bu kaynağı aradığım şey için yararlı buldum. bunun için teşekkür ederim. senin için olumlu oylar ahbap!
castaway2000

1

Dan'in cevabını kullanmaya çalışan ve hatayı alanlara:

"Bilinmeyen seçenekler: --metadata-directive, REPLACE"

Sorunla karşılaştım ve sorun şu ki, awscli'yi kullanarak

sudo apt-get install awscli

Bu, awscli'nin --metadata-directive komutu olmayan eski bir sürümünü kurdu. Bu yüzden kaldırmak için sudo apt-get remove awscli kullandım.

Ardından amazon'daki prosedürü izleyerek yeniden yükleyin: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

Tek fark, başkalarının da karşılaşabileceği izin sorunları nedeniyle sudo -H kullanmam gerekti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.