Основи подієвої архітектури

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

Claudio Canales

Senior DevOps Engineer

Підсумок: одна ментальна модель Lambda

  • Джерело події: що запускає Lambda.
  • Корисне навантаження події: JSON, що описує подію.
  • Обробник: код, який її опрацьовує.
  • Результат: відповідь або побічна дія.
  • Журнали: де ви зневаджуєте проблеми.

Потік виконання Lambda

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

Події — це повідомлення

  • Подія описує те, що сталося.
  • Зазвичай це JSON-повідомлення з метаданими.
  • Ваш обробник видобуває поля й діє.

Аналогія з дверним дзвінком для подій

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

Поширені джерела подій в AWS

  • Amazon S3 створює події під час завантажень.
  • Amazon SQS — керована черга для доставки повідомлень.
  • DynamoDB Streams формує журнал змін.
  • Кожне джерело має інше JSON-навантаження.

Джерела подій: S3 vs SQS vs Streams

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

Синхронний vs асинхронний виклик

  • Синхронно: викликач чекає на результат.
  • Асинхронно: викликач отримує підтвердження; подію оброблять пізніше.

Аналогія синхронного vs асинхронного

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

Основи подієвої архітектури

  • Події надходять як JSON від сервісів AWS.
  • Режим виклику змінює, де з'являються помилки.
  • Навантаження різняться, тож розбирайте й перевіряйте захисно.
  • Припускайте повтори та дублікати.

Основні висновки

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

Навантаження — це контракти

  • Навантаження — це контракти: відправник задає структуру.
  • Ваш обробник має знати, де шукати поля.
  • Витягніть потрібне, перевірте, обробіть і залогуйте.

Контракт навантаження та парсинг

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

Приклад навантаження: подія повідомлення SQS

Анотоване навантаження події SQS

  • Records — це пакет.
  • body — рядок.
  • messageId допомагає відстежувати й дедуплікувати.
Безсерверні застосунки з AWS Lambda

Покроково: ітерація по Records

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Читайте Records із безпечним значенням за замовчуванням.
  • Пройдіться по кожному запису та витягніть body.
  • Логуйте важливе, потім повертайте результат.

Ітерація по Records

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

Покроково: безпечний розбір JSON у body

import json
def lambda_handler(event, context):
    records = event.get("Records") or [{}]
    body = records[0].get("body", "{}")
    payload = json.loads(body)
    oid = payload.get("order_id")
    return json.dumps({"order_id": oid})
  • body — це рядок; розберіть його через json.loads.
  • Читайте з безпечним значенням за замовчуванням, напр. "{}".
  • Витягніть order_id і поверніть JSON через json.dumps.

Потік розбору body

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

Чекліст захисного розбору

Чекліст захисного розбору

  • Разово залогуйте структуру події, коли вивчаєте нове джерело.
  • Використовуйте .get() і значення за замовчуванням для необов'язкових полів.
  • Перевіряйте обов'язкові поля та повертайте зрозумілі помилки.
  • Обробляйте порожні пакети й відсутні ключі.
Безсерверні застосунки з AWS Lambda

Проєктування з урахуванням повторів і дублікатів

  • Багато джерел подій доставляють «принаймні один раз».
  • Можливі дублікати.
  • Проєктуйте ідемпотентні обробники, щоб повторна обробка була коректною.

Повторні спроби та дублікати

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

Ідемпотентність на практиці

  • Оберіть унікальний ключ, напр. messageId або order_id.
  • Зберігайте кожен оброблений ключ у DynamoDB.
  • Перевіряйте наявність ключа; якщо є — пропускайте роботу.

Схема рішення для ідемпотентності

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

Основні висновки

  • Події надходять як JSON від сервісів AWS.
  • Режим виклику змінює, де з'являються помилки.
  • Навантаження різняться, тож розбирайте й перевіряйте захисно.
  • Припускайте повтори та дублікати.

Основні висновки

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

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

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

Preparing Video For Download...