ChaliceにAWS Lambda Powertoolsを組み込む方法
内容について
扱うもの
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と併用している場合は、この限りではありません。)
{
"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ステップが必要になります。
- Chaliceの環境変数で
LOG_LEVEL
の設定 - コード上でLoggerの設定
LOG_LEVEL
の設定
1.Chaliceの環境変数で Loggerを動作させるためには、 LOG_LEVEL
を環境変数として設定する必要があります。
{
"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化しておくことで、全てのリクエストをキャプチャできるので、楽です。
# 省略
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ステップが必要になります。
- Chaliceのconfigでの設定
- コード上でTracerの設定
1.Chaliceのconfigでの設定
Loggerの時とは異なり、環境変数ではなく直のプロパティで設定します。
{
"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化しておきます。
# 省略
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
に以下のように記載する必要があります。
- aws_lambda_powertools
+ aws_lambda_powertools[tracer]
Discussion