AWS Cloudfront 0 Минимальное значение TTL и стоимость - PullRequest
0 голосов
/ 29 марта 2019

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

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

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

1 Ответ

1 голос
/ 29 марта 2019

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

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

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

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

A свежий объект может быть предоставлен зрителю без проверки его происхождения.

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

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 обычно играет определенную роль. (Кроме того, HTTP-заголовок Expires может инициировать его, но не используйте Expires - используйте 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

...