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

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


person thattommyhall    schedule 03.05.2012    source источник


Ответы (8)


Теперь есть 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 ниже


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

person Dan Williams    schedule 26.03.2015
comment
Спасибо за реальные примеры того, что именно нужно делать. Мне было трудно понять, что вообще возможно, просто читая документы. - person danneu; 27.06.2015
comment
Я думаю, что некоторые браузеры не принимают даты позже 2035 года. В остальном очень круто, спасибо за примеры. - person someuser; 11.10.2015
comment
Я получаю Неизвестные параметры: --metadata-directive, REPLACE, когда я выполняю любую из приведенных выше команд. Пожалуйста, помогите мне. - person user3722785; 14.07.2016
comment
@ user3722785 '\' используется для расширения команды до нескольких строк. Если его удалить, он будет работать идентично, вам просто нужно будет запустить всю команду в одной строке. Надеюсь, это поможет объяснить вещи! - person Dan Williams; 16.07.2017
comment
Обратите внимание, ТЕПЕРЬ ЕСТЬ ЛЕГКИЙ СПОСОБ. Теперь вы можете изменить метаданные для ВСЕХ файлов в корзине через Консоль AWS. См. Ответ CoderBoy ниже: stackoverflow.com/a/47072736/2538952 - person Martin Tschammer; 01.12.2017
comment
Обратите внимание, что использование --meta-директивы REPLACE перезапишет все предыдущие метаданные, которые не были скопированы в команде! Например, gzip с кодированием содержимого будет удален, если он явно не добавлен в команду cp. - person Harmen Janssen; 21.10.2019
comment
cp все скачивает и заново закачивает? - person mlissner; 02.11.2019
comment
@HarmenJanssen упоминает об этом, но я это пропустил. Если вы запустите это, вы удалите все предыдущие метаданные. Если вы используете S3 в качестве CDN, это означает, например, что ваши изображения будут загружаться, а не отображаться в браузере. Вы не можете использовать --cache-control без REPLACE, но можете ли вы использовать --metadata-directive COPY --metadata {"cache-control": "max-age=31536000"} для добавления, а не для замены? - person Chris; 24.05.2020
comment
Вы также можете использовать свойство CacheControl для клиента S3 при загрузке объектов в соответствии с документами SDK docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ - person Herbert Pimentel; 28.06.2020
comment
Я считаю, что кеш-контроль или истекает не "а" ... Верно? - person Mark; 17.07.2020
comment
Есть ли способ автоматически установить политику кеширования файла, если он будет заменен новой версией? - person Mukul Munjal; 26.05.2021
comment
В моем случае я синхронизирую папку с ведром s3 вместо одного файла. поэтому я использовал aws s3 cp s3://BucketName/index.html s3://BucketName/index.html --metadata-directive REPLACE --cache-control max-age=0,no-store,must-revalidate - person JSAddict; 29.06.2021

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

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

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

person biplob    schedule 02.11.2017
comment
Что значит выбрать все файлы по маршруту? - person Tamzin Blake; 20.03.2018
comment
Выберите все / некоторые файлы из каталога, в котором вы хотите установить мета - person biplob; 21.03.2018
comment
Извините за поздний ответ. Нет, это не так. Вы должны установить его из своего приложения. - person biplob; 27.04.2018
comment
Заменяет ли это предыдущие метаданные или добавляет к ним? (Я не хочу терять все свои типы контента!) - person Chris; 24.05.2020
comment
Я только что подтвердил, что он НЕ удаляет существующие значения. Устанавливает только указанные вами ключи (перезапись ключа, если он существует) - person rynop; 17.06.2020
comment
max-age = 604800 Введите (7 дней) для значения, что это значит ?? - person insivika; 15.12.2020

шаги

  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/
person ashishyadaveee11    schedule 04.02.2016
comment
Супер ответ. Спасибо! Есть ли способ обновить ТОЛЬКО те, у которых еще нет этого параметра заголовка? - person PKHunter; 20.02.2017
comment
У кого-нибудь есть подобное решение для использования с окном S3Express? - person Joe; 26.07.2017

Если бы моя репутация была> 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
person roens    schedule 01.02.2018

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

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

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

person Geoff Appleford    schedule 04.05.2012
comment
Спасибо, Джефф, я знал о (1), но не (2). Не то, на что я надеялся (хотя, боюсь, это невозможно) - person thattommyhall; 08.05.2012
comment
У вас есть пример команды AWS CLI о том, как выполнить №1? docs.aws.amazon.com/cli/latest/reference/ s3 / cp.html - person dpegasusm; 04.09.2014

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

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

ОБНОВИТЬ:

Вот с чего можно начать: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects/

person Ibrahim Bou Ncoula    schedule 03.06.2017
comment
Не могли бы вы подробнее рассказать, как приготовить эту ламбу? Похоже на отличное решение. - person Wouter; 18.07.2017
comment
@Wouter, конечно, я нашел вам ссылку, которая действительно может помочь вам легко туда добраться, aaronfagan.ca/blog/2017/ Если вам нужна помощь или поддержка, я буду более чем счастлив помочь . - person Ibrahim Bou Ncoula; 21.07.2017
comment
Я знаю, что это старый, но я нашел этот ресурс полезным для того, что я искал. Спасибо тебе за это. голосует за тебя, чувак! - person castaway2000; 22.02.2018

Политики корзины должны предоставлять разрешения для корзины и объекта, хранящегося внутри, поэтому этот путь не даст желаемых результатов. Другие ответы изменяют метаданные объекта с помощью автоматических средств, но вы также можете использовать Lambda @ Edge, если хотите переместить ведро за CloudFront.

С помощью Lambda @ Edge вы можете запускать произвольный код для каждого клиентского запроса, и он может изменять заголовки, возвращаемые из источника (в данном случае сегмент S3). Это требует немного дополнительных настроек и стоит немного денег, но вот план решения:

  • создать раздачу CloudFront
  • добавить ведро S3 в качестве источника
  • создать лямбда-функцию, которая изменяет заголовок ответа
  • используйте URL-адрес распространения CloudFront для доступа к файлам

В документации AWS есть пример, как изменить заголовки ответа. Если вы используете Terraform для управления инфраструктурой, я написал статья, как это сделать.

person Tamás Sallai    schedule 31.08.2020

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

«Неизвестные параметры: --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 из-за проблем с разрешениями, с которыми могли столкнуться и другие.

person eliotRosewater    schedule 16.10.2016