Мне нужно установить заголовки управления кешем для всего массива s3, как существующих, так и будущих файлов, и надеялся сделать это в политике ведра. Я знаю, что могу редактировать существующие, и я знаю, как их указать, если я загружаю их самостоятельно, но, к сожалению, приложение, которое их загружает, не может установить заголовки, поскольку использует s3fs для копирования там файлов.
Установить кеш-контроль для всего ведра S3 автоматически (используя политики ведра?)
Ответ 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
Вот несколько ссылок на руководство, если вам нужна дополнительная информация:
- 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"
это может быть вызвано устаревшей информацией - см. ответ @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, я бы просто прокомментировал. Но это не (пока), поэтому здесь еще один полный ответ.
Я уже давно бьюсь над этой проблемой. Пока я не нашел и не прочитал документы. Делимся этим здесь на случай, если это кому-нибудь еще поможет:
- Документация 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
Ответ 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/