Написання та тестування коду 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 — це вхідний payload.
  • 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 vs 200

Безсерверні застосунки з AWS Lambda

Крайні випадки для тестування

  • Відсутні поля (порожній JSON).
  • Неправильні типи (name — число).
  • Зайві поля або великий payload.

Приклади payload із крайніми випадками

Безсерверні застосунки з 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: dict у текст 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 Logs.

Цикл налагодження

Безсерверні застосунки з AWS Lambda

Давайте потренуємось!

Безсерверні застосунки з AWS Lambda

Preparing Video For Download...