Автоматично встановити кеш-контроль для всього відра S3 (використовуючи політики щодо відра?)


124

Мені потрібно встановити заголовки кеш-керування для цілого відра s3, як існуючих, так і майбутніх файлів, і сподівався це зробити в політиці відра. Я знаю, що можу редагувати існуючі, і я знаю, як вказати їх, якщо я їх завантажую сам, але, на жаль, додаток, який завантажує їх, не може встановити заголовки, оскільки для копіювання файлів туди використовується s3fs.

Відповіді:


208

Зараз існує три способи зробити це: через консоль AWS , через командний рядок або через інструмент командного рядка s3cmd .


Інструкції консолі AWS

Це зараз рекомендоване рішення. Це прямо вперед, але це може зайняти деякий час.

  • Увійдіть до консолі управління AWS
  • Зайдіть у відро S3
  • Виберіть усі файли за маршрутом
  • Виберіть у меню "Більше"
  • Виберіть "Змінити метадані"
  • У полі "Ключ" виберіть "Кеш-контроль" зі спадного меню max-age = 604800Enter (7 днів) для Value
  • Натисніть кнопку "Зберегти"

( спасибі @biplob - будь ласка, дай йому трохи любові нижче )


Рішення командного рядка AWS

Спочатку, коли я створював це правило, не працював, тому я зрозумів, як це зробити за допомогою aws-cli, і це досить гладко. Під час дослідження я не міг знайти жодного прикладу в дикій природі, тому я думав, що опублікую деякі свої рішення, щоб допомогти тим, хто потребує.

ПРИМІТКА: За замовчуванням aws-cli копіює лише поточні метадані файлу, НАКІЛЬКО, ЩО ВИ СПЕЦІФІКУЮТЬ НОВІ МЕТОДИ.

Щоб використовувати метадані, які вказані в командному рядку, вам потрібно додати прапор '--metadata-Directive REPLACE'. Ось кілька прикладів.

Для одного файлу

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

Для всього відра (зверніть увагу - рекурсивний прапор):

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

Трохи я знайшов, якщо ви хочете застосувати його лише до певного типу файлів, вам потрібно виключити всі файли, а потім включити потрібні.

Лише jpgs та 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

Ось декілька посилань на посібник, якщо вам потрібна додаткова інформація:

Відомі проблеми:

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

це може бути викликано застарілою awscli - див. відповідь @ eliotRosewater нижче


Інструмент S3cmd

S3cmd - це "інструмент командного рядка для управління послугами Amazon S3 та CloudFront". Хоча для цього рішення потрібна суттєва тяга, це може бути простішим та всеосяжнішим рішенням.

Повні інструкції див. У публікації @ ashishyadaveee11 нижче


Сподіваюся, це допомагає!


6
Дякуємо за фактичні приклади того, що саме потрібно робити. У мене виникли проблеми з відкриттям того, що було можливо, лише читаючи документи.
danneu

2
Коли я виконую будь-яку з вищевказаних команд, я отримую "Невідомі параметри: --метада-директива, ЗАМІНА".
користувач3722785

1
Зауважте, ЗАРАЗ Є ПРОСТО ШЛЯХОМ. Тепер ви можете змінити метадані для ВСІХ файлів у відрі через консоль AWS. Див відповідь CoderBoy в нижче: stackoverflow.com/a/47072736/2538952
Мартін Tschammer

1
Зауважте, що використання --meta-директива REPLACE замінить будь-які попередні метадані, які не скопійовані в команді! Наприклад, "gzip-кодування вмісту" буде видалено, коли не буде явно додано до команди cp.
Хармен Янссен

1
Чи все cpзавантажує і перезавантажує?
mlissner

37

Тепер це легко змінюється з консолі AWS.

  • Увійдіть до консолі управління AWS
  • Зайдіть у відро S3
  • Виберіть усі файли за маршрутом
  • Виберіть у меню "Більше"
  • Виберіть "Змінити метадані"
  • У полі "Ключ" виберіть зі спадного меню "Кеш-контроль"
  • max-age = 604800Enter (7 днів) для значення
  • Натисніть кнопку "Зберегти"

Виконання потрібен час залежить від ваших файлів відра. Повторіть спочатку, якщо випадково закриєте браузер.


6
Що означає "виділити всі файли за маршрутом"?
Тамзін Блейк

1
Виберіть усі / деякі файли з каталогу, в який ви хочете встановити мета
biplob

Вибачте за пізню відповідь. Ні, це не так. Ви повинні встановити це зі своєї програми.
біблоб

Чи замінює це попередні метадані чи додає до них? (Я не хочу втрачати всі свої типи вмісту!)
Кріс,

Я щойно підтвердив, що НЕ видаляє існуючі значення. Встановлює лише вказані вами ключі (перезапис ключа, якщо він існує)
rynop

21

кроки

  1. git clone https://github.com/s3tools/s3cmd
  2. Запустіть s3cmd --configure (вам буде запропоновано два ключі - скопіюйте та вставте їх зі свого електронного листа з підтвердженням або зі сторінки свого облікового запису Amazon. Будьте обережні, копіюючи їх! Вони чутливі до регістру і повинні бути введені точно, або ви будете отримувати помилки щодо недійсних підписи чи подібне. Не забудьте додати s3:ListAllMyBucketsдозволи до ключів, або ви отримаєте AccessDeniedпомилку під час тестування доступу.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

Супер відповідь. Дякую! Чи є спосіб ТОЛЬКО оновити ті, у яких ще немає цього параметра заголовка?
PKHunter

Хтось має подібне рішення для використання з вікном S3Express?
Джо

12

Якщо моя оцінка репутації була> 50, я б просто прокоментував. Але це не (поки), ось ось ще одна повна відповідь.


Я певний час стукав головою про цю проблему. Поки я не знайшов і не прочитав документи. Поділіться цим тут, якщо це допомагає комусь іншому:

Що надійно працювало для мене, це ця команда. Я вибрав час тестування на 1 секунду для перевірки очікуваних результатів:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEпотрібна, коли " cp" модифікуються метадані в існуючому файлі в S3
  • max-age встановлює вік кешування браузера в секундах
  • s-maxage встановлює кешування CloudFront, за секунди

Так само, якщо встановити ці значення заголовка Cache-Control у файлі під час завантаження в S3, команда виглядатиме так:

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

8

Я не думаю, що ви можете вказати це на рівні відра, але для вас є кілька обхідних шляхів.

  1. Скопіюйте об'єкт на себе на S3, встановивши відповідні cache-controlзаголовки для операції копіювання.

  2. Вкажіть заголовки відповідей у ​​URL-адресі файлів . Для цього вам потрібно використовувати попередньо підписані URL-адреси, але ви можете вказати певні заголовки відповідей у ​​рядку запитів, включаючи cache-controlта expires. Повний список доступних параметрів див: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


Дякую Джеффу, я знав про (1), але не (2). Не те, на що я сподівався (хоча я боюся, що це неможливо)
1212

Чи є у вас приклад команди AWS CLI про те, як зробити №1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

Ви завжди можете налаштувати лямбда з тригером на PUTOBJECT на S3, лямбда просто змінить заголовок цього конкретного об'єкта, який щойно був поставлений.

Тоді ви можете запустити команду копіювання, згадану вище, останній раз, і всі нові об'єкти будуть зафіксовані лямбда.

ОНОВЛЕННЯ:

Тут ви зможете почати з: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


Чи можете ви надати ще детальну інформацію про те, як зробити цю лямбу? Звучить як чудове рішення.
Wouter

1
@ Безумовно, я знайшов вам посилання, яке насправді може допомогти вам легко дістатися туди, aaronfagan.ca/blog/2017/… Якщо вам потрібна допомога чи підтримка, я з радістю допоможу.
Ібрагім Bou Ncoula

я знаю, що це старе, але я знайшов цей ресурс корисним для того, що я шукав. дякую за це для тебе мій чувак!
castaway2000

1

Для тих, хто намагається використати відповідь Дана та отримати помилку:

"Невідомі параметри: - метаданих-директива, ЗАМІНА"

Я зіткнувся з проблемою, і проблема полягала в тому, що я встановив awscli за допомогою

sudo apt-get install awscli

Тут було встановлено стару версію awscli, у якій відсутня команда --metadata-direktiva. Тому я використовував sudo apt-get remove awscli, щоб видалити його.

Потім перевстановлюється, виконуючи процедуру з amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

Єдина відмінність полягає в тому, що мені довелося використовувати sudo -H через проблеми з дозволом, з якими також можуть зіткнутися інші.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.