Написание и тестирование кода Lambda

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

Claudio Canales

Senior DevOps Engineer

Зачем нужны тестирование и логирование

  • Реальные события разнообразны и непредсказуемы.
  • Тестирование выявляет ошибки раньше, чем их увидят пользователи.
  • Логи — ваш «чёрный ящик» для отладки.

Тестирование как учебная тревога

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

Одна схема, которую нужно запомнить

Базовый набор инструментов

  • Событие → обработчик → ответ.
  • Используйте логи и тестовые события для отладки.

Схема вызова Lambda

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

Куда попадают логи: CloudWatch Logs

  • Lambda по умолчанию записывает туда вывод print() и ошибки.
  • CloudWatch Logs — хранилище логов AWS для сервисов.
  • Группы логов имеют вид /aws/lambda/<function-name>.

Обработчик пишет логи в CloudWatch Logs

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

Контракт обработчика

  • event — входные данные.
  • context — метаданные среды выполнения.
  • Возвращаемое значение становится ответом функции.

Контракт обработчика: event + context -> response

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

Разбор: event и context

def lambda_handler(event, context):
    request_id = context.aws_request_id
    time_left = context.get_remaining_time_in_millis()
    return {"statusCode": 200}

Пояснения к event и context

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

Безопасный разбор входных данных

  • Для необязательных полей используйте event.get().
  • Проверяйте обязательные входные данные в самом начале.
  • Возвращайте понятные ошибки при отсутствующих полях.

Безопасный разбор и ранняя валидация

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

Разбор: валидация обязательных полей

def lambda_handler(event, context):
    if not event.get("name"):
        return {"statusCode": 400, "body": "Missing: name"}
    return {"statusCode": 200, "body": f"Hello, {event.get('name')}!"}

Ветка валидации: 400 или 200

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

Граничные случаи для тестирования

  • Отсутствующие поля (пустой JSON).
  • Неверные типы (имя передано как число).
  • Лишние поля или большие полезные нагрузки.

Примеры граничных полезных нагрузок

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

Предсказуемый формат ответа

  • Придерживайтесь единой структуры ответа.
  • Используйте statusCode для успеха и ошибок.
  • Кодируйте тело ответа в JSON.

Конверт ответа: statusCode + тело JSON

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

Разбор: возврат JSON

import json

def lambda_handler(event, context):
    body = {"message": "ok"}
    return {"statusCode": 200, "body": json.dumps(body)}

json.dumps: словарь в JSON-текст

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

Логирование и трассировка

  • Логируйте ключевые поля (при необходимости в формате JSON).
  • Включайте context.aws_request_id для трассировки.
  • Не логируйте секреты и персональные данные.
  • По умолчанию логи Lambda попадают в CloudWatch Logs.

Рекомендации по логированию

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

Разбор: структурированное логирование

import json

def lambda_handler(event, context):
    print(json.dumps({"request_id": context.aws_request_id, "event": event}))
    return {"statusCode": 200}

Строка структурированного лога в JSON

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

Тестирование с помощью консольных событий

  • Создавайте именованные тестовые события.
  • Проверяйте штатный сценарий и граничные случаи.
  • После каждого запуска проверяйте ответ и логи.

Тестовые события в консоли

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

Простой цикл отладки

  • Внесите небольшое изменение в код.
  • Разверните функцию, затем запустите тестовое событие.
  • Проверьте ответ и логи CloudWatch.

Цикл отладки

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

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

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

Preparing Video For Download...