【AWS】Lambda Powertools(Python)でログとメトリクスを実装する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

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向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【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のセグメント管理も、自分で書くと地味に大変なんですよね。

インストールとセットアップ

STEP
パッケージをインストールする

pipでaws-lambda-powertoolsを追加します。

pip install "aws-lambda-powertools[tracer]"

Tracerを使う場合はtracerエクストラを指定して、aws-xray-sdkも一緒にインストールします。

STEP
環境変数を設定する

サービス名やメトリクスの名前空間は環境変数でまとめて指定できます。

POWERTOOLS_SERVICE_NAME=payment
POWERTOOLS_METRICS_NAMESPACE=ServerlessApp
POWERTOOLS_LOG_LEVEL=INFO

SAMや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つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • 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)でログとメトリクスを実装する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Powertools for AWS LambdaはLogger・Tracer・Metricsをデコレーター中心で追加できる。
  • Loggerは構造化ログ、TracerはX-Ray、MetricsはCloudWatch EMFに対応する。
  • 3つのデコレーターを重ねるだけでLambdaの可観測性が整う。
  • サービス名や名前空間は環境変数でまとめて設定できる。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次