イベント駆動アーキテクチャの基礎

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 非同期の例え

AWS Lambda によるサーバーレスアプリケーション

イベント駆動アーキテクチャの基礎

  • イベントは AWS サービスから JSON で届きます。
  • 呼び出しモードによってエラーの見え方が変わります。
  • ペイロードはさまざまなので、防御的にパースと検証を行います。
  • リトライと重複を前提に設計します。

重要ポイントのパイプライン

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.dumps で JSON を返します。

body のパースフロー

AWS Lambda によるサーバーレスアプリケーション

防御的パースのチェックリスト

防御的パースのチェックリスト

  • 新しいイベントソースを学ぶ際は、最初にイベントの構造をログに記録します。
  • 省略可能なフィールドには .get() とデフォルト値を使います。
  • 必須フィールドを検証し、明確なエラーを返します。
  • 空のバッチや存在しないキーにも対応します。
AWS Lambda によるサーバーレスアプリケーション

リトライと重複への対応設計

  • 多くのイベントソースは「少なくとも1回」の配信を保証します。
  • 重複が発生することがあります。
  • 2回処理しても正しく動くよう、べき等なハンドラを設計します。

リトライと重複

AWS Lambda によるサーバーレスアプリケーション

べき等性の実践

  • messageIdorder_id など、一意なキーを選びます。
  • 処理済みの各キーを DynamoDB に保存します。
  • キーが存在する場合は処理をスキップします。

べき等性の判断フロー

AWS Lambda によるサーバーレスアプリケーション

重要ポイント

  • イベントは AWS サービスから JSON で届きます。
  • 呼び出しモードによってエラーの見え方が変わります。
  • ペイロードはさまざまなので、防御的にパースと検証を行います。
  • リトライと重複を前提に設計します。

重要ポイントのパイプライン

AWS Lambda によるサーバーレスアプリケーション

練習しましょう!

AWS Lambda によるサーバーレスアプリケーション

Preparing Video For Download...