Lambdaコードの作成とテスト

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

Claudio Canales

Senior DevOps Engineer

テストとログが重要な理由

  • 実際のイベントは複雑で、さまざまな形式があります。
  • テストによって、ユーザーが気づく前にエラーを検出できます。
  • ログはデバッグのための「ブラックボックス」です。

テストは避難訓練のようなもの

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

覚えておくべき1つのフロー

コアフローのツールキット

  • イベント受信 → ハンドラー実行 → レスポンス返却。
  • ログとテストイベントを使ってデバッグします。

Lambdaの呼び出しフロー

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

ログの保存先:CloudWatch Logs

  • 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 vs 200

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

テストすべきエッジケース

  • フィールドの欠落(空のJSON)。
  • 型の誤り(nameが数値の場合)。
  • 余分なフィールドや大きなペイロード。

エッジケースのペイロード例

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 Logsを確認します。

デバッグループのサイクル

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

練習しましょう!

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

Preparing Video For Download...