Как вы делаете недействительным кеш index.html для статического сайта, размещенного на S3 с облачным?
Итак, я разместил приложение angular на s3 с облачным диском. Я делаю обновление файла (используя grunt filerev), чтобы убедиться, что я никогда не получаю устаревшее содержимое. Но как я должен изменить файл index.html. Его необходимо, потому что все другие файлы ссылаются на index.html.
Я сконфигурировал свой ковш для использования в качестве статического сайта. Поэтому он просто подбирает index.html, когда я ссылаюсь на ведро в URL-адресе.
Cloudfront говорит, что вы должны установить min TTL равным 0, поэтому он всегда будет удалять исходный код, чтобы обслуживать контент. Но мне это не нужно, поскольку я выполняю проверку файлов всех моих файлов (кроме index.html). Я могу использовать кэширование cdn для этих файлов.
Они также говорят, что для того, чтобы сделать недействительным один объект, установите максимальные заголовки в 0. Я попытался добавить следующее к моему index.html
<meta http-equiv="Cache-Control" content="public, must-revalidate, proxy-revalidate, max-age=0"/>
Но это не отражается после загрузки на s3. Нужно ли явно указывать заголовки на s3 с помощью s3cmd или панели мониторинга? И нужно ли это делать каждый раз, когда index.html изменяется, и я его загружаю?
Мне известно, что я могу сделать недействительным один файл, используя cmd, но его повторяющийся процесс. Было бы здорово, если бы он мог позаботиться о себе, просто развернув на s3.
Ответы
Ответ 1
Хотя принятый ответ правильный, если вы используете s3cmd, я использовал AWS CLI, поэтому я сделал следующие две команды:
Во-первых, для фактического развертывания кода:
aws s3 sync ./ s3://bucket-name-here/ --delete
Затем, чтобы создать недействительность на CloudFront:
aws cloudfront create-invalidation --distribution-id <distribution-id> --paths /index.html
Ответ 2
Отвечая на мой вопрос. Я развертываю свой сайт на S3 с помощью s3cmd
tool, и есть опция, которую вы могли бы предоставить, чтобы недействить кэш CloudFront всех измененных файлов (diff между вашей папкой dist
и ведро S3). Это делает недействительным кеш всех файлов, включая индексный файл. Обычно это занимает около 15-20 минут, чтобы отразить новые изменения в производстве.
Вот команда
s3cmd sync --acl-public --reduced-redundancy --delete-removed --cf-invalidate [your-distribution-folder]/* s3://[your-s3-bucket]
Примечание. В macOS вы можете установить этот инструмент с помощью: brew install s3cmd
.
Надеюсь, что это поможет.
Ответ 3
Вы можете автоматизировать процесс с помощью Lambda. Он позволяет вам создать функцию, которая будет выполнять определенные действия (недействительность объекта в вашем случае) в ответ на определенные события (новый файл на S3).
Дополнительная информация здесь:
https://aws.amazon.com/documentation/lambda/
Ответ 4
Если вы используете s3cmd sync
и используете опцию --cf-invalidate
, возможно, вам придется указать --cf-invalidate-default-index
в зависимости от вашей установки.
На странице man:
При использовании статического веб-сайта Custom Origin и S3 аннулируйте индексный файл по умолчанию.
Это обеспечит также недействительность вашего индексного документа, скорее всего index.html, который в противном случае будет пропущен независимо от того, обновляется или нет через синхронизацию.
Ответ 5
При синхронизации локального каталога с s3 вы можете сделать это:
aws s3 sync ./dist/ s3://your-bucket --delete
aws s3 cp \
s3://your-bucket s3://your-bucket \
--exclude 'index.html' --exclude 'robots.txt' \
--cache-control 'max-age=604800' \
--metadata-directive REPLACE --acl public-read \
--recursive
Первая команда - это просто обычная синхронизация, вторая команда разрешает S3 возвращать управление кешем для всех файлов, кроме index.html
и robots.txt
.
Затем ваш SPA может быть полностью кэширован (кроме index.html
).
Ответ 6
Реальный вопрос заключается в том, почему вы должны делать все это, чтобы сделать что-то настолько простое, что большинство других провайдеров/решений используют графический интерфейс пользователя и простую точку и щелчок. Именно поэтому я предпочитаю не использовать S3, если мой клиент не требует этого. Garbage.