はじめに
サーバレスのイベントで紹介されたAWS Lambda Powertoolsが便利そうだったので触ってみました。
(こちらのセッションでも詳しく紹介されています)
AWS Lambda PowertoolsはLambda関数用のユーティリティ集で、
AWS X-Rayによるトレース、構造化ロギング、カスタムメトリックの出力が容易に実装できます。
また、SSM Parameter StoreやSecrets Managerからのパラメータ取得ができるユーティリティも付属しています。
現在の対応ランタイムはAWS Lambda Powertools PythonとAWS Lambda Powertools Javaの2種類となっています。
Node.jsではDAZN Lambda Powertoolsがあります。
触ってみる
構造化ロギング、カスタムメトリックの出力を試してみます。
LambdaのランタイムはPython3.8を使います。
AWS Lambda Powertoolsの導入
インストールはPyPIまたはLambda Layerで行います。
今回はLambda Layerで導入してみます。
Lambda Layerは複数のLambda関数でライブラリを共有する機能です。
AWS Lambda PowertoolsをLambda Layerとして作成し、
各Lambda関数にLayerを追加することでライブラリをimportできるようになります。
Lambda Layerの作成
AWS Lambda PowertoolsのLambda Layerは
AWS Serverless Application Repositoryに公開されているAWS SAM テンプレートから数クリックで作成できます。
Lambda関数の作成画面を開き「Serverless Application Repository の参照」を選択、
検索ウィンドウに「powertools」を入力して「aws-lambda-powertools-python-layer」をデプロイします。
AWS Lambda PowertoolsのLambda Layerを作成するCloud Formationが実行され、
「aws-lambda-powertools-python-layer」という名前のLambda Layerが作成さます。
Lambda関数へLayerを追加
Lambda関数内のコードからAWS Lambda PowertoolsのライブラリをimportできるようにLambda Layerを追加します。
構造化ロギング
Loggerの実装
print文やPythonのLoggerを使ってログ出力をすることができますが、
AWS Lambda Powertoolsを使うと、Jsonで構造化されたログを簡単に出力できます。
AWS Lambda PowertoolsのLoggerをimportし、
INFOログと、ネストしたログを出力してみます。
from aws_lambda_powertools import Logger
logger = Logger(service="logger_sample")
def lambda_handler(event, context):
logger.info("HELLO WORLD")
logger.info({
"operation": "collect",
"status_code": 200
})
他にもこのような便利な機能がありました。
-
デコレーターでLambdaのコンテキスト情報(cold_start:bool,memory_size:int)をログに含めたり
https://awslabs.github.io/aws-lambda-powertools-python/core/logger/#capturing-lambda-context-info -
ログに固定で出力する項目を追加したり
https://awslabs.github.io/aws-lambda-powertools-python/core/logger/#appending-additional-keys -
例外発生時にスタックトレースを出力したり
https://awslabs.github.io/aws-lambda-powertools-python/core/logger/#logging-exceptions
CloudWatch Logsに出力されたログの確認
先ほど出力したログをCloudWatch Logsで確認してみます。
ログがJSONで構造化されていることが確認できます。
CloudWatch Logs Insightsによるログ検索
Jsonで構造化されたログを出力すると、CloudWatch Logs Insightsは自動的にフィールドとして認識してくれます。
特定のフィールドに対してクエリで絞り込みや集計が行えるメリットがあります。
ネストされたJSONフィールドはドットで表記します。
カスタムメトリックの出力
boto3のCloudWatchでは、MetricDataをJSON構造で表記する必要がありました。
AWS Lambda Powertoolsを使うと、これが数ステップで実装できます。
from aws_lambda_powertools import Metrics
from aws_lambda_powertools.metrics import MetricUnit
metrics = Metrics(namespace="001_CustomMetrics")
@metrics.log_metrics
def lambda_handler(event, context):
metrics.add_dimension(name="environment", value="sample")
metrics.add_metric(name="sample_count", unit=MetricUnit.Count, value=1)
最後に
AWS Lambda Powertoolsを使うと、可読性も高くシンプルに実装できとても便利ですね!
これからはLambdaでのコード開発で積極的に使ってみたいと思います。
次はAWS Lambda Powertoolsを使ったAWS X-Rayトレースの実装も試してみます。
以上です。