AWSCompute Optimizer:Lamdba(get-lambda-function-recommendations)を使ってみた

2022/12/29に公開

はじめに

AWSのリソース設定は、スペックが良すぎたり、足りなかったりしてしまったりと、調整が難しい問題だと思います。特に、Lamdba 関数の調整については、パフォーマンスの判断が難しいです。
「AWS Compute Optimizer」を利用すれば、簡単に最適化の判断ができますのでご紹介します。

AWS Compute Optimizerとは

AWS Compute Optimizerとは、最近のリソースの使用状況を機械学習で分析し、適切なリソースを提示してくれるサービスです。
リソースを変更することで減らせるコストや、パフォーマンスの向上なども画面上で一目で分かります。

サポート対象

  • サポート対象
    • EC2インスタンス
    • EC2 AutoScaling
    • EBSボリューム
    • Lambda関数
  • 基本利用料
    • 無料
      • 分析の対象期間:14日
    • 有料(拡張インフラストラクチャメトリクス)
      • EC2と EC2 AutoScalingのみ:分析の対象期間:14日 -> 93日

詳細につきましては以下をご確認ください。
https://aws.amazon.com/jp/compute-optimizer/pricing/?nc1=h_ls

今回の記事

今回の記事は、Lamdba 関数について実際にどのような画面になるのかを記載しました。


実際の画面

Console

推奨事項一覧

対象アカウントにログインし、 [AWS Compute Optimizer] - [Lamdba 関数] を選択すると、レコメンドを返してくれます。

詳細画面

関数を選択し、詳細を選択をクリックしますと、現在の関数の平均実行時間と、推奨値に変更した際に予測される実行時間が表示されます。


Lamdba 管理画面

Compute Optimizer を有効化していて、指摘されている場合に、Lamdba の管理画面 - [当該関数] - [一般設定] の画面を選択すると、指摘項目(プロビジョニング不足)が表示されます。


CLI

コマンド

aws compute-optimizer get-lambda-function-recommendations

結果例

コマンド結果サンプル
{
    "lambdaFunctionRecommendations": [
        {
            "functionArn": "arn:aws:lambda:ap-northeast-1:0123456789012:function:BlueCmsLoginFunction:$LATEST",
            "functionVersion": "$LATEST",
            "accountId": "0123456789012",
            "currentMemorySize": 128,
            "numberOfInvocations": 78,
            "utilizationMetrics": [
                {
                    "name": "Duration",
                    "statistic": "Average",
                    "value": 1294.2212540064102
                },
                {
                    "name": "Duration",
                    "statistic": "Maximum",
                    "value": 2111.800048828125
                },
                {
                    "name": "Memory",
                    "statistic": "Average",
                    "value": 120.98717948717949
                },
                {
                    "name": "Memory",
                    "statistic": "Maximum",
                    "value": 128.0
                }
            ],
            "lookbackPeriodInDays": 14.0,
            "lastRefreshTimestamp": "2022-12-28T15:58:58.293000+09:00",
            "finding": "NotOptimized",
            "findingReasonCodes": [
                "MemoryUnderprovisioned"
            ],
            "memorySizeRecommendationOptions": [
                {
                    "rank": 1,
                    "memorySize": 160,
                    "projectedUtilizationMetrics": [
                        {
                            "name": "Duration",
                            "statistic": "LowerBound",
                            "value": 990.2097879859261
                        },
                        {
                            "name": "Duration",
                            "statistic": "Expected",
                            "value": 1039.7202773852225
                        },
                        {
                            "name": "Duration",
                            "statistic": "UpperBound",
                            "value": 1091.7062912544836
                        }
                    ]
                }
            ],
            "currentPerformanceRisk": "VeryLow"
        },
        {
            "functionArn": "arn:aws:lambda:ap-northeast-1:0123456789012:function:BlueOdbReserveFunction:$LATEST",
            "functionVersion": "$LATEST",
            "accountId": "0123456789012",
            "currentMemorySize": 128,
            "numberOfInvocations": 339,
            "utilizationMetrics": [
                {
                    "name": "Duration",
                    "statistic": "Average",
                    "value": 2215.014564896755
                },
                {
                    "name": "Duration",
                    "statistic": "Maximum",
                    "value": 10405.41015625
                },
                {
                    "name": "Memory",
                    "statistic": "Average",
                    "value": 128.0
                },
                {
                    "name": "Memory",
                    "statistic": "Maximum",
                    "value": 128.0
                }
            ],
            "lookbackPeriodInDays": 14.0,
            "lastRefreshTimestamp": "2022-12-28T15:58:58.293000+09:00",
            "finding": "Optimized",
            "findingReasonCodes": [],
            "memorySizeRecommendationOptions": [
                {
                    "rank": 1,
                    "memorySize": 128,
                    "projectedUtilizationMetrics": [
                        {
                            "name": "Duration",
                            "statistic": "LowerBound",
                            "value": 2040.8654639363858
                        },
                        {
                            "name": "Duration",
                            "statistic": "Expected",
                            "value": 2215.014564896755
                        },
                        {
                            "name": "Duration",
                            "statistic": "UpperBound",
                            "value": 2389.163665857124
                        }
                    ]
                }
            ]
        }
    ]
}

リファレンス

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/compute-optimizer/get-lambda-function-recommendations.html

Console と CLI の比較

大量にLamdba がある場合はCLI でやることをおすすめしますが、基本的にはConsole で確認することをおすすめします。

CLIですと、費用については差分を計算しなければならないことと
Console のみ出てくる、現在の関数の平均実行時間と、推奨値に変更した際に予測される実行時間があるので、初期段階で想定効果を確認せず変更をやるのは厳しいかなと思いました。


注意点

マルチアカウント運用時の運用

Compute Optimizer のサービスは、AWS Organizations のサービスより組織で有効化することが可能です。
しかし、2022-12-29現在、組織単位での一括表示には対応していないため、管理する場合は以下の中から対応を検討する必要があります。

  • 管理アカウントもしくは委任先のアカウントから対象アカウントを選択する
  • メンバーアカウントに都度ログインして確認する
  • CLI を用いて確認する

https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/delegate-administrator-account.html

https://dev.classmethod.jp/articles/aws-compute-optimizer-design-account/

推奨メモリサイズが表示されない

Compute Optimizer は、次の要件を満たす Lambda 関数に対して、推奨メモリサイズを生成します。

  • 構成されたメモリが 1,792 MB 以下
  • 過去 14 日間で少なくとも 50 回以上呼び出された関数

ですので、一般的には利用頻度が少ない Lamdba 関数に関しては推奨メモリサイズが出てこないと思われます。

参考文献

https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/view-lambda-recommendations.html
https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/requirements.html#requirements-lambda-functions
https://dev.classmethod.jp/articles/aws-compute-optimizer-delivers-recommendations-aws-lambda-functions/

Discussion