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

126

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

thattommyhall
источник

Ответы:

209

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


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

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

  • Войдите в Консоль управления AWS.
  • Перейти в ведро S3
  • Выбрать все файлы по маршруту
  • Выберите «Еще» в меню.
  • Выберите «Изменить метаданные».
  • В поле «Ключ» в раскрывающемся меню выберите «Cache-Control» max-age = 604800Введите (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

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

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». Хотя это решение требует git pull, оно может быть более простым и комплексным.

Полные инструкции см. В сообщении @ ashishyadaveee11 ниже.


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

Дэн Уильямс
источник
6
Спасибо за реальные примеры того, что именно нужно делать. Мне было трудно понять, что вообще возможно, просто читая документы.
danneu
2
Я получаю сообщение «Неизвестные параметры: --metadata-directive, REPLACE», когда выполняю любую из приведенных выше команд. Пожалуйста, помогите мне.
user3722785
1
Обратите внимание, ТЕПЕРЬ ЕСТЬ ЛЕГКИЙ СПОСОБ. Теперь вы можете изменить метаданные для ВСЕХ файлов в корзине через Консоль AWS. См. Ответ CoderBoy ниже: stackoverflow.com/a/47072736/2538952
Мартин Чаммер, 01
1
Обратите внимание, что использование --meta-директивы REPLACE перезапишет все предыдущие метаданные, которые не были скопированы в команде! Например, «gzip с кодировкой содержимого» будет удален, если он явно не добавлен в команду cp.
Хармен Янссен
1
Все ли cpскачивает и заново закачивает?
mlissner
37

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

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

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

biplob
источник
6
Что значит «выбрать все файлы по маршруту»?
Tamzin Blake
1
Выберите все / некоторые файлы из каталога, в котором вы хотите установить мета
biplob
Извините за поздний ответ. Нет, это не так. Вы должны установить его из своего приложения.
biplob
Заменяет ли это предыдущие метаданные или добавляет к ним? (Я не хочу терять все свои типы контента!)
Крис
Я только что подтвердил, что он НЕ удаляет существующие значения.
Устанавливает
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/
ashishyadaveee11
источник
Супер ответ. Спасибо! Есть ли способ обновить ТОЛЬКО те, у которых еще нет этого параметра заголовка?
PKHunter
У кого-нибудь есть подобное решение для использования с окном S3Express?
Joe
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
roens
источник
8

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

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

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

Джефф Эпплфорд
источник
Спасибо, Джефф, я знал о (1), но не (2). Не то, на что я надеялся (хотя, боюсь, это невозможно)
thattommyhall
У вас есть пример команды AWS CLI о том, как выполнить №1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm 04
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
@Wouter, конечно, я нашел вам ссылку, которая действительно может помочь вам легко туда добраться, aaronfagan.ca/blog/2017/… Если вам понадобится помощь или поддержка, я буду более чем счастлив помочь.
Ibrahim Bou Ncoula
Я знаю, что это старый, но я нашел этот ресурс полезным для того, что я искал. Спасибо тебе за это. голосует за тебя, чувак!
castaway2000
1

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

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

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

sudo apt-get install awscli

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

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

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

eliotRosewater
источник