Автоматично встановити кеш-контроль для всього відра 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.