Мне нужно установить заголовки управления кешем для всей корзины s3, как существующих, так и будущих файлов, и я надеялся сделать это в политике корзины. Я знаю, что могу редактировать существующие, и я знаю, как указать их на размещении, если я загружаю их сам, но, к сожалению, приложение, которое их загружает, не может устанавливать заголовки, поскольку оно использует s3fs для копирования файлов туда.
Автоматическая установка управления кешем для всей корзины S3 (с использованием политик корзины?)
Ответы (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
Вот несколько ссылок на руководство, если вам нужна дополнительная информация:
- http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html
- http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#options
Известные проблемы:
"Unknown options: --metadata-directive, REPLACE"
это может быть вызвано устареванием awscli - см. ответ @ eliotRosewater ниже
Инструмент S3cmd
S3cmd - это инструмент командной строки для управления сервисами Amazon S3 и CloudFront. Хотя это решение требует git pull, оно может быть более простым и комплексным.
Полные инструкции см. в сообщении @ ashishyadaveee11 ниже
Надеюсь, это поможет!
cp
все скачивает и заново закачивает?
- person mlissner; 02.11.2019
--cache-control
без REPLACE
, но можете ли вы использовать --metadata-directive COPY --metadata {"cache-control": "max-age=31536000"}
для добавления, а не для замены?
- person Chris; 24.05.2020
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 дней) для значения
- Нажмите кнопку Сохранить
Для выполнения требуется время, в зависимости от ваших файлов корзины. Повторите сначала, если вы случайно закроете браузер.
шаги
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/
Если бы моя репутация была> 50, я бы просто прокомментировал. Но это не так (пока), так что вот еще один полный ответ.
Я уже давно ломаю голову над этой проблемой. Пока я не нашел и не прочитал документы. Поделитесь этим здесь, если это поможет кому-то еще:
- Документация по Amazon CloudFront: Как долго объекты остаются в CloudFront Edge Cache (срок действия)
Что в итоге надежно работало для меня, так это эта команда. Я выбрал время истечения 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
Я не думаю, что вы можете указать это на уровне корзины, но для вас есть несколько обходных путей.
Скопируйте объект в себя на S3, задав соответствующие заголовки
cache-control
для операции копирования.Укажите заголовки ответов в URL-адресах файлов. Для этого вам необходимо использовать предварительно подписанные URL-адреса, но вы можете указать определенные заголовки ответа в строке запроса, включая
cache-control
иexpires
. Полный список доступных параметров см .: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
Вы всегда можете настроить лямбду с триггером для PUTOBJECT на S3, лямбда просто изменит заголовок этого конкретного объекта, который только что был помещен.
Затем вы можете запустить команду копирования, упомянутую выше, в последний раз, и все новые объекты будут исправлены лямбдой.
ОБНОВИТЬ:
Вот с чего можно начать: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects/
Политики корзины должны предоставлять разрешения для корзины и объекта, хранящегося внутри, поэтому этот путь не даст желаемых результатов. Другие ответы изменяют метаданные объекта с помощью автоматических средств, но вы также можете использовать Lambda @ Edge, если хотите переместить ведро за CloudFront.
С помощью Lambda @ Edge вы можете запускать произвольный код для каждого клиентского запроса, и он может изменять заголовки, возвращаемые из источника (в данном случае сегмент S3). Это требует немного дополнительных настроек и стоит немного денег, но вот план решения:
- создать раздачу CloudFront
- добавить ведро S3 в качестве источника
- создать лямбда-функцию, которая изменяет заголовок ответа
- используйте URL-адрес распространения CloudFront для доступа к файлам
В документации AWS есть пример, как изменить заголовки ответа. Если вы используете Terraform для управления инфраструктурой, я написал статья, как это сделать.
Тем, кто пытается использовать ответ Дэна и получает сообщение об ошибке:
«Неизвестные параметры: --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 из-за проблем с разрешениями, с которыми могли столкнуться и другие.