Понимание модели выполнения Lambda

Бессерверные приложения с AWS Lambda

Claudio Canales

Senior DevOps Engineer

Автоматическое выполнение

AWS на основе событий

  • Lambda запускает код при наступлении события.
  • Пример: загрузка в S3 → изменение размера изображения.
  • Разные триггеры, одна схема.
Бессерверные приложения с AWS Lambda

Ожидание до срабатывания

Ожидание → событие → выполнение → остановка

  • Ожидание: ничего не выполняется.
  • Событие: обработчик запускается, затем останавливается.

Аналогия Lambda с датчиком движения

  • Как датчик движения: ждёт до срабатывания.
  • Триггер переключает состояние с «выкл» на «вкл».
Бессерверные приложения с AWS Lambda

Что такое AWS Lambda?

AWS Lambda в двух словах

  • Вычислительный сервис на основе событий.
  • Автоматически масштабируется под нагрузку.
  • Оплата только за фактическое время выполнения.
Бессерверные приложения с AWS Lambda

Как Lambda выполняет ваш код

Поток выполнения Lambda

  • Источник события запускает Lambda.
  • Lambda передаёт полезную нагрузку события обработчику.
  • Обработчик возвращает результат.
Бессерверные приложения с AWS Lambda

Масштабирование под нагрузку

Масштабирование создаёт новые среды выполнения

  • Больше событий — больше параллельных вызовов.
  • Lambda запускает дополнительные среды выполнения.
  • При каждой новой среде возможен холодный старт.
Бессерверные приложения с AWS Lambda

Функция-обработчик

def lambda_handler(event, context):
    # Your code here
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
  • event: входная полезная нагрузка (JSON).
  • context: метаданные среды выполнения.
  • return: результат (или успех/ошибка).

Обработчик получает event и context

Бессерверные приложения с AWS Lambda

Объект события

Полезная нагрузка события объектного хранилища

Событие S3: бакет + ключ объекта.

# event["Records"][0]["s3"]
{
  "bucket": {"name": "my-bucket"},
  "object": {"key": "data.csv"}
}
  • Задача одна: извлечь нужные данные.

Полезная нагрузка события HTTP-запроса

Событие API: метод, путь, тело.

# API request event
{
  "httpMethod": "POST",
  "path": "/users",
  "body": "{\"name\": \"John\"}"
}
  • Разные триггеры — разный JSON.
Бессерверные приложения с AWS Lambda

Объект контекста

def lambda_handler(event, context):
    time_left = (
        context.get_remaining_time_in_millis()
    )
    request_id = context.aws_request_id
  • get_remaining_time_in_millis Время до истечения таймаута.
  • aws_request_id Идентификатор запроса для трассировки логов.
Бессерверные приложения с AWS Lambda

Stateless-выполнение

Повторное использование при тёплом старте и сброс

  • Каждый вызов независим.
  • Повторное использование среды возможно, но не гарантировано.
  • Храните состояние вне Lambda.
counter = 0

def lambda_handler(event, context):
    global counter
    counter += 1  # may reset
    return counter
Бессерверные приложения с AWS Lambda

Холодные старты

Временная шкала холодного старта

  • Создаётся новая среда выполнения.
  • Загружаются код и зависимости.
  • Выполняется инициализация, затем обработчик.
Бессерверные приложения с AWS Lambda

Тёплые старты

Временная шкала тёплого старта

  • Используется существующая среда выполнения.
  • Большая часть инициализации пропускается.
  • Обработчик запускается быстрее.
Бессерверные приложения с AWS Lambda

Init, invoke, freeze

Жизненный цикл среды выполнения

  • Init выполняется один раз на среду.
  • Обработчик вызывается при каждом запросе.
  • Между вызовами среда может быть заморожена.
Бессерверные приложения с AWS Lambda

Оптимизация холодных стартов

# init (once per env)
import boto3
s3 = boto3.client('s3')
# handler (every invocation)
def lambda_handler(event, context):
    return {"statusCode": 200}

Init один раз vs обработчик при каждом вызове

  • Размещайте импорты и SDK-клиенты вне обработчика.
Бессерверные приложения с AWS Lambda

Давайте потренируемся!

Бессерверные приложения с AWS Lambda

Preparing Video For Download...