Задержка Amazon CloudFront
Я экспериментирую с AWS S3 и CloudFront для разрабатываемого веб-приложения.
В приложении я позволяю пользователям загружать файлы в корзину S3 (используя AWS SDK) и делать их доступными через CloudFront CDN, но проблема заключается в том, что даже когда файлы загружаются и готовятся в корзине S3, это занимает около минуты или 2 будет доступно в URL-адресе CDN CloudFront, это нормально?
3 ответа
CloudFront пытается извлечь не кэшированный контент с исходного сервера в режиме реального времени. Отсутствует "задержка репликации" или аналогичная проблема, потому что CloudFront является сквозной CDN. Каждое пограничное местоположение CloudFront знает только о существовании и конфигурации вашего сайта; он не знает о вашем контенте, пока не получит запросы на него. Когда это происходит, край CloudFront выбирает запрошенный контент с исходного сервера и кэширует его соответствующим образом для обслуживания последующих запросов.
Проблема, возникающая здесь, связана с концепцией, иногда называемой "отрицательное кеширование" - кеширование факта, что запрос не будет работать, - как правило, это делается для того, чтобы избежать возникновения проблемы с тем, что кешируется с запросами, которые могут быть неудачными. тем не мение.
По умолчанию, когда ваш источник возвращает код состояния HTTP 4xx или 5xx, CloudFront кэширует эти ответы об ошибках в течение пяти минут, а затем отправляет следующий запрос объекта вашему источнику, чтобы увидеть, была ли решена проблема, вызвавшая ошибку, и запрошен объект теперь доступен.
- http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html
Если браузер или что-либо еще пытается загрузить файл с этого конкретного ребра CloudFront до завершения загрузки в S3, S3 вернет ошибку, а CloudFront - в этом месте ребра - кеширует эту ошибку и запомнит, следующие 5 минут, чтобы не пытаться снова.
Однако не беспокойтесь - этот таймер настраивается, поэтому, если браузер делает это под капотом и вне вашего контроля, вы все равно сможете его починить.
Вы можете указать продолжительность кэширования ошибок - минимальный TTL кэширования ошибок- для каждого кода состояния 4xx и 5xx, который кэширует CloudFront. Описание процедуры см. В разделе " Настройка поведения ответа на ошибку".
- http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html
Чтобы настроить это в консоли:
При просмотре конфигурации дистрибутива нажмите
Error Pages
Вкладка.Для каждой ошибки, где вы хотите настроить время, начните с нажатия
Create Custom Error Response
,Выберите код ошибки, который вы хотите изменить, из раскрывающегося списка, например:
403
(Запрещено) или404
(Не найдено) - конфигурация вашего сегмента определяет, какой код S3 возвращает для отсутствующих объектов, поэтому, если вы не уверены, измените 403, затем повторите процесс и измените 404.Задавать
Error Caching Minimum TTL (seconds)
в0
Покидать
Customize Error Response
установлен вNo
(Если установленоYes
эта опция включает настраиваемое содержимое ответа на ошибки, а это не то, что вам нужно. Активация этой опции выходит за рамки этого вопроса.)Нажмите
Create
, Это вернет вас к предыдущему виду, где вы увидитеError Caching Minimum TTL
для кода, который вы только что определили.
Повторите эти шаги для каждого HTTP-кода ответа, который вы хотите изменить по сравнению с поведением по умолчанию (это время удержания 300 секунд, рассмотренное выше).
Когда вы внесете все необходимые изменения, вернитесь на главный экран консоли CloudFront, где перечислены дистрибутивы. Подождите, пока состояние распределения не изменится In Progress
в Deployed
(обычно около 20 минут для внесения изменений во все края) и проверка.
Эти новые файлы записываются в S3 впервые или они обновляют существующие файлы? S3 обеспечивает согласованность чтения-после-записи для новых объектов, и учитывая модель извлечения CloudFront, у вас не должно быть этой проблемы с новыми файлами, записанными в S3. Если да, то я бы открыл билет с помощью AWS.
Если это обновления существующих файлов, то вы должны иметь дело как с конечной согласованностью S3, так и с истечением срока действия кэша CloudFront. И то, и другое может вызвать такое поведение.
Как видно из вашего комментария, похоже, что Google Chrome не работает с вашей стратегией загрузки / предварительного просмотра:
- Chrome запрашивает URL, на котором в данный момент нет содержимого.
- запрос кешируется облачным фронтом с неверным ответом
- Вы загружаете файл на S3
- при предварительном просмотре загруженного файла облачный фронт отвечает кэшированным ответом (шаг 2).
- после истечения срока действия кэша облачного фронта он начинает свое существование, и проблема больше не может быть воспроизведена.