Lambda Insightsの仕組みと活用方法について整理してみた
こんにちは、つくぼし(tsukuboshi0755)です!
皆さんはLambda Insightsについて知っていますか?
この機能により、Lambda関数自体のAWSメトリクスとは別に、Lambda Insights専用のカスタムメトリクスが追加で作成され、関数のパフォーマンスを簡単に確認できるようになります。
今回はこのLambda Insights自体の仕組みを整理した上で、Lambda Insightsの活用方法について詳しく解説します!
Lamdba Insightsを有効化するには
Lambda Insightsの有効化手順は、コンソールの場合と、CLI/CloudFormation/CDKを使用する場合とで多少異なります。
コンソールで有効化する場合
以下の画面のように、Lambda関数の設定 > モニタリング及び運用ツールを選択し、編集ボタンより拡張モニタリングをオンにする事で簡単に有効化できます。
詳細な有効化手順については、以下の公式ドキュメントをご参照ください。
CLI/CloudFormation/CDKで有効化する場合
API経由で有効化するには、以下2点の作業が必要になります。
- CloudWatchLambdaInsightsExecutionRolePolicyを関数実行ロールに追加
-
LambdaInsightsExtension拡張機能をレイヤーとして関数に追加
詳細な有効化手順については、以下の公式ドキュメントをご参照ください。
- 既存の Lambda 関数で Lambda Insights を有効にするために AWS CLI を使用する - Amazon CloudWatch
- 既存の Lambda 関数で Lambda Insights を有効にするために AWS CloudFormation を使用する - Amazon CloudWatch
- 既存の Lambda 関数で Lambda Insights を有効にするために AWS CDK を使用する - Amazon CloudWatch
なお以下の公式ドキュメントの通り、リージョン毎に使用可能なLambdaInsightsExtension拡張機能のバージョンが異なります。
事前にバージョンを調査した上で、レイヤーとして関数に追加するようにしてください。
Lamdba Insightsにより作成されるもの
Lambda Insightsを有効化すると、主に以下の3つのリソースが作成されます。
ダッシュボード
Lambda Insights専用のダッシュボードが以下の通り作成されます。
こちらは全ての関数、または特定の関数のメトリクスを一覧で確認できるようになっています。
ダッシュボードの確認方法については、以下の公式ドキュメントをご参照ください。
ロググループ
/aws/lambda-insights
という名前のロググループが自動作成されます。
このロググループに対して、Lambda Insightsを有効化した各関数が実行された際に、関数名/ランダムな文字列
という名前でログストリームが順次作成されるようです。
このログストリームには、以下の形式でログイベントが出力されます。
{ "_aws": { "Timestamp": 1605034324256, "CloudWatchMetrics": [ { "Namespace": "LambdaInsights", "Dimensions": [ [ "function_name" ], [ "function_name", "version" ] ], "Metrics": [ { "Name": "memory_utilization", "Unit": "Percent" }, { "Name": "total_memory", "Unit": "Megabytes" }, { "Name": "used_memory_max", "Unit": "Megabytes" }, { "Name": "cpu_total_time", "Unit": "Milliseconds" }, { "Name": "tx_bytes", "Unit": "Bytes" }, { "Name": "rx_bytes", "Unit": "Bytes" }, { "Name": "total_network", "Unit": "Bytes" }, { "Name": "init_duration", "Unit": "Milliseconds" }, { "Name": "tmp_used", "Unit": "Bytes" } ] } ], "LambdaInsights": { "ShareTelemetry": true } }, "event_type": "performance", "function_name": "cpu-intensive", "version": "Blue", "request_id": "12345678-8bcc-42f7-b1de-123456789012", "trace_id": "1-5faae118-12345678901234567890", "duration": 45191, "billed_duration": 45200, "billed_mb_ms": 11571200, "cold_start": true, "init_duration": 130, "tmp_free": 538329088, "tmp_max": 551346176, "threads_max": 11, "used_memory_max": 63, "total_memory": 256, "memory_utilization": 24, "cpu_user_time": 6640, "cpu_system_time": 50, "cpu_total_time": 6690, "fd_use": 416, "fd_max": 32642, "tx_bytes": 4434, "rx_bytes": 6911, "timeout": true, "shutdown_reason": "Timeout", "total_network": 11345, "agent_version": "1.0.72.0", "agent_memory_avg": 10, "agent_memory_max": 10 }
ロググループの詳細については、以下の公式ドキュメントをご参照ください。
メトリクス
LambdaInsights名前空間において、以下のカスタムメトリクスが自動作成されます。
カスタムメトリクス名 | 概要 |
---|---|
cpu_total_time | CPU がカーネルコード及びユーザーコードの実行に費やした時間 |
init_duration | コールドスタート時の関数の初期化時間 |
memory_utilization | 関数が使用するメモリの最大使用率 |
rx_bytes | 関数が受信したバイト数 |
tx_bytes | 関数が送信したバイト数 |
total_memory | 関数に割り当てられたメモリの量 |
total_network | 関数が送信及び受信したバイト数 |
used_memory_max | 関数が使用したメモリの最大量 |
また以下のその他のメトリクスが、CloudWatch Logs Insightsを使用して確認できるようになります。
その他のメトリクス名 | 概要 |
---|---|
cpu_system_time | CPU がカーネルコードの実行に費やした時間 |
cpu_total_time | CPU がカーネルコード及びユーザーコードの実行に費やした時間 |
cpu_user_time | CPU がユーザーコードの実行に費やした時間 |
fd_max | 関数が使用可能なファイル記述子の最大数 |
fd_use | 関数が使用するファイル記述子の最大数 |
memory_utilization | 関数が使用するメモリの最大使用率 |
rx_bytes | 関数が受信したバイト数 |
tx_bytes | 関数が送信したバイト数 |
threads_max | 関数プロセスで使用中のスレッドの数 |
tmp_max | 関数が/tmp ディレクトリで使用可能な領域の量 |
tmp_used | 関数が/tmp ディレクトリで使用した領域の量 |
total_memory | 関数に割り当てられたメモリの量 |
total_network | 関数が送信及び受信したバイト数 |
used_memory_max | 関数が使用したメモリの最大量 |
メトリクスの詳細については、以下の公式ドキュメントをご参照ください。
Lambda Insightsの活用方法
以下ではLambda Insightsを有効化すると良さげな場面について、主に3通りのパターンを紹介させて頂きます。
関数毎のパフォーマンスをダッシュボードで確認したい時
Lambda関数のパフォーマンスを、ダッシュボードを使用して一目で確認したい時に使用できます。
特に複数のLambda関数のパフォーマンスを比較する時に、役に立ちそうです。
専用のカスタムメトリクスをアラームとして使用したい時
Lambda Insights専用のカスタムメトリクスを使用する事で、Lambda関数のパフォーマンスに関するアラームを簡単に作成できます。
特にメモリ関連のメトリクスであるmemory_utilization
/used_memory_max
を使用する事で、Lambdaのメモリ監視をAWSの標準機能で実現できるのは良いですね。
ちなみにLambda Insightsを有効化せずとも、以下のいずれかの設定方法でもLambdaのメモリ監視は可能みたいです。
ただしLambda Insightsを使用した場合と比較して、いずれもカスタマイズしたリソースが追加されるため、運用が煩雑になる可能性がある事にご注意ください。
専用のその他のメトリクスを可視化したい場合
Lambda Insights専用のその他のメトリクスは、CloudWatch Logs Insightsを使用して可視化できます。
特にファイルディスクリプタ関連のfd_max
/fd_use
や、tmpディレクトリ容量関連のtmp_max
/tmp_used
は、Lambda関数のパフォーマンスに影響を与える可能性がある程度あります。
そのため上記が原因でエラーが起きた際は、CloudWatch Logs InsightsとLambda Insightsを用いて可視化すると良いかもしれません。
CloudWatch Logs Insightsを用いてLambda Insightsのメトリクスを可視化する方法については、以下のブログをご参照ください。
最後に
今回はこのLambda Insightsどのような場面で効果的に働くかについて、Lambda Insights自体の仕組みと収集可能なメトリクスを踏まえた上で解説しました。
Lambda Insightsを有効化する事で、Lambda関数のメモリやディスク容量に関する監視を簡単に実現できるのは良いですね。
Lambdaのモニタリングを考えている方は、ぜひ一度Lambda Insightsを検討して頂くと良いかもしれません。
以上、つくぼし(tsukuboshi0755)でした!