AWS Cloudfront 0 Минимальное значение TTL и стоимость

#amazon-web-services #amazon-cloudfront

#amazon-веб-сервисы #amazon-cloudfront

Вопрос:

Я читал, что Cloudfront теперь поддерживает установку 0 в качестве минимального TTL, мне интересно, как это работает, и влияет ли это на стоимость Cloudfront / AWS S3?

Как Cloudfront узнает, когда изменился файл js или css? Мы загружаем новый файл во время развертывания в S3. Я понятия не имею, указано ли время модификации правильно или нет, но я думаю, что это так.

Главный вопрос в том, дешевле ли установить его равным 0 или подождать 5 минут, как сейчас, и аннулировать js / css в Cloudfront после развертывания. Иногда, когда мы ограничиваемся только изменениями в серверной части, нам не нужно аннулировать. В большинстве случаев у нас также происходят изменения css / js.

Ответ №1:

Minimum TTL редко требуется настройка.

Minimum TTL не определяет минимальное время, в течение которого CloudFront будет кэшировать объект. Так это звучит, но это распространенное заблуждение.

Чтобы прояснить этот момент, позвольте мне сначала уточнить TTL.

TTL (time-to-live) — это значение, которое CloudFront вычисляет внутренне для каждого отдельного объекта с целью определения того, следует ли вообще кэшировать объект, а затем считается ли объект, найденный в кэше, по-прежнему свежим. Если объект находился в кэше меньше времени, чем его TTL, он считается свежим, в противном случае он считается устаревшим.

Просмотрщику может быть предоставлен свежий объект без сверки с источником.

Устаревший объект не следует показывать просмотрщику без подтверждения его происхождения и в конечном итоге его следует удалить.

CloudFront может сохранять устаревший объект в своем кэше в течение некоторого периода времени. (Он может проверить с помощью источника, все ли еще исправен устаревший объект, с помощью условного запроса. Он также может продолжать использовать устаревший объект в ограниченных условиях, включая сбой в вашем источнике).

CloudFront также может в любое время удалить новый объект из своего кэша. Зачем это делать? Место в кэше свободно, поэтому не имеет смысла продолжать хранить все, что кэширует CloudFront, в кэше, если оно не запрашивается. CloudFront может в любое время удалить «непопулярный» объект из кэша.

Из этого, надеюсь, ясно, что TTL — это не «как долго CloudFront будет кэшировать объект?» но скорее «как долго CloudFront будет считать кэшированный объект свежим?»

Если для объекта рассчитанный TTL равен 0, CloudFront не будет кэшировать объект.

Итак … как бы объект получил вычисленное значение 0 TTL? Хотя бы один из этих заголовков в ответе от источника:

 Cache-Control: private
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: s-maxage=0
Cache-Control: max-age=0   // ignored when s-maxage is present
  

Это единственные случаи, Minimum TTL в которых, как правило, играет определенную роль. (Кроме того, Expires HTTP-заголовок может вызвать это, но не используйте Expires — use Cache-Control ).

Cache-Control — как возвращается исходным сервером — в первую очередь предназначено для браузера, но CloudFront также учитывает его при попытке вычислить соответствующий TTL для каждого объекта.

Minimum TTL устанавливает нижнюю границу значения, которое CloudFront будет экстраполировать из Cache-Control заголовка источника, исходя из приведенных выше условий, а меньшие значения округляются в большую сторону. Если ваш источник возвращает (например) Cache-Control: private, no-cache, no-store , это TTL, который должен быть равен 0… но CloudFront устанавливает свой внутренний TTL для этого объекта на большее из 0 или Minimum TTL .

Если бы в ответе было (например) Cache-Control: max-age=15 , то и браузеры, и CloudFront рассчитали бы TTL для этого объекта продолжительностью 15 секунд. Если значение (например) Minimum TTL равно 300, то CloudFront игнорирует 15 секунд, указанные источником, и устанавливает свой внутренний TTL для объекта равным 300 секундам. Браузер по-прежнему будет использовать 15 секунд, поскольку CloudFront не изменяет Cache-Control заголовок ответа.

tl; dr: Minimum TTL это минимальное внутреннее значение TTL, которое CloudFront присвоит объекту, независимо от значений в исходном ответе, которые должны заставить его вычислить меньшее значение. Изменение этого параметра со значения по умолчанию 0 является дополнительным вариантом. В нем не задается минимальное время, необходимое CloudFront для кэширования объектов.

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist