[AWS CDK]AWS Lambda Powertoolsを簡単にレイヤー化できるcdk-aws-Lambda-powertools-layerを試してみた
はじめに
みなさん、Lambda Powertools は使っているでしょうか。非常に便利で、構造化ログの出力やバリデーションの実装ができるのですが、利用する際、Lambda にレイヤーをアタッチする必要があります。
レイヤーは自作してもよいですし、AWSが公開しているARNで指定ができるのですが、誰かいい感じの Construct 作ってないかなと思って調べたところ、AWS から以下が提供されていました。
使ってみたところ、import 後1行 CDK に記述するだけでレイヤーが作成できて便利だったので紹介します。
もしまだ Lambda Powertools を使ったことがないよという方は、ぜひ以下のブログを参照してください。
事前準備
実施した環境は以下です。
- 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 関数を作成しました。
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 のコードは以下です。
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 のレイヤーがちゃんと設定されていました。
テストを実行してログを確認してみると、無事 Powertools での構造化されたログが出力されていますね。
これで 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)がお送りしました。