いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「Lambda関数のログが読みにくい」「トレースやメトリクスを毎回自前で書くのが面倒」と感じていませんか?
Lambdaの可観測性をもう少し整えたい方へ。
Powertools for AWS Lambda(Python)を使えば、構造化ログ・分散トレース・カスタムメトリクスをデコレーターだけで追加できます。



僕も新しいLambda関数を作るときは、まずPowertoolsを入れるところから始めています。
定型コードがほぼ消えるので、業務ロジックに集中できます。
ということで、本記事ではLambda Powertools(Python)でログとメトリクスを実装する方法を解説します。



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【AWS】Lambda Powertools(Python)でログとメトリクスを実装する方法
早速、Powertools for AWS Lambda(Python)でログとメトリクスを実装していきます。
Powertools for AWS Lambdaとは
Powertools for AWS Lambdaは、サーバーレスのベストプラクティスを手早く実装するためのユーティリティ集です。
Python版ではLogger・Tracer・Metricsの3つがコア機能として提供されています。
Loggerは構造化ログ、TracerはAWS X-Ray、MetricsはCloudWatchのカスタムメトリクスを担当します。
いずれもデコレーターを1行付けるだけで動くのが特徴です。



ログ整形もX-Rayのセグメント管理も、自分で書くと地味に大変なんですよね。
インストールとセットアップ
pipでaws-lambda-powertoolsを追加します。
pip install "aws-lambda-powertools[tracer]"Tracerを使う場合はtracerエクストラを指定して、aws-xray-sdkも一緒にインストールします。
サービス名やメトリクスの名前空間は環境変数でまとめて指定できます。
POWERTOOLS_SERVICE_NAME=payment
POWERTOOLS_METRICS_NAMESPACE=ServerlessApp
POWERTOOLS_LOG_LEVEL=INFOSAMやCDKのEnvironment設定に書いておくと、コード側の記述を減らせます。
Loggerで構造化ログを出力する
LoggerはJSON形式の構造化ログを標準で出力します。
from aws_lambda_powertools import Logger
logger = Logger(service="payment")
@logger.inject_lambda_context(log_event=True)
def lambda_handler(event, context):
logger.info("注文を受け付けました", order_id=event.get("order_id"))
return {"statusCode": 200}inject_lambda_contextデコレーターを付けると、関数名・リクエストID・コールドスタート有無が全ログへ自動で含まれます。
log_event=Trueにすると受信イベント全体もログに残るため、デバッグ時に役立ちます。
logger.infoにキーワード引数を渡すと、追加のキーとしてJSONへ出力されます。
リクエストをまたいで追跡したい場合は、inject_lambda_contextのcorrelation_id_path引数にイベント内のパスを指定します。



print()デバッグから卒業できます(笑)
Tracerで分散トレースを取得する
TracerはAWS X-Ray上に関数の実行トレースを記録します。
from aws_lambda_powertools import Tracer
tracer = Tracer(service="payment")
@tracer.capture_lambda_handler
def lambda_handler(event, context):
result = charge(event)
return {"statusCode": 200, "body": result}
@tracer.capture_method
def charge(event):
return {"charged": True}capture_lambda_handlerがハンドラー全体を、capture_methodが個別の関数をトレース対象にします。
関数の戻り値は自動でメタデータとしてX-Rayに記録され、例外発生時はスタックトレースも残ります。
LambdaのTracing設定をActiveにしておく必要があります。



ローカル実行やpytestではTracerが自動で無効化されるので、テストが壊れる心配は少ないです。
Metricsでカスタムメトリクスを送信する
MetricsはCloudWatch EMF(Embedded Metric Format)を使ってカスタムメトリクスを出力します。
from aws_lambda_powertools import Metrics
from aws_lambda_powertools.metrics import MetricUnit
metrics = Metrics(namespace="ServerlessApp", service="payment")
@metrics.log_metrics(capture_cold_start_metric=True)
def lambda_handler(event, context):
metrics.add_metric(name="OrdersReceived", unit=MetricUnit.Count, value=1)
return {"statusCode": 200}log_metricsデコレーターが、関数終了時にメトリクスをまとめて1回のログとして書き出します。
CloudWatch側がEMFログを解析してメトリクス化するため、PutMetricDataのAPI呼び出しは発生しません。
capture_cold_start_metric=Trueにすると、コールドスタート回数もメトリクスとして取得できます。
名前空間を指定しないとSchemaValidationErrorになるため、namespace引数か環境変数を必ず設定します。
3つのデコレーターをまとめて使う
Logger・Tracer・Metricsは同じハンドラーに重ねて指定できます。
from aws_lambda_powertools import Logger, Metrics, Tracer
from aws_lambda_powertools.metrics import MetricUnit
logger = Logger()
tracer = Tracer()
metrics = Metrics(namespace="ServerlessApp")
@logger.inject_lambda_context(log_event=True)
@tracer.capture_lambda_handler
@metrics.log_metrics(capture_cold_start_metric=True)
def lambda_handler(event, context):
logger.info("処理を開始します")
metrics.add_metric(name="OrdersReceived", unit=MetricUnit.Count, value=1)
return {"statusCode": 200}デコレーターの順序はLogger→Tracer→Metricsの並びが推奨されています。
3つを付けるだけで、ログ・トレース・メトリクスがそろった可観測性の高いLambda関数になります。



新規関数のテンプレートとして保存しておくと便利ですよ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【厳選】フリーランスエンジニアにおすすめなエージェント3選


フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。
僕が実際に利用しているおすすめエージェントを紹介しますね。



エージェントは必ず複数登録してください。
担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…
僕は実際に5つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- IT案件に特化したフリーランスエージェント。
- 週2〜3日の案件が豊富。
- リモート案件が多く、直エンドなので単価も高い。
※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。
ITプロパートナーズ
![]()
![]()
週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。



週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。
とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!
よくある質問
Loggerのログレベルはどう変更しますか?
Logger(level="DEBUG")のように引数で指定するか、環境変数POWERTOOLS_LOG_LEVELで設定します。
環境変数を使うと、デプロイ環境ごとにレベルを切り替えやすくなります。
Tracerをローカルやテストで完全に止めたいです。
環境変数POWERTOOLS_TRACE_DISABLEDをtrueにすると、Tracerの処理がスキップされます。
X-Rayデーモンが無い環境では自動で無効化されるため、明示設定が不要なケースも多いです。
メトリクスがCloudWatchに表示されません。
名前空間が未設定だとSchemaValidationErrorになるため、namespace引数か環境変数POWERTOOLS_METRICS_NAMESPACEを確認します。
log_metricsデコレーターが付いているか、add_metricを呼んでいるかも見直してください。
まとめ
今回は、Lambda Powertools(Python)でログとメトリクスを実装する方法について解説しました。
以下が本記事のまとめになります。



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。








