Help us understand the problem. What is going on with this article?

AWS Lambda Powertoolsを触ってみた

はじめに

サーバレスのイベント紹介された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トレースの実装も試してみます。

以上です。

dnpds
大日本印刷(DNP)のICT分野における戦略を担う会社です。  「Digital Communication Integrator(通称 CIer)」をVISIONとして掲げ、システムインテグレーションを担う「SIer」ではなく、ICTの力であらゆるものをコミュニケートし、社会の発展に貢献します。 お問い合わせは会社ホームページからお願いします。 
https://www.dnp-ds.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away