Lambda Insightsの仕組みと活用方法について整理してみた

2023.09.14

こんにちは、つくぼし(tsukuboshi0755)です!

皆さんはLambda Insightsについて知っていますか?

この機能により、Lambda関数自体のAWSメトリクスとは別に、Lambda Insights専用のカスタムメトリクスが追加で作成され、関数のパフォーマンスを簡単に確認できるようになります。

今回はこのLambda Insights自体の仕組みを整理した上で、Lambda Insightsの活用方法について詳しく解説します!

Lamdba Insightsを有効化するには

Lambda Insightsの有効化手順は、コンソールの場合と、CLI/CloudFormation/CDKを使用する場合とで多少異なります。

コンソールで有効化する場合

以下の画面のように、Lambda関数の設定 > モニタリング及び運用ツールを選択し、編集ボタンより拡張モニタリングをオンにする事で簡単に有効化できます。

詳細な有効化手順については、以下の公式ドキュメントをご参照ください。

CLI/CloudFormation/CDKで有効化する場合

API経由で有効化するには、以下2点の作業が必要になります。

  1. CloudWatchLambdaInsightsExecutionRolePolicyを関数実行ロールに追加

  2. LambdaInsightsExtension拡張機能をレイヤーとして関数に追加

詳細な有効化手順については、以下の公式ドキュメントをご参照ください。

なお以下の公式ドキュメントの通り、リージョン毎に使用可能な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)でした!