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 - The project to add the lambda function to
    functionName 必須 string - The name of the function to add
    functionPath string - The path within the project source directory to add the function to
    eventSource string Any Optional event source model to use for the lambda function
    iacProvider string Inherit The preferred IaC provider. By default this is inherited from your initial selection.

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

    • 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 run <project-name>:bundle

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

    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)],
    });
    }
    }