Lambdaの性能把握、比較が一瞬で! CloudWatch Lambda InsightsがGAになりました #reinvent

Lambdaの事をもっと詳しく知れるかも!?
2020.12.04

大阪オフィスの小倉です。
プレビューだったAmazon CloudWatch Lambda InsightsがGAされたとの発表がありました。

https://aws.amazon.com/jp/about-aws/whats-new/2020/12/announcing-amazon-cloudwatch-lambda-insights-general-availability/

Amazon CloudWatch Lambda Insightsとは

以下はプレビュー時の発表ページからの引用ですが、

AWS Lambda コンソールでワンクリックするだけで、Lambda 関数からの詳細なパフォーマンスメトリクス、ログ、メタデータの収集を開始できます。あるいは、AWS CLI または CloudFormation を使用して Lambda Insights を有効にします。

とあるので、Lambdaに関する更に色々な情報が収集できるようになったのでしょう。

やってみた

今回はマネジメントコンソールから Lambda Insightsを有効化させてみます。 Lambda関数はマネジメントコンソールの「設計図の使用」から選択できるhello-world-pythonをそのまま使いました。

Lambda Insightsの有効化

モニタリングツール からLambda Insightsを有効化します。この画面では拡張モニタリングという表示になっていますね。 (画像取得時点だと、まだ「プレビュー」がついたままになっていますが)

有効化するとLambda関数にLambdaInsightsExtensionのLambda Layerが追加されていました。

Lambda関数を実行してみる

CloudWatchのメトリクスを見てみると、LambdaInsightsが確認できます。 従来のものとは異なるメトリクスが取得できそうです。

CloudWatch Logsを見てみると、/aws/lambda/lambda-insightsのロググループが作成されています。 ログストリームにログがJSON形式で出力されています。

{
    "duration": 88,
    "fd_max": 18778,
    "cpu_total_time": 290,
    "function_name": "hellopy-insights",
    "cpu_user_time": 80,
    "agent_version": "1.0.82.0",
    "tmp_free": 538329088,
    "rx_bytes": 42,
    "_aws": {
        "CloudWatchMetrics": [
            {
                "Namespace": "LambdaInsights",
                "Dimensions": [
                    [
                        "function_name"
                    ]
                ],
                "Metrics": [
                    {
                        "Name": "memory_utilization",
                        "Unit": "Percent"
                    },
                    {
                        "Name": "total_memory",
                        "Unit": "Megabytes"
                    },
                    {
                        "Name": "used_memory_max",
                        "Unit": "Megabytes"
                    },
                    {
                        "Name": "init_duration",
                        "Unit": "Milliseconds"
                    },
                    {
                        "Name": "cpu_total_time",
                        "Unit": "Milliseconds"
                    },
                    {
                        "Name": "tx_bytes",
                        "Unit": "Bytes"
                    },
                    {
                        "Name": "rx_bytes",
                        "Unit": "Bytes"
                    },
                    {
                        "Name": "total_network",
                        "Unit": "Bytes"
                    }
                ]
            }
        ],
        "Timestamp": 1607044824287,
        "LambdaInsights": {
            "ShareTelemetry": true
        }
    },
    "agent_memory_max": 9,
    "used_memory_max": 64,
    "fd_use": 384,
    "cold_start": true,
    "threads_max": 9,
    "billed_duration": 89,
    "cpu_system_time": 210,
    "request_id": "4a5782d5-3746-4e48-abc3-dda918ea944b",
    "event_type": "performance",
    "agent_memory_avg": 8,
    "memory_utilization": 50,
    "init_duration": 223,
    "tmp_max": 551346176,
    "total_network": 84,
    "tx_bytes": 42,
    "total_memory": 128
}

_aws - CloudWatchMetorics 内の項目が、メトリクスの画面に表示されていた項目の様ですが、他にも多くの項目が出力されていますね。
例えばcold_start の項目が出力されているので、Lambdaがコールドスタートしたかどうかが判断できそうです。
JSON形式で出力されているので、CloudWatch Logs Insightsでの集計や可視化にも利用できますね。

Performance monitoring

今度は、Lambdaのモニタリングタブから、「Lambdaインサイトの表示」を選択してみます。

Performance monitoringのダッシュボードが表示されます。
Single-functionを選択すると、選択したLambdaに関するダッシュボードが表示されます。

Multi-functionを選択すると、複数のLambda関数の情報を一緒に表示することが出来ます。 関数名やタグでの絞り込みにも対応しているので、Lambda関数の性能比較が一瞬で出来ますね。

まとめ

個人的には、つい先日までLambdaアプリケーションの性能テストをやっていたので、
「あともう少し早くGAしてくれれば。。。」という気持ちはあるのですが、
Lambdaの事をより詳しく知ることができる機能が増えるのはありがたいですね。
Lambdaを普段使われている方は、ぜひ活用してみてください。

参考

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights-Getting-Started.html