Lambda@Edge и событийно-ориентированные шаблоны
Запускайте функции в периферийных местоположениях CloudFront и подключайте Lambda к SQS, SNS, потокам DynamoDB и Kinesis для событийно-ориентированных архитектур.
«Lambda@Edge и событийно-ориентированные шаблоны» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 4 уроков всего.
Что такое Lambda@Edge
Lambda@Edge позволяет запускать функции Lambda в пограничных местоположениях CloudFront по всему миру — ближе к конечным пользователям, чем в централизованном регионе. Это позволяет настраивать HTTP-запросы и ответы, добавляя менее миллисекунды задержки на уровне CDN. Функции Lambda@Edge развёртываются глобально и вызываются при каждом событии попадания или промаха кэша CloudFront, поэтому идеально подходят для лёгкой обработки запросов.
Четыре точки запуска CloudFront
Lambda@Edge может перехватывать трафик в четырёх точках жизненного цикла запроса CloudFront:
- Запрос от Viewer: выполняется, когда CloudFront получает запрос от пользователя, до проверки кэша
- Запрос к Origin: выполняется, когда CloudFront пересылает промах кэша источнику
- Ответ от Origin: выполняется, когда источник возвращает ответ, до его кэширования
- Ответ для Viewer: выполняется перед возвратом ответа пользователю через CloudFront
Ограничения Lambda@Edge по сравнению с обычной Lambda
Lambda@Edge имеет более строгие ограничения, чем обычная Lambda: максимум 128 MB памяти (события Viewer), 1 GB (события Origin), максимальный тайм-аут 5 секунд (Viewer) и 30 секунд (Origin). Функции необходимо создавать в us-east-1 и развёртывать на периферии через CloudFront. Поддержка VPC, переменных среды и слоёв Lambda отсутствует. Поэтому Lambda@Edge предназначена для лёгких преобразований, а не для ресурсоёмкой обработки.
Распространённые варианты использования Lambda@Edge
Lambda@Edge особенно хорошо подходит для: A/B-тестирования (перезапись URL на разные пути источника на основе файлов cookie), аутентификации (проверка JWT на периферии до пересылки запроса источнику), изменения HTTP-заголовков (добавления заголовков безопасности, таких как HSTS, CSP и X-Frame-Options), нормализации URL (перенаправления с www на вариант без www или принудительного добавления завершающих косых черт) и персонализации (выдача разного содержимого в зависимости от страны пользователя из заголовка CloudFront-Viewer-Country).
// Viewer Request: Add security headers
exports.handler = async (event) => {
const response = event.Records[0].cf.response;
response.headers['strict-transport-security'] = [{
key: 'Strict-Transport-Security',
value: 'max-age=63072000; includeSubdomains; preload'
}];
response.headers['x-frame-options'] = [{
key: 'X-Frame-Options',
value: 'DENY'
}];
return response;
};CloudFront Functions и Lambda@Edge
CloudFront Functions — это сверхлёгкие функции JavaScript, работающие только на этапах запроса и ответа Viewer, с ограничением времени выполнения 2 ms и значительно меньшей стоимостью. Для простых задач (перезаписи URL, изменения заголовков и нормализации ключа кэша) предпочтительнее CloudFront Functions, поскольку они быстрее и дешевле Lambda@Edge. Используйте Lambda@Edge, если Вам нужен доступ к сетевым вызовам, более крупным полезным нагрузкам или точкам запуска запроса и ответа Origin.
Архитектура, управляемая событиями, с Lambda
Архитектура, управляемая событиями, соединяет сервисы с помощью событий — сообщений, представляющих то, что произошло. В AWS Lambda является основным потребителем событий: она получает события из SQS, SNS, DynamoDB Streams, Kinesis, S3, EventBridge и других источников. Каждое событие запускает выполнение Lambda, благодаря чему системы могут реагировать асинхронно и независимо, без тесной связанности. Этот шаблон обеспечивает слабую связанность, независимое масштабирование и изоляцию сбоев.
Lambda как потребитель SQS
Lambda можно настроить как сопоставление источника событий для SQS. Lambda опрашивает очередь, получает до размера пакета сообщений (до 10 000 для стандартных очередей и 10 для FIFO) и один раз вызывает функцию для каждого пакета. Если функция завершается с ошибкой, весь пакет возвращается в очередь. Настройте окно формирования пакета, чтобы подождать дополнительные сообщения перед вызовом функции и повысить пропускную способность. Для сообщений, которые неоднократно обрабатываются с ошибкой, используйте DLQ в исходной очереди SQS.
aws lambda create-event-source-mapping \
--function-name 'OrderProcessor' \
--event-source-arn 'arn:aws:sqs:us-east-1:123456789012:OrderQueue' \
--batch-size 10 \
--maximum-batching-window-in-seconds 5Lambda и DynamoDB Streams
DynamoDB Streams фиксируют каждое изменение на уровне элемента (INSERT, MODIFY, REMOVE) в виде упорядоченной последовательности событий. Lambda читает поток с помощью сопоставления источника событий, используя TRIM_HORIZON (начать с самых старых записей) или LATEST (начать с самых новых). Lambda обрабатывает записи в порядке внутри раздела. Пакеты с ошибками блокируют дальнейшую обработку того же раздела до устранения проблемы — используйте разделение пакета при ошибке, чтобы разделять неудачные пакеты и изолировать проблемные записи.
aws lambda create-event-source-mapping \
--function-name 'StreamProcessor' \
--event-source-arn 'arn:aws:dynamodb:us-east-1:123456789012:table/Orders/stream/...' \
--starting-position TRIM_HORIZON \
--batch-size 100 \
--bisect-batch-on-function-errorLambda и потоки данных Kinesis
Lambda обрабатывает записи Kinesis так же, как записи DynamoDB Streams, — одно параллельное выполнение на сегмент. К важным параметрам конфигурации относятся коэффициент параллелизации (до 10 параллельных вызовов Lambda на сегмент с параллельной обработкой подмножества пакета) и расширенное распределение (выделенная пропускная способность 2 MB/s на сегмент для потребителя Lambda). Эти параметры значительно повышают пропускную способность потоков с большим объёмом данных без увеличения числа сегментов.
EventBridge как маршрутизатор событий
Amazon EventBridge — рекомендуемая шина событий для соединения сервисов AWS и пользовательских приложений. События поступают на шину, а правила фильтруют их по шаблону и направляют целевым объектам, включая Lambda, SQS, Step Functions и другие сервисы. EventBridge полностью разделяет производителей и потребителей событий: ни один из них не знает о другом. Шина событий по умолчанию получает события от сервисов AWS; для событий Вашего приложения создайте пользовательскую шину событий.
aws events put-rule \
--name 'OrderPlacedRule' \
--event-pattern '{"source": ["com.myapp.orders"], "detail-type": ["OrderPlaced"]}' \
--state ENABLED
aws events put-targets \
--rule 'OrderPlacedRule' \
--targets 'Id=LambdaTarget,Arn=arn:aws:lambda:us-east-1:123456789012:function:InventoryUpdater'Шаблон распределения: SNS для нескольких функций Lambda
Распространённый шаблон архитектуры, управляемой событиями, — распределение: одно событие запускает несколько параллельных конвейеров обработки. Опубликуйте сообщение в теме SNS, и несколько подписанных функций Lambda будут независимо реагировать на него. Например, событие размещения заказа может распределиться между функцией, отправляющей письмо с подтверждением, функцией, обновляющей запасы, и функцией, уведомляющей склад. Каждый потребитель работает независимо и масштабируется отдельно — ни один потребитель не может заблокировать остальных.
Быстрая проверка
Проверьте своё понимание концепций AWS Solutions Architect (SAA-C03), рассмотренных в этом уроке.
Итоги урока
В этом уроке Вы узнали, что Lambda@Edge запускает функции в пограничных местоположениях CloudFront с четырьмя точками запуска (запрос и ответ Viewer, запрос и ответ Origin) для таких задач, как аутентификация, перезапись URL и изменение заголовков; CloudFront Functions являются более дешёвой альтернативой с меньшей задержкой для простых преобразований на этапе Viewer; а шаблоны, управляемые событиями, с использованием SQS, DynamoDB Streams, Kinesis, EventBridge и распределения через SNS обеспечивают слабосвязанные архитектуры, в которых Lambda реагирует на события в реальном времени. Далее мы рассмотрим стандартные очереди SQS и очереди FIFO.
Часто задаваемые вопросы
Урок «Lambda@Edge и событийно-ориентированные шаблоны» бесплатный?
Да — полный текст урока «Lambda@Edge и событийно-ориентированные шаблоны» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.
Чему я научусь в уроке «Lambda@Edge и событийно-ориентированные шаблоны»?
Запускайте функции в периферийных местоположениях CloudFront и подключайте Lambda к SQS, SNS, потокам DynamoDB и Kinesis для событийно-ориентированных архитектур. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?
Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Lambda@Edge и событийно-ориентированные шаблоны»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?
Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функции Lambda: среды выполнения, триггеры и обработчики
- Параллелизм, ограничение частоты и зарезервированный параллелизм
- Слои Lambda и пакеты развёртывания
- Lambda@Edge и событийно-ориентированные шаблоны