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

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

Ответ 1

Теперь есть 3 способа сделать это: через Консоль AWS, через командную строку или через инструмент командной строки s3cmd.


Инструкции для консоли AWS

Теперь это рекомендуемое решение. Это прямо вперед, но это может занять некоторое время.

  • Войдите в консоль управления AWS
  • Войдите в ведро S3
  • Выбрать все файлы по маршруту
  • Выберите "Больше" из меню
  • Выберите "Изменить метаданные"
  • В поле "Ключ" выберите "Cache-Control" в раскрывающемся меню max-age = 604800Enter (7 дней) для значения
  • Нажмите кнопку "Сохранить"

(спасибо @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

Для целого сегмента (обратите внимание на флаг --recursive):

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 и 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

Вот несколько ссылок на руководство, если вам нужна дополнительная информация:

Известные вопросы:

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

это может быть вызвано устаревшей информацией - см. ответ @eliotRosewater ниже


Инструмент S3cmd

S3cmd - это "инструмент командной строки для управления сервисами Amazon S3 и CloudFront". Хотя это решение требует осторожного подхода, оно может быть более простым и всеобъемлющим.

Для полных инструкций, см. @Ashishyadaveee11 сообщение ниже


Надеюсь, поможет!

Ответ 2

Теперь это может легко измениться с консоли AWS.

  • Вход в консоль управления AWS
  • Перейдите в ведро S3
  • Выбрать все файлы по маршруту
  • Выберите "Дополнительно" в меню
  • Выберите "Изменить метаданные"
  • В поле "Ключ" выберите "Cache-Control" в раскрывающемся меню
  • max-age = 604800Enter (7 дней) для значения
  • Нажмите кнопку "Сохранить"

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

Ответ 3

шаги

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

Ответ 4

Я не думаю, что вы можете указать это на уровне ковша, но для вас есть несколько обходных решений.

  • Скопируйте объект себе на S3, установив соответствующие заголовки cache-control для операции копирования.

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

Ответ 5

Если бы мой рейтинг репутации был> 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

Ответ 6

Тем, кто пытается использовать Дэн, отвечает и получает ошибку:

"Неизвестные параметры: - metadata-directive, REPLACE"

Я столкнулся с проблемой, и проблема заключалась в том, что я установил awscli с помощью

sudo apt-get install awscli

Это установило старую версию awscli, которая не указала команду -metadata-directive. Поэтому я использовал sudo apt-get remove awscli, чтобы удалить его.

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

Единственное различие заключается в том, что я должен был использовать sudo -H из-за проблем с разрешениями, которые могут возникнуть и у других.

Ответ 7

Вы всегда можете настроить лямбда с триггером на PUTOBJECT на S3, лямбда просто изменит заголовок этого конкретного объекта, который только что был помещен.

Затем вы можете запустить команду копирования, упомянутую выше в последний раз, и все новые объекты будут исправлены с помощью лямбда.

UPDATE:

Вот хорошее место для начала: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects/