Serverless: Lambda и API Gateway

Запускаем код в облаке вообще без серверов — на функциях Lambda.

Lambda — сервис запуска кода по событию без управления серверами; вы загружаете функцию, а AWS сам её запускает, масштабирует и тарифицирует по числу вызовов и времени работы.

Что такое serverless

«Serverless» не значит «без серверов» — серверы есть, но вы их не видите и не обслуживаете. Вы пишете функцию, а инфраструктуру — где запустить, как масштабировать — полностью берёт на себя AWS. Когда запросов нет, не работает ничего и платить не за что. Пришёл запрос — функция мгновенно запускается.

Как устроена Lambda

Функция Lambda — это просто код, который срабатывает на событие: HTTP-запрос, загрузка файла в S3, сообщение в очереди, расписание. Вы задаёте обработчик (handler), а AWS вызывает его, передавая данные события.

def handler(event, context):
    name = event.get("name", "мир")
    message = f"Привет, {name}!"
    print(message)
    return {"statusCode": 200, "body": message}

# имитация вызова Lambda для наглядности
print(handler({"name": "AWS"}))

Вывод:

Привет, AWS!
{'statusCode': 200, 'body': 'Привет, AWS!'}

API Gateway — дверь снаружи

Сама по себе Lambda не имеет адреса в интернете. Чтобы вызвать её HTTP-запросом, перед ней ставят API Gateway — сервис, который принимает HTTP-запросы и передаёт их в Lambda, а ответ возвращает клиенту. Так из функции получается полноценный REST-API.

Пользователь -> HTTP GET /hello?name=AWS
      |
  API Gateway  (принимает запрос, проверяет, маршрутизирует)
      |
  Lambda handler(event)  ->  возвращает "Привет, AWS!"
      |
  Ответ 200 -> пользователю

Как работает под капотом

При первом вызове AWS поднимает контейнер с вашим кодом — это занимает доли секунды и называется «холодный старт» (cold start). Контейнер затем какое-то время живёт и обслуживает следующие запросы быстро (тёплый старт). Под нагрузкой AWS запускает столько копий функции параллельно, сколько нужно, — масштабирование происходит автоматически и почти мгновенно. Тарификация — за число вызовов и за фактическое время работы, округлённое до миллисекунд. Поэтому за простаивающую функцию вы не платите ничего.

Частые ошибки

  • Тащить в Lambda долгие задачи. У функции есть лимит времени; для длительной обработки берут другие сервисы.
  • Забывать про холодный старт. Первый запрос после паузы может быть медленнее; для чувствительных API это учитывают.
  • Хранить состояние в функции. Lambda без состояния (stateless): данные между вызовами держат в базе или S3, а не в памяти функции.

Итог

  • Lambda запускает код по событию без управления серверами; платите только за вызовы и время работы.
  • API Gateway даёт Lambda HTTP-адрес и превращает функцию в REST-API.
  • Lambda масштабируется автоматически и работает без состояния; учитывайте лимит времени и холодный старт.
Проверьте себя
1. За что вы платите при использовании Lambda?
AЗа круглосуточную аренду сервера
BЗа число вызовов и фактическое время работы функции
CФиксированную сумму в месяц
DНи за что
2. Зачем перед Lambda ставят API Gateway?
AЧтобы хранить файлы
BЧтобы дать функции HTTP-адрес и принимать запросы из интернета
CЧтобы создать базу данных
DЧтобы выключить функцию
3. Что такое «холодный старт» Lambda?
AСбой функции
BЗадержка на первый запуск, когда AWS поднимает контейнер с кодом
CОтключение региона
DБесплатный вызов