🦾

ChaliceにAWS Lambda Powertoolsを組み込む方法

2023/10/19に公開

内容について

扱うもの

AWS Lambda Powertoolsの以下の設定方法

  • Logger
  • Tracer

扱わないもの

  • LoggerやTracerの使い方そのもの
  • AWS Lambda Powertools の上記以外の機能 (Parser, Metrics, etc ...)

背景

Chalice は、Pythonを利用してAWS上に簡単にServerlessなAPIを構築するためのフレームワークです。
書き心地は Flask に近く、API Gatewayだけでなく、SQS/S3等のevent triggerにも対応しており、ポリシーも一定自動で設定してくれるため、サクッと何かを作りたいときに非常に便利です。

AWS Lambda Powertools は、Lambdaでの開発をサポートしてくれるライブラリで、CloudWatch Logsのフォーマットを整えたり、X-Rayのトレースを簡単に行えるようにしてくれたりします。また、前述のChaliceを使わずに、単独でLambdaを書く場合にも利用できます。( LambdaContextのパーサを提供してくれるので、これ単体でも非常に強力です)。

この記事では、(N番煎じ感がありますが、)Chaliceにpowertoolsのログ機能とトレース機能を組み合わせる方法を、備忘として残しておきます。

LoggerとTracerに共通の設定事項 (POWERTOOLSを使う場合に必要)

環境変数に POWERTOOLS_SERVICE_NAME を設定する必要があります。
Chaliceだと環境変数は .chalice/config.json内で設定できます。
(CDKと併用している場合は、この限りではありません。)

config.json
{
    "version": "2.0",
    "app_name": "my-app",
    "environment_variables": {
+        "POWERTOOLS_SERVICE_NAME": "my-app" # ここで設定
    }
    "stages": {
        "dev": {
            "api_gateway_stage": "api",
            "environment_variables": {
+                 "POWERTOOLS_SERVICE_NAME": "my-app-dev" # ここで上書きも可能
            }
        }
    }
}

Loggerの設定

Loggerを設定するには、下の2ステップが必要になります。

  1. Chaliceの環境変数で LOG_LEVEL の設定
  2. コード上でLoggerの設定

1.Chaliceの環境変数で LOG_LEVEL の設定

Loggerを動作させるためには、 LOG_LEVEL を環境変数として設定する必要があります。

config.json
{
    "version": "2.0",
    "app_name": "my-app",
    "environment_variables": {
        "POWERTOOLS_SERVICE_NAME": "my-app"
+        "LOG_LEVEL": "INFO" # ここで設定
    }
    "stages": {
        "dev": {
            "api_gateway_stage": "api",
            "environment_variables": {
                "POWERTOOLS_SERVICE_NAME": "my-app-dev"
+               "LOG_LEVEL": "DEBUG" # ここで上書きも可能
            }
        }
    }
}

2.コード上でLoggerの設定

ライブラリから読み込んで、loggerとして設定するだけではあるのですが、MiddleWare化しておくことで、全てのリクエストをキャプチャできるので、楽です。

app.py
# 省略
from chalice import Chalice
from chalice.app import ConvertToMiddleware
from aws_lambda_powertools import Logger
from aws_lambda_powertools.logging import correlation_paths

app = Chalice(app_name='my-app')

logger = Logger() 

# MiddleWare化
app.register_middleware(ConvertToMiddleware(
    logger.inject_lambda_context(
        log_event=True, # センシティブ情報を含む可能性があるため注意。
        correlation_id_path=correlation_paths.API_GATEWAY_REST, # API GWのリクエストIDを利用
    )
))

# 使い方
@app.route('/hello')
def say_hello_to_the_world():
    logger.info('say hello') # このログが構造化されて出力される
    return {'hello': 'world'}

Tracerの設定

Loggerと同様、Tracerを設定するのも、下の2ステップが必要になります。

  1. Chaliceのconfigでの設定
  2. コード上でTracerの設定

1.Chaliceのconfigでの設定

Loggerの時とは異なり、環境変数ではなく直のプロパティで設定します。

config.json
{
    "version": "2.0",
    "app_name": "my-app",
    "environment_variables": {
        "POWERTOOLS_SERVICE_NAME": "my-app"
        "LOG_LEVEL": "INFO"
    }
+   "xray": true # ここで設定
    "stages": {
        "dev": {
            "api_gateway_stage": "api",
            "environment_variables": {
                "POWERTOOLS_SERVICE_NAME": "my-app-dev"
                "LOG_LEVEL": "DEBUG"
            }
        }
    }
}

2. コード上でTracerの設定

Loggerと同様、MiddleWare化しておきます。

app.py
# 省略
from chalice import Chalice
from chalice.app import ConvertToMiddleware
from aws_lambda_powertools import Tracer


app = Chalice(app_name='my-app')

tracer = Tracer()

# MiddleWare化
app.register_middleware(ConvertToMiddleware(
    tracer.capture_lambda_handler
))

@app.route('/hello')
def say_hello_to_the_world():
    my_method()
    return {'hello': 'world'}

# Lambdaのハンドラ以外にも適用できる
@tracer.capture_method
def my_method():
    # do something
    pass

Tracer利用時の注意点

tracer を利用するには、 aws_lambda_powertools[tracer] としてインストールする必要があります。( aws_lambda_powertools だけだと、 Loggerしかついてきません)

pip install aws_lambda_powertools[tracer]

Chaliceの場合、 requirements.txt に以下のように記載する必要があります。

requirements.txt
- aws_lambda_powertools
+ aws_lambda_powertools[tracer]

参考

Discussion