この記事のポイント
- Powertools for AWS Lambda(Python)の基本的な使い方を解説しているよ
はじめに
この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも??」などAWSサービスの中でも特定の機能にフォーカスして検証していく記事です。主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。
今回はPowertools for AWS Lambda (Python)について検証します。
内容はTutorial - Powertools for AWS Lambda (Python)の内容をもとに書いています。
Powertools for AWS Lambda(Python)とは
簡単に説明するとPowertools for AWS Lambdaは、AWS Lambda関数の開発を支援するためのオープンソースのライブラリです。以下のような機能を提供しています。
Powertools for AWS Lambda Python は、AWS Lambda 関数用のユーティリティースイートで、トレース、構造化ロギング、カスタムメトリックスなどのベストプラクティスの導入を容易にします。
引用:Powertools for AWS Lambda Python 入門 第 1 回
あまりピンとこないと思うので、実際に使ってみてどんな感じかを見ていきましょう。
必要なもの
今回の検証で必要なものは以下のとおりです。
- AWS CLI
- AWS SAM CLI
チュートリアルを参考に進めるので以下のサービスを利用します。
- AWS Lambda
- Amazon API Gateway
- Amazon CloudWatch
- Logs
- insights
- AWS X-Ray
- AWS IAM
- CloudFormation
セットアップ方法
では、まずは環境をセットアップしていきましょう。
AWS SAM CLI のインストール
Install the AWS SAM CLI - AWS Serverless Application Modelに従って、セットアップを行います。
AWS SAM CLIをインストールします。以下のコマンドを実行してください。
wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install
rm -rf aws-sam-cli-linux-x86_64.zip sam-installation
動作確認を行います。
sam --version
実行結果
SAM CLI, version 1.146.0
準備体操:AWS SAMでHello Worldアプリケーションを作成して動作確認
Powertools for AWS Lambda (Python)のチュートリアルに入る前に、AWS SAMでHello Worldアプリケーションを作成して動作確認を行います。
これからのやることのおおまかな流れは以下のとおりです。
- Pythonのバージョンを確認
- AWS SAMでHello Worldアプリケーションを作成
- ローカルでビルドとAPI起動
まずはPythonのバージョンを確認します。
python3 --version
今回はPython 3.12.1を使用します。このバージョンを使ってAWS SAMでHello Worldアプリケーションを作成します。
以下のコマンドを実行して、プロジェクトを作成します。
sam init --runtime python3.12 --dependency-manager pip --app-template hello-world --name powertools-quickstart
ディレクトリを移動します。
cd powertools-quickstart
ローカルでビルドとAPI起動を行います。
sam build && sam local start-api
http://127.0.0.1:3000/helloでアクセスします。
Web画面上に以下のようなメッセージが表示されたら成功です。
{"message": "hello world"}
curlコマンドでアクセスする場合は以下のとおりです。※ターミナルを次の行で表示するために改行が入るようにしています。
curl http://127.0.0.1:3000/hello && echo ""
sam local invokeによる実行も試してみます。以下のコマンドを実行します。
イベントファイルとリソース指定で実行する例を示します。
sam local invoke HelloWorldFunction -e events/event.json
または短縮版で実行することもできます。
sam local invoke -e events/event.json
問題なく動作したら、次にデプロイを行います。以下のコマンドを実行します。
sam build && sam deploy --guided
いくつか質問が表示されるので、以下のように入力して進めてください。
Setting default arguments for 'sam deploy'
=========================================
Stack Name [powertools-quickstart]:
AWS Region [ap-northeast-1]:
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [Y/n]: Y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: Y
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: y
HelloWorldFunction has no authentication. Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
デプロイがはじまるのでしばらく待ちます。途中でchangesetの確認が表示されるのでYを入力して進めてください。
デプロイが完了したら、以下のようなメッセージが表示されます。
Successfully created/updated stack - powertools-quickstart in ap-northeast-1
デプロイが完了したら、samのコマンドでデプロイしたLambda関数のエンドポイントを確認します。
sam list endpoints --output json
実行結果のCloudEndpointという項目でProdとStageのURLが確認できます。
{
"LogicalResourceId": "ServerlessRestApi",
"PhysicalResourceId": "XXXXXXX",
"CloudEndpoint": [
"https://{PhysicalResourceId}.execute-api.ap-northeast-1.amazonaws.com/Prod",
"https://{PhysicalResourceId}.execute-api.ap-northeast-1.amazonaws.com/Stage"
],
"Methods": [
"/hello['get']"
]
}
CloudEndpointのURLに/helloを付与してアクセスします。ブラウザまたはcurlコマンドでアクセスしてください。
curl https://{PhysicalResourceId}.execute-api.ap-northeast-1.amazonaws.com/Prod/hello && echo ""
実行結果
{"message": "hello world"}
独自のルーター作成をPowertoolsで簡単に実装する
Hello Worldアプリケーションの動作確認ができたところで、次は独自のルーター作成をPowertoolsで簡単に実装してみます。
変更のおおまかな流れは以下のとおりです。
- template.ymlの修正
- app.pyの修正
template.ymlの修正
URLパスをもう一つ追加する場合はResourcesセクションにもう1つの項目を追加するべきかのように思えますが
単にパスをもう1つ追加するだけであれば、Eventsセクションにもう1つのイベントを追加するだけ問題ありません。
具体的には以下のように修正します。
次にapp.pyの修正ですが、まずはpowertoolsを使わない場合のコード例を示します。
これは最初に思いつく実装方法ですが、実際に運用してみると難しい点がいくつかあります。
Routerクラスを保守する必要があるのももちろんですが、もうひとつ例を挙げると、lambda_handlerで取得したリクエストメソッドがRouterクラスで動作するかどうかを理解するためにRouterクラスの実装を確認する必要がある点です。
これはlambda_handlerの中でリクエストメソッド(GET、POSTなど)を取得している点ことが原因と考えて良いでしょう。理想的にはlambda_handlerではリクエストメソッドを意識せずに処理できると良いです。
Lambda Powertoolsを使うと、これらの問題を解決できます。以下に修正例を示します。
上記のコード例ではaws_lambda_powertools.event_handlerのAPIGatewayRestResolverを使うことで、lambda_handlerでリクエストメソッドを意識せずに処理できるようになっています。
モジュールインストールのためにrequirements.txtの修正は必要ですが、template.ymlの修正は不要です。
構造化されたログ出力でログを見やすくする
AWS Lambdaに限らず、アプリケーションのログを見やすくすることは重要です。
Powertools for AWS Lambda (Python)を使用すると、構造化されたログ出力を簡単に実装できます。
実装手順としては以下のとおりです。
- powertoolsのモジュールのインストール
- aws_lambda_powertoolsのLoggerをインポート
- aws_lambda_powertools.loggingのaws_lambda_powertoolsをインポート
- ログを出力する箇所でlogger.infoやlogger.errorなどを使用
- lambda_handlerに@logger.inject_lambda_contextデコレーターを追加
具体的には以下のように修正します。
出力されるログはJSON形式で出力されるため、CloudWatch Logs上でフィルタリングや検索が容易になります。
では実際に動作確認を行います。
ローカル実行ではCloudWatch Logsに出力されないので、以下のコマンドでビルドとデプロイを実行します。
sam build && sam deploy --guided
デプロイが完了したら、API Gatewayのエンドポイントにアクセスします。
アクセス履歴がCloudWatch Logsに出力されるので、ログを確認します。以下のようなログが出力されていることが確認できます。
{
"level": "INFO",
"location": "hello:18",
"message": "Request from unknown received",
"timestamp": "2025-11-24 07:27:28,549+0000",
"service": "APP",
"cold_start": true,
"function_name": "powertools-quickstart-HelloWorldFunction-XXXX",
"function_memory_size": "128",
"function_arn": "arn:aws:lambda:ap-northeast-1:123456789:function:powertools-quickstart-HelloWorldFunction-XXXX",
"function_request_id": "61647454-48da-4e08-9955-96507bc4e34b",
"correlation_id": "00c3e32c-985e-447a-8b30-78b8e55e191d",
"xray_trace_id": "1-692408df-5656645e626fec754239192e"
}
CloudWatch Logs Insightsでログをフィルタリングする場合は以下のようなクエリを使用します。
以下の例ではINFOレベルのログを抽出しています。
fields @timestamp, @message,level
| sort @timestamp desc
| filter (level='INFO')
| limit 10000
AWS X-Rayでトレースを可視化する
Powertools for AWS Lambda (Python)を使用すると、AWS X-Rayでトレースを可視化することも簡単に実装できます。
実装する場合の手順としては以下のとおりです。
- requirements.txtに
aws-xray-sdkを追加 -
aws_xray_sdk.coreのxray_recorderをインポートし、@xray_recorder.captureでデコレータを作成 - template.yamlのGlobalで
TracingEnabled: true、トレーシングを有効にしたいAPIでTracing: Activeを設定
まずはrequirements.txtを修正します。
次にapp.pyを修正します。
次にテンプレートを修正します。
最後に以下のコマンドを実行してデプロイしてください。
sam build && sam deploy --guided
デプロイ後に表示されるAPIエンドポイントに対して何回かリクエストを送ったあと
AWS X-Rayコンソールでトレースを確認します。
まとめ
Powertoolsを使うことでLambdaをより扱いやすくなったかと思います。
ルーターの作成や構造化ログの出力などがフレームワークとして利用できるのでチーム開発で役に立つ部分かなと思いました。
AWS X-Rayのトレースも簡単に実装できるのですぐにデバッグしたいときにも便利です。オブザーバビリティを高めるためこともできるでしょう。
