Skip to content

Pythonのラムダ関数

Python Lambda Functionジェネレータは、既存のPythonプロジェクトにLambda関数を追加する機能を提供します。

このジェネレータは、AWS CDKまたはTerraformのインフラストラクチャ設定を含む新しいPython Lambdaハンドラを作成します。生成されるバックエンドはサーバーレスデプロイメントにAWS Lambdaを使用し、AWS Lambda PowertoolsのParserを使用した型安全性をオプションで提供します。ロギング、AWS X-Rayトレーシング、Cloudwatchメトリクスを含む可観測性のためにAWS Lambda Powertoolsを設定します。

Lambda関数は2つの方法で生成できます:

  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - py#lambda-function
  5. 必須パラメータを入力
    • クリック Generate
    パラメータ デフォルト 説明
    project 必須 string - Lambda関数を追加するプロジェクト
    functionName 必須 string - 追加する関数の名前
    functionPath string - 関数を追加するプロジェクト内のソースディレクトリのパス
    eventSource string Any Lambda関数に使用するオプションのイベントソースモデル
    iacProvider string Inherit 優先するIaCプロバイダー。デフォルトでは初期選択から継承されます。

    ジェネレータはプロジェクトに以下のファイルを追加します:

    • Directory<module-name>
      • <lambda-function>.py 関数実装

    functionPathオプションが指定された場合、ジェネレータは指定されたパスに必要なファイルを追加します:

    • Directory<module-name>
      • Directory<custom-path>
        • <function-name>.py 関数実装

    このジェネレータは選択した iacProvider に基づいてInfrastructure as Codeを生成するため、packages/common に関連するCDKコンストラクトまたはTerraformモジュールを含むプロジェクトを作成します。

    共通のInfrastructure as Codeプロジェクトは以下の構造を持ちます:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ プロジェクト/ジェネレータ固有のインフラストラクチャ用コンストラクト
        • Directorycore/ app 内のコンストラクトで再利用される汎用コンストラクト
        • index.ts app からコンストラクトをエクスポートするエントリーポイント
      • project.json プロジェクトのビルドターゲットと設定

    ジェネレータは選択したiacProviderに基づいて関数をデプロイするためのIaC(Infrastructure as Code)を作成します:

    ジェネレータはCDKコンストラクトを作成します。これらはpackages/common/constructsディレクトリに配置され、関数のデプロイに使用できます。

    メインの関数実装は<function-name>.pyにあります。以下は実装例です:

    import os
    from aws_lambda_powertools import Logger, Metrics, Tracer
    from aws_lambda_powertools.metrics import MetricUnit
    from aws_lambda_powertools.utilities.parser import event_parser
    from aws_lambda_powertools.utilities.parser.models import EventBridgeModel
    from aws_lambda_powertools.utilities.typing import LambdaContext
    os.environ["POWERTOOLS_METRICS_NAMESPACE"] = "Foo"
    os.environ["POWERTOOLS_SERVICE_NAME"] = "Foo"
    logger: Logger = Logger()
    metrics: Metrics = Metrics()
    tracer: Tracer = Tracer()
    @tracer.capture_lambda_handler
    @metrics.log_metrics
    @event_parser(model=EventBridgeModel)
    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    logger.info("Received event", extra={"event": event.model_dump() })
    metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
    try:
    # TODO: 実装
    metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1)
    # TODO: 必要に応じて成功レスポンスを実装
    except Exception as e:
    logger.exception(e)
    metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1)
    # TODO: 必要に応じてエラーレスポンスを実装

    ジェネレータは以下の機能を自動的に設定します:

    1. 可観測性のためのAWS Lambda Powertools統合
    2. メトリクス収集
    3. @event_parserを使用した型安全性

    AWS Lambda Powertoolsによる可観測性

    Section titled “AWS Lambda Powertoolsによる可観測性”

    ジェネレータはAWS Lambda Powertoolsを使用した構造化ロギングを設定します。

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    logger.info("Received event", extra={"event": event.model_dump()})

    ロガーには自動的に以下が含まれます:

    • イベントリクエスト
    • Lambdaコンテキスト情報
    • コールドスタートインジケータ

    AWS X-Rayトレーシングが自動的に設定されます。トレースにカスタムサブセグメントを追加できます:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    # 新しいサブセグメントを作成
    with tracer.provider.in_subsegment("function-subsegment"):
    # ここにロジックを実装
    return ....

    CloudWatchメトリクスは各リクエストごとに自動収集されます。カスタムメトリクスを追加できます:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    metrics.add_metric(name="NewMetric", unit=MetricUnit.Count, value=1)
    return ...

    デフォルトで収集されるメトリクス:

    • 起動回数
    • 成功/失敗回数
    • コールドスタートメトリクス

    Lambda関数生成時にeventSourceを選択した場合、関数はAWS Lambda Powertoolsの@event_parserで計装されます。例:

    @event_parser(model=EventBridgeModel)
    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    event.detail_type # <- IDEのオートコンプリートが効く型安全なアクセス

    これはFast APIと同様に、Pydanticを使用してデータモデルを定義できるようにします。

    イベントの型指定が必要ない場合は、eventSourceAnyを選択できます。

    ジェネレータはuvを使用してLambdaデプロイメントパッケージのPythonバンドリングを自動設定します:

    Terminal window
    pnpm nx bundle <project-name>

    このプロセスでは以下を使用します:

    1. uv exportでPython依存関係をrequirements.txtにエクスポート
    2. uv pip installでLambdaデプロイメント用ターゲットプラットフォーム(x86_64-manylinux2014)に依存関係をインストール

    このジェネレータは選択した iacProvider に基づいてCDKまたはTerraformのインフラストラクチャーコードを生成します。生成されたコードを使用して関数をデプロイできます。

    このジェネレータは common/constructs フォルダに関数をデプロイするためのCDKコンストラクトを作成します。CDKアプリケーションで以下のように使用できます:

    import { MyProjectMyFunction } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // スタックに関数を追加
    const fn = new MyProjectMyFunction(this, 'MyFunction');
    }
    }

    これにより以下が設定されます:

    1. AWS Lambda関数
    2. CloudWatchロググループ
    3. X-Rayトレーシング設定
    4. CloudWatchメトリクスネームスペース

    この関数は任意のLambdaイベントソースのターゲットとして使用できます:

    以下の例はEventBridgeを使用してスケジュールでLambda関数を起動するCDKコードを示しています:

    import { Rule, Schedule } from 'aws-cdk-lib/aws-events';
    import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets';
    import { MyProjectMyFunction } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // スタックに関数を追加
    const fn = new MyProjectMyFunction(this, 'MyFunction');
    // EventBridgeスケジュールルールに関数を追加
    const eventRule = new Rule(this, 'MyFunctionScheduleRule', {
    schedule: Schedule.cron({ minute: '15' }),
    targets: [new LambdaFunction(fn)],
    });
    }
    }