7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめに

サーバレスのイベント紹介されたAWS Lambda Powertoolsが便利そうだったので触ってみました。
(こちらのセッションでも詳しく紹介されています)

AWS Lambda PowertoolsはLambda関数用のユーティリティ集で、
AWS X-Rayによるトレース、構造化ロギング、カスタムメトリックの出力が容易に実装できます。
また、SSM Parameter StoreやSecrets Managerからのパラメータ取得ができるユーティリティも付属しています。

現在の対応ランタイムはAWS Lambda Powertools PythonAWS 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」をデプロイします。

lambda_001.png

AWS Lambda PowertoolsのLambda Layerを作成するCloud Formationが実行され、
「aws-lambda-powertools-python-layer」という名前のLambda Layerが作成さます。
lambda_001-2.png

Lambda関数へLayerを追加

Lambda関数内のコードからAWS Lambda PowertoolsのライブラリをimportできるようにLambda Layerを追加します。
lambda_002.PNG

構造化ロギング

Loggerの実装

print文やPythonのLoggerを使ってログ出力をすることができますが、
AWS Lambda Powertoolsを使うと、Jsonで構造化されたログを簡単に出力できます。

AWS Lambda PowertoolsのLoggerをimportし、
INFOログと、ネストしたログを出力してみます。

lambda_function.py
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
    })

他にもこのような便利な機能がありました。

CloudWatch Logsに出力されたログの確認

先ほど出力したログをCloudWatch Logsで確認してみます。
ログがJSONで構造化されていることが確認できます。
lambda_003.png

CloudWatch Logs Insightsによるログ検索

Jsonで構造化されたログを出力すると、CloudWatch Logs Insightsは自動的にフィールドとして認識してくれます。
特定のフィールドに対してクエリで絞り込みや集計が行えるメリットがあります。
ネストされたJSONフィールドはドットで表記します。
lambda_004.png

カスタムメトリックの出力

boto3のCloudWatchでは、MetricDataをJSON構造で表記する必要がありました。

AWS Lambda Powertoolsを使うと、これが数ステップで実装できます。

lambda_function.py
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)

lambda_005.png

最後に

AWS Lambda Powertoolsを使うと、可読性も高くシンプルに実装できとても便利ですね!
これからはLambdaでのコード開発で積極的に使ってみたいと思います。

次はAWS Lambda Powertoolsを使ったAWS X-Rayトレースの実装も試してみます。

以上です。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?