[AWS CDK]AWS Lambda Powertoolsを簡単にレイヤー化できるcdk-aws-Lambda-powertools-layerを試してみた

[AWS CDK]AWS Lambda Powertoolsを簡単にレイヤー化できるcdk-aws-Lambda-powertools-layerを試してみた

Clock Icon2025.01.26

はじめに

みなさん、Lambda Powertools は使っているでしょうか。非常に便利で、構造化ログの出力やバリデーションの実装ができるのですが、利用する際、Lambda にレイヤーをアタッチする必要があります。

レイヤーは自作してもよいですし、AWSが公開しているARNで指定ができるのですが、誰かいい感じの Construct 作ってないかなと思って調べたところ、AWS から以下が提供されていました。

使ってみたところ、import 後1行 CDK に記述するだけでレイヤーが作成できて便利だったので紹介します。

もしまだ Lambda Powertools を使ったことがないよという方は、ぜひ以下のブログを参照してください。

https://dev.classmethod.jp/articles/aws-lambda-powertools-python/

https://aws.amazon.com/jp/builders-flash/202203/lambda-powertools-python-1/

事前準備

実施した環境は以下です。

  • cdk: 2.173.4
  • docker が利用できる

空のフォルダで CDK のセットアップをします。

cdk init app --language typescript

cdk-aws-lambda-powertools-layerをインストール。

npm i cdk-aws-lambda-powertools-layer

これで準備は完了です。

実装

今回は Powertools の Layer と Python の Lambda 関数を作成しました。

lib/powertools-lambda-layer-cdk-stack.ts
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { LambdaPowertoolsLayer } from 'cdk-aws-lambda-powertools-layer';
import { Code, Function as LambdaFunction, Runtime } from 'aws-cdk-lib/aws-lambda';
import * as path from 'node:path';

export class PowertoolsLambdaLayerCdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const powertoolsLayer = new LambdaPowertoolsLayer(this, 'PowertoolsLayer', {});

    new LambdaFunction(this, 'LambdaFunction', {
      runtime: Runtime.PYTHON_3_12,
      code: Code.fromAsset(path.join('./function')),
      handler: 'app.handler',
      layers: [powertoolsLayer],
    });
  }
}

レイヤー追加するのに書いたコードはここだけです。

const powertoolsLayer = new LambdaPowertoolsLayer(this, 'PowertoolsLayer', {});

cdk-aws-lambda-powertools-layerをインストールするだけで利用できるの嬉しいですね。

Lambda のコードは以下です。

function/app.py
import json
from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

logger = Logger()

@logger.inject_lambda_context(log_event=True)
def handler(event: dict, context: LambdaContext) -> dict:
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Powertools の動作確認のために、inject_lambda_contextを使ったログ出力を有効化しています。

それではデプロイして確認してみましょう。

npx cdk deploy --all

動作確認

デプロイした Lambda 関数のレイヤーを確認すると、Powertools のレイヤーがちゃんと設定されていました。
スクリーンショット 2025-01-26 午前7.45.52.png

テストを実行してログを確認してみると、無事 Powertools での構造化されたログが出力されていますね。
スクリーンショット 2025-01-26 午前7.47.54.png

これで Powertools を使った実装が捗りそうです。

LambdaPowertoolsLayerで設定できること

先ほどは以下のようなシンプルな設定でデプロイしたので、デフォルトの設定になっていました。

const powertoolsLayer = new LambdaPowertoolsLayer(this, 'PowertoolsLayer', {});

props として渡せるパラメータはこちらから確認できます。
現時点(2025/01/26)では以下が利用できます。(Description は翻訳してます)

Name Type Description
compatibleArchitectures Architecture[] レイヤーと互換性のあるアーキテクチャ。
includeExtras boolean エクストラ依存関係(pydantic、aws-xray-sdkなど)のフラグ。これによりレイヤーのサイズが大幅に増加します。パースを使用しない場合は無視してください。
layerVersionName string レイヤーの名前。空の場合はランダム化されます。
runtimeFamily RuntimeFamily レイヤーのランタイム。
version string pypiリポジトリからの AWS Lambda 用 Powertools パッケージのバージョン。

まとめ

cdk-aws-Lambda-powertools-layerを使った Lambda Powertools レイヤーを実装してみました。

非常にシンプルな記述で実装できるので、まだ Lambda Powertools を使ったことがない方も使ってみてください。

以上、鈴木純(@jusotech10)がお送りしました。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.