Статьи

Динамическое кеширование контента с помощью AWS Lambda, S3 и AWS CloudFront

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

В этом примере мы покажем вам, как изображения можно извлекать и преобразовывать с помощью функции AWS Lambda, локально кэшировать в краевых местоположениях CloudFront и как аннулировать эти кэши при обновлении кэшированного изображения на исходном сервере. Этот подход может быть применен к любому другому типу контента.

1. Что такое Amazon CloudFront?

Amazon CloudFront — это веб-служба сети доставки контента (CDN), предлагаемая AWS (Amazon Web Services), которая позволяет контенту быть доступным в нескольких периферийных точках по всему миру. В настоящее время Amazon CloudFront предлагает 149 периферийных местоположений и 11 региональных пограничных кэшей .

2. Что такое AWS Lambda?

AWS Lambda — это управляемая событиями, серверная вычислительная платформа, которая запускает код без подготовки или управления серверами. AWS Lambda выполняет код (функции) на основе триггеров событий. Например, простым случаем использования было бы то, что каждый раз, когда изображение загружается в корзину S3, лямбда-функция может запускаться для преобразования и изменения размера изображения. Функции AWS Lambda также можно выполнять через API, созданный с помощью AWS API Gateway .

3. Что такое Amazon S3?

AWS S3 (Simple Storage Service) — это недорогая, безопасная, долговечная, высокодоступная и горизонтально масштабируемая служба хранения объектов, где данные можно хранить, получать к ним доступ и легко создавать резервные копии. Вы можете хранить любое количество информации из любого места.

4. Получить изображения с сервера происхождения и хранить в S3

Допустим, у вас есть медиа-сервер, на котором размещены все изображения, необходимые для вашего веб-сайта, и предположим, что этот сервер может инициировать уведомление при обновлении существующего изображения или добавлении нового изображения. Используя AWS Lambda, эти изображения могут быть извлечены, преобразованы, изменены в размере и сохранены в корзину S3.

Кэширование динамического содержимого - получение изображения с сервера происхождения
Рисунок 1: Извлечение изображения из Origin Server с использованием Lambda

На приведенной выше диаграмме на рисунке 1 показана функция AWS Lambda, которая извлекает необработанные изображения с медиа-сервера, преобразует их и отправляет в корзину S3. Он также прослушивает очередь сообщений для обновлений изображений, опубликованных сервером мультимедиа, и обновляет изображения в S3.

5. Кэширование контента с помощью Amazon CloudFront

Amazon CloudFront ускоряет доставку вашего контента через Edge-кэши. Когда пользователь получает доступ к вашему веб-сайту или приложению и запрашивает контент, запрос направляется в ближайший край CloudFront. Только для первого пользователя будет задержка при извлечении контента, и все последующие пользователи того же контента смогут быстро извлекать контент, так как контент будет кэшироваться в крайнем местоположении.

Ниже описан процесс, который происходит по запросу пользователя на контент:

  • CloudFront проверяет свой кеш на наличие запрошенного объекта. Если запрошенный объект найден в кеше, он будет возвращен.
  • Если запрошенный объект не найден в кеше CloudFront,
    • Запрос будет перенаправлен на настроенный сервер Origin . Исходный сервер может быть S3 Bucket, Custom HTTTP Server или любым другим сервером.
    • CloudFront кэширует объект, возвращенный с Origin Server в ближайшем пограничном местоположении, и возвращает его пользователю.

Объекты в CloudFront могут кэшироваться для настроенного TTL (Time-To-Live), и после истечения TTL объект больше не будет доступен для обслуживания из кэша, как показано на рисунке 2.

Кэширование динамического содержимого - Кэширование содержимого изображения
Рисунок 2: Кэширование содержимого изображения с помощью CloudFront

6. Как настроить CloudFront на консоли AWS

Для настройки CloudFront необходимо создать первый дистрибутив CloudFront. Выберите распространение через Интернет для распространения контента и распространение через RMTP для потоковой передачи мультимедийных файлов. Для этого случая давайте выберем распространение через Интернет.

6.1 Создание дистрибутива CloudFront

Войдите в консоль AWS -> выберите CloudFront Service -> создать рассылку -> выберите раздачу в Интернете -> приступить к работе

Чтобы использовать S3 в качестве сервера происхождения, в качестве имени домена источника выберите сегмент S3, который уже создан. В поле « Путь к источнику» введите путь к каталогу, в котором хранятся объекты. Чтобы использовать пользовательский HTTP-сервер в качестве исходного сервера, в поле « Имя домена источника» введите DNS-имя настраиваемого исходного сервера, а в поле « Путь источника» введите путь контекста.

Чтобы использовать S3 в качестве сервера происхождения, в качестве имени домена источника выберите сегмент S3, который уже создан. В поле « Путь к источнику» введите путь к каталогу, в котором хранятся объекты. Чтобы использовать настраиваемый HTTP-сервер в качестве сервера происхождения, в качестве имени домена источника введите DNS-имя настраиваемого сервера происхождения , а в поле « Путь источника» введите путь контекста, как показано на рисунке 3.

Кэширование динамического содержимого - создание дистрибутива CloudFront
Рисунок 3: Создание дистрибутива CloudFront из консоли AWS

6.2 Настройки поведения кэша

Если вы хотите разрешить только HTTPS-доступ, включите Redirect HTTP to HTTPS. В объектном кэшировании, если выбран «Использовать заголовки кэша Origin», тогда CloudFront будет использовать заголовок Cache-Control ( max-age ) из ответа Origin Server, если только не будет возвращено « s-max-age », и в этом случае s-max- возраст используется.

Если вы выберете « Настроить» (для кеширования объектов ), вы можете настроить «Минимальный TTL», «Максимальный TTL» и «Стандартный TTL», как показано на рисунке 4.

  • Минимальный TTL — это количество времени (в секундах), в течение которого объект находится в кэше, прежде чем CloudFront направит запрос на сервер Origin. Объект кэшируется в течение минимального времени, даже если заголовок Cache-control от Origin Server имеет меньшее значение.
  • Макс. TTL — это количество времени (в секундах), в течение которого объект находится в кэше, прежде чем CloudFront направит запрос на Origin Server. Макс. TTL действует только тогда, когда исходный сервер возвращает заголовки Cache-control. Объект не будет кэшироваться дольше, чем этот, даже если заголовок Cache-Control с Origin Server имеет более высокое значение.
  • TTL по умолчанию действует только тогда, когда Origin Server не возвращает никаких заголовков Cache-control.
Кэширование динамического содержимого - настройки поведения кэша
Рисунок 4: Настройки поведения кэша в CloudFront Distribution

6.3 Белый список параметров запроса

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

Кэширование динамического содержимого - параметры запроса белого списка
Рисунок 5 : Параметры запроса белого списка в CloudFront

Создайте запись псевдонима, чтобы сопоставить запись CNAME Route53 с URL- адресом распространения CloudFront, поэтому запрос к псевдониму будет сопоставлен с распределением CloudFront, а затем с источником.

7. Признание недействительными кэшированных объектов в CloudFront

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

Из документации AWS вы можете получать запросы на аннулирование до 3 000 файлов для каждого процесса распространения одновременно, и каждый запрос на аннулирование может включать до 3000 URL-адресов. Обратите внимание, что после запуска аннулирования кэша CloudFront, CloudFront требуется несколько минут, чтобы удалить объекты со всех краевых мест. то есть может потребоваться некоторое время, чтобы получить результат признания недействительным. Время, необходимое для аннулирования, зависит от количества URL-адресов объектов, включенных в запрос на аннулирование.

7.1 Инвалидирование объектов из консоли AWS

Ниже приведены шаги, которые необходимо выполнить для аннулирования кэшированных объектов из консоли AWS.

  • Войдите в консоль управления AWS и откройте консоль CloudFront.
  • Выберите дистрибутив, для которого вы хотите сделать файлы недействительными.
  • Выберите «Настройки распространения», а затем перейдите на вкладку «Аннулирования».
  • Выберите Создать недействительность и введите путь недействительности, например, «originserver / image / IMG54330080 *». Этот подстановочный путь удаляет все изображения, кэшированные для imageId « IMG54330080 »

7.2. Инвалидация объектов с использованием CLI (интерфейс командной строки)

Следующая команда создает недействительность для распространения CloudFront для данного идентификатора распространения. Синтаксис команды:

1
aws cloudfront create-invalidation --DistributionId --paths

Пример:

1
aws cloudfront create-invalidation --distribution-id K14EK9G5DZUEWO  --paths /originserver/image/IMG54330080*

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
{
     "Invalidation": {
         "Id": "IUNZX941WYQR8",
         "Status": "InProgress",
         "CreateTime": "2019-01-17T17:07:57.636Z",
         "InvalidationBatch": {
             "Paths": {
                 "Quantity": 1,
                 "Items": [
                     "/originserver/image/IMG54330080*"
                 ]
             },
             "CallerReference": "cli-324234242-463845"
         }
     }
 }

7.3. Проверка объектов через AWS SDK

Следующий фрагмент кода Java предназначен для аннулирования объектов через Amazon SDK.

01
02
03
04
05
06
07
08
09
10
11
12
13
AWSCredentials awsCredentials = new DefaultAWSCredentialsProviderChain().getCredentials();
 
AmazonCloudFrontClient client = new AmazonCloudFrontClient(awsCredentials);
 
Paths invalidation_paths = new Paths().withItems("/originserver/image/IMG54330080*", "/image/path/imageA.jpg").withQuantity(1);
 
InvalidationBatch invalidation_batch = new InvalidationBatch(invalidation_paths, "Asset_Image_Cache");
 
CreateInvalidationRequest invalidation = new CreateInvalidationRequest("distributionID", invalidation_batch);
 
CreateInvalidationResult ret = client.createInvalidation(invalidation);
 
System.out.println("Invalidation result: " + ret.toString());

Если вы настроили CloudFront для пересылки параметров запроса на сервер Origin, вы должны включить параметры запроса при аннулировании файлов, поскольку CacheKey был создан с параметрами запроса, включенными во время создания кэша. Например

В качестве альтернативы вы можете использовать подстановочный знак * в URL аннулирования. Обратите внимание, что в этом случае все записи кэша с CacheKeys, совпадающими с URL (с подстановочными знаками), будут признаны недействительными. Например

Лямбда-функция AWS также может использоваться для аннулирования объектов CloudFront при загрузке нового / обновленного объекта в S3.

На рисунке 6 показано, когда обновленный объект загружается на S3, запускается лямбда-функция, которая делает недействительным объект в CloudFront Cache.

Динамическое кеширование контента - делает недействительными объекты CloudFront
Рисунок 6 : Инвалидация объектов CloudFront через функцию Lambda

8. Резюме

AWS CloudFront — это мощная служба кэширования контента, которая позволяет быстро предоставлять контент пользователям вашего веб-сайта или приложения, не беспокоясь о том, где размещен веб-сайт или приложение и откуда пользователи обращаются к вашему приложению. Использование этого сервиса вместе с другими сервисами AWS, такими как Lambda, S3 и т. Д., Помогает создать динамический кеш, поэтому пользователи могут получать данные практически в реальном времени. Также возможно аннулировать кэш CloudFront Object, если это необходимо.