CDKでLambda Insightsを設定してみた
目次
はじめに
こんにちは、CloudBuildersのsugawaraです。
最近は「CDKでLambdaの○○を設定してみた」ばかり書いてますが、、今回もLambdaに関する小ネタを紹介します。本記事では、CDKでLambda Insightsを有効化していきます。
Lambda Insightsとは
Lambda Insightsの正式名称は、Amazon CloudWatch Lambda Insightsです。そのため、CloudWatchコンソールから確認することができます。
Lambda Insights はLambda関数のパフォーマンスと運用データを提供するモニタリング機能です。Lambda Insightsを有効化すると、Lambda関数の詳細なメトリクスやログ、トレースデータを収集して可視化することができます。
Lambda Insightsの主な機能は下記の4つになります。
- パフォーマンスモニタリング
Lambda関数の実行時間、エラー、メモリ使用量などのパフォーマンスメトリクスを収集し、モニタリングすることができます。 - リソース使用量の可視化
CPU、メモリ、ディスク、ネットワークI/Oの使用状況を追跡することで、リソースの最適化やトラブルシューティングを行うのに役立ちます。 - ログとトレースの分析
CloudWatch LogsやAWS X-Rayと統合されており、詳細なログデータやトレースを収集して、エラーの原因やパフォーマンスの問題を特定するのに役立ちます。 - 自動メトリクス収集
Lambda関数に対してLambda Insightsを有効にすることで、自動的にメトリクスが収集され、CloudWatchコンソールで表示されます。
下記は実際のLambda Insightsの画面です。
実装方法
ここからはCDKで実際にLambdaとLambda Insightsを構築していきます。Lambda Insightsの有効化には、2つの書き方があります。
1つ目はAWS側で用意されたLambda Layer ARNを直接指定する方法です。下記はCDK公式リファレンスにあるサンプルコードです。有効化するためにリージョン固有のLambda LayerのARNを指定しています。
const layerArn = 'arn:aws:lambda:us-east-1:580247275435:layer:LambdaInsightsExtension:14';
new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
insightsVersion: lambda.LambdaInsightsVersion.fromInsightVersionArn(layerArn),
});
指定するLayerのARNは、アーキテクチャとリージョンによって異なります。今回の実装ではARM64を利用して東京リージョンにLambdaをデプロイしたいと思います。
2つ目はLambdaのプロパティでLambda Insightsのバージョンを指定する方法です。先ほどのCDK公式リファレンスのプロパティにもバージョン番号が記載されています。こちらのほうがコードはシンプルになります。
new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
insightsVersion: lambda.LambdaInsightsVersion.VERSION_1_0_229_0
});
ただし、2024年7月末現在、東京リージョンでは1.0.229.0が指定できる最新バージョンのようです。こちらの公式ドキュメントからバージョン番号は確認ができますが、1.0.229.0が最新ではないことがわかります。
どうやら1.0.229.0以降はCDK側の対象リストにap-northeast-1が記載されていないことが原因のようです。
実際のコード
1つ目のアプローチを用いてLambda Insightsを有効化していきます。
CDKコードのディレクトリ構成は下記です(一部省略)。
.
├── bin
│ └── lambda-insights.ts
├── cdk.json
├── lambda
│ └── src
│ └── index.py
├── lib
│ └── lambda-insights-stack.ts
├── node_modules
...
├── package-lock.json
├── package.json
├── .env
└── tsconfig.json
今回はdotenv ライブラリを使用して、AWSアカウントとリージョンを環境変数として .env ファイルから読み込んで設定しています。詳しくは過去の記事に記載していますので興味のある方はご一読をお願いします。
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { LambdaInsightsStack } from '../lib/lambda-insights-stack';
import * as dotenv from 'dotenv';
dotenv.config();
const app = new cdk.App();
new LambdaInsightsStack(app, 'LambdaInsightsStack');
lib配下でLambdaとLambda Layer ARNを記述しています。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
export class LambdaInsightsStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const layerArn = 'arn:aws:lambda:ap-northeast-1:580247275435:layer:LambdaInsightsExtension-Arm64:30';
const lambdaFunction = new lambda.Function(this, 'LambdaForInsights', {
functionName: 'sample-lambda-insights',
code: lambda.Code.fromAsset(`./lambda/src/`),
handler: 'index.lambda_handler',
runtime: lambda.Runtime.PYTHON_3_10,
architecture: lambda.Architecture.ARM_64,
insightsVersion: lambda.LambdaInsightsVersion.fromInsightVersionArn(layerArn)
});
}
}
LambdaのサンプルコードはPython 3.10となります。
import json
def lambda_handler(event, context):
# テスト用のLambda関数のメイン処理
message = "Hello, world!"
# レスポンスのフォーマット
return {
'statusCode': 200,
'body': json.dumps({'message': message})
}
上記のコードでデプロイして、作成されたLambdaを見てみると、Lambda Insightsが有効化されていることが確認できます。
実際に何度かLambdaを実行してみると、メトリクスが取得できていることが確認できます。これでLambdaのパフォーマンス分析が捗りますね。
※VPC Lambdaでなおかつプライベートサブネットに構築した場合には、CloudWatch Logs用のVPCエンドポイントとそのセキュリティグループの作成が必要となります。
おわりに
今回はLambda Insightsの実装について見ていきました。CDKでも簡単に有効化でき、Lambdaのパフォーマンスを一目で確認できるのは便利ですね。ぜひ活用していきたいと思います。
さて、そろそろ「CDKでLambdaの○○を設定してみた」のネタが尽きてきたので、また何か新しい小ネタを探していきたいと思います。