🚀

ここから始める Powertools for AWS Lambda (Python) - Typing 編 -

に公開

はじめに

こんにちは。
Penetrator プロダクト開発部で主にインフラを担当している遠藤です。

みなさん元気に Lambda Life を送っていますか?
AWS Lambda で開発をしていると、Lambda 独自の開発方法で迷うこともあると思います。
また、ログ出力、メトリクス収集、トレーシングなど、運用面での課題に直面することもあるかもしれません。

そんな課題を解決してくれるのが、AWS 公式が提供する Powertools for AWS Lambda です。
今回は、このライブラリの中でも導入しやすい Typing 機能について、実際の使用イメージと共に紹介します。

なお、今後 Powertools for AWS Lambda の各種機能について継続的にブログを書いていく予定なので、興味のある方は楽しみにしていただけると嬉しいです。

Powertools for AWS Lambda とは

Powertools for AWS Lambda は、サーバーレスベストプラクティスの実装と開発者の生産性向上を支援する開発者ツールキットです (公式サイト)。
代表的な特徴は以下の通りです:

  • サーバーレスベストプラクティスの実装支援: 業界標準のプラクティスを段階的に採用可能
  • 開発者の生産性向上: ボイラープレートコードを削減し、ビジネスロジックに集中
  • 段階的導入可能: 必要な機能から順次採用できる柔軟な設計

2025 年 7 月現在、以下のプログラミング言語で提供されており、AWS Well-Architected Serverless Lens に基づく推奨事項を簡単に実装できます。

  • Python
  • TypeScript
  • Java
  • .NET

今回は Python 用のライブラリを使用します。
主な機能として以下のものが提供されています (公式ドキュメント):

  • Tracer: AWS X-Ray との統合による分散トレーシング
  • Logger: JSON 形式の構造化ログ出力
  • Metrics: CloudWatch EMF を使用したカスタムメトリクス収集
  • Event Handler - REST API: API Gateway REST/HTTP API, ALB, Lambda Function URLs, VPC Lattice 用のイベントハンドラー
  • Event Handler - GraphQL API: AppSync GraphQL APIs 用のイベントハンドラー
  • Event Handler - AppSync Events: AppSync real-time events 用のイベントハンドラー
  • Event Handler - Amazon Bedrock Agents: イベントハンドラーを使用した Amazon Bedrock Agents 作成
  • Parameters: SSM Parameter Store, Secrets Manager, AppConfig 連携
  • Batch processing: SQS, Kinesis, DynamoDB Streams のバッチ処理
  • Kafka Consumer: Apache Kafka コンシューマーのユーティリティ
  • Typing: 型ヒント支援
  • Validation: JSON スキーマバリデーション
  • Event source data classes: イベントソース用の型安全なデータクラス
  • Parser: Pydantic を使用したイベントバリデーション
  • Idempotency: 冪等性制御
  • Data Masking: 機密データのマスキング
  • Feature Flags: 機能フラグ管理
  • Streaming: ストリーミングデータ処理
  • Middleware factory: カスタムミドルウェア作成
  • JMESPath Functions: JMESPath 関数の拡張
  • CloudFormation Custom Resources: CloudFormation カスタムリソース作成支援

Typing 機能とは

Typing 機能は、type hints を活用して Lambda 開発を効率化するためのユーティリティです (公式ドキュメント)。
主な特徴は以下の通りです:

  • 静的型クラスの提供: Lambda context オブジェクトに対する完全な型定義
  • IDE 開発効率向上: 自動補完機能とインラインドキュメントの活用
  • ゼロランタイムコスト: 型ヒントは実行時に無視されるため、パフォーマンスへの影響なし

2025 年 7 月現在、以下の型定義が提供されています:

  • LambdaContext: Lambda context オブジェクトの型定義

Lambda context オブジェクトとは

Lambda context オブジェクトは、Lambda 関数実行時に Lambda サービスが自動的に提供するオブジェクトで、実行環境に関する情報を含んでいます (公式ドキュメント)。
主なプロパティとメソッドは以下の通りです:

  • function_name: Lambda 関数名
  • function_version: 関数のバージョン
  • invoked_function_arn: 呼び出された関数の ARN
  • memory_limit_in_mb: 関数に割り当てられたメモリサイズ
  • aws_request_id: リクエストの一意識別子
  • log_group_name: CloudWatch Logs のロググループ名
  • log_stream_name: CloudWatch Logs のログストリーム名
  • identity: モバイルアプリからの呼び出し時の認証情報
  • client_context: モバイルアプリからの呼び出し時のクライアント情報
  • get_remaining_time_in_millis(): タイムアウトまでの残り時間 (ミリ秒)

実践: Lambda 関数の構築・実装

ここからは、実際に Lambda 関数を構築・実装するイメージを紹介します。

※ プロジェクトの完全なコードは コチラ

使用ツール バージョン
aws-cdk-cli 2.1021.0
aws-cdk-lib 2.199.0
aws-cli 2.13.32
node 22.13.1
python 3.11.8
uv 0.6.14
jq 1.7

0. プロジェクトの初期化

Terminal
# プロジェクトディレクトリの作成
mkdir lambda-powertools-python && \
cd lambda-powertools-python
Terminal
# AWS CDKプロジェクトの初期化
cdk init app --language python
Terminal
# プロジェクトのセットアップ
source .venv/bin/activate && \
uv init && \
uv add --group infra -r requirements.txt && \
uv add --dev -r requirements-dev.txt && \
mkdir lambda && \
touch lambda/function_before.py lambda/function_after.py && \
rm requirements.txt requirements-dev.txt main.py

主なプロジェクト構成は以下のようになります:

lambda-powertools-python/
├── lambda/                                  # Lambda 関数のソースコード
│   ├── function_after.py                    # Typing 機能使用版
│   └── function_before.py                   # Typing 機能未使用版
├── lambda_powertools_python/
│   └── lambda_powertools_python_stack.py    # AWS CDK スタック定義
├── app.py                                   # AWS CDK アプリケーションのエントリーポイント
├── cdk.json                                 # AWS CDK 設定ファイル
├── pyproject.toml                           # 依存関係管理ファイル
└── uv.lock                                  # 依存関係管理ファイル

1. 依存関係の設定

Terminal
# Powertools for AWS Lambda の追加
uv add --group lambda aws-lambda-powertools

2. Lambda 関数の実装 (Typing 機能未使用版)

lambda/function_before.py
import json


def lambda_handler(event, context):
    """Typing 機能未使用"""
    # context オブジェクトのプロパティにアクセス
    function_name = context.function_name
    request_id = context.aws_request_id
    memory_limit = context.memory_limit_in_mb
    remaining_time = context.get_remaining_time_in_millis()

    # event の処理
    user_id = event.get("user_id")
    message = event.get("message", "Hello World")

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": message,
            "user_id": user_id,
            "lambda_info": {
                "function_name": function_name,
                "request_id": request_id,
                "memory_limit": memory_limit,
                "remaining_time_ms": remaining_time
            }
        })
    }

3. Lambda 関数の実装 (Typing 機能使用版)

lambda/function_after.py
import json
from typing import Any

from aws_lambda_powertools.utilities.typing import LambdaContext


def lambda_handler(event: dict[str, Any], context: LambdaContext) -> dict[str, Any]:
    """Typing 機能使用"""
    # context オブジェクトのプロパティにアクセス
    # IDE で自動補完とメソッドドキュメントが利用可能
    function_name = context.function_name
    request_id = context.aws_request_id
    memory_limit = context.memory_limit_in_mb
    remaining_time = context.get_remaining_time_in_millis()

    # event の処理
    user_id = event.get("user_id")
    message = event.get("message", "Hello World")

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": message,
            "user_id": user_id,
            "lambda_info": {
                "function_name": function_name,
                "request_id": request_id,
                "memory_limit": memory_limit,
                "remaining_time_ms": remaining_time
            }
        })
    }

IDE による補完が効いている事を実感できるはずです。

4. AWS CDK スタックの定義

lambda_powertools_python/lambda_powertools_python_stack.py
from aws_cdk import CfnOutput, Stack
from aws_cdk import aws_lambda as _lambda
from constructs import Construct


class LambdaPowertoolsPythonStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Lambda Layer: Powertools for AWS Lambda (Python)
        # Layer ARN: https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer
        layer = _lambda.LayerVersion.from_layer_version_arn(
            self,
            "PowertoolsLayer",
            layer_version_arn=f"arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:20"
        )

        # Lambda 関数: Typing 機能未使用版
        function_before =_lambda.Function(
            self,
            "FunctionBefore",
            runtime=_lambda.Runtime.PYTHON_3_11,
            handler="function_before.lambda_handler",
            code=_lambda.Code.from_asset("lambda"),
        )

        # Lambda 関数: Typing 機能使用版
        function_after = _lambda.Function(
            self,
            "FunctionAfter",
            runtime=_lambda.Runtime.PYTHON_3_11,
            handler="function_after.lambda_handler",
            code=_lambda.Code.from_asset("lambda"),
            layers=[layer],
        )

        CfnOutput(
            self,
            "FunctionBeforeName",
            value=function_before.function_name,
            export_name="FunctionBeforeName",
        )

        CfnOutput(
            self,
            "FunctionAfterName",
            value=function_after.function_name,
            export_name="FunctionAfterName",
        )

5. デプロイ・動作確認

Terminal
# デプロイの実行
cdk deploy --require-approval never
Terminal
# Typing 機能未使用版のテスト
aws lambda invoke \
  --function-name <Before 関数名> \
  response_before.json && \
  cat response_before.json | \
  jq -r ".body | fromjson | .lambda_info.remaining_time_ms"
Terminal
# Typing 機能使用版のテスト
aws lambda invoke \
  --function-name <After 関数名> \
  response_after.json && \
  cat response_after.json | \
  jq -r ".body | fromjson | .lambda_info.remaining_time_ms"

6. リソースのクリーンアップ

Terminal
cdk destroy -f

Typing 機能を使用するメリット

IDE での開発体験の向上

自動補完機能

  • context.と入力するだけで、利用可能なプロパティとメソッドが全て表示される
  • タイプミスによるバグが減少

インラインドキュメント

  • 各メソッドの詳細な説明が IDE に表示される
  • AWS 公式ドキュメントを調べる回数が減少

まとめ

本記事では、Powertools for AWS Lambda (Python)Typing 機能について紹介しました。
ゼロコストで簡単に導入できるため、導入しない手はないと思います。

Powertools for AWS Lambda に興味のある方、Lambda 関数の開発方法に迷っている方の参考になれば嬉しいです。

今後も Powertools for AWS Lambda の各種機能についてブログを書いていく予定ですので、お楽しみに。

参考資料

最後に

株式会社 Penetrator はシリーズ A ラウンドにおいて総額 5.5 億円の資金調達を実施し、不動産テック業界における更なる成長を目指して、採用活動を一層強化しています。
エンジニア, デザイナー, カスタマーサクセス, BizDev, 営業, マーケティングなど、事業拡大を支える多様なポジションで共に挑戦していただける方を待っています!!

▽ 会社のカルチャーを知りたい方はこちら

https://www.wantedly.com/companies/company_9924832

▽ 募集職種を知りたい方はこちら

https://hrmos.co/pages/where/jobs

Discussion