のべラボ.blog

Tech Blog | AWS や サーバーレスやコンテナ などなど

AWS Compute Optimizer で Lambda 関数の推奨事項を提示させてみた!

本記事は「AWS LambdaとServerless Advent Calendar 2023」3 日目の記事です。


今回は、AWS Compute Optimizer を使って Lambda 関数のメモリ設定に関する推奨事項を確認してみます!

目次


AWS Lambda 関数のメモリ設定の最適値導出について

AWS Lambda の Lambda 関数には使用するメモリ容量を設定できますが、この設定されたメモリ容量に比例して CPU パワーも割り当てられます。

docs.aws.amazon.com

また、メモリ容量の設定は、Lambda 関数のコストにも影響します。

aws.amazon.com

よって、Lambda 関数のメモリ容量を設定する場合は、パフォーマンスとコストの両面から最適値を導き出すことが重要となります。

そんな時には、下記のサービスやツールの使用を検討してみて下さい。

AWS Compute Optimizer

AWS Compute Optimizer は、Lambda 関数や、EC2 インスタンス、EC2 AutoScaling Group、EBS ボリュームなどの最適化について推奨事項を提示してくれるサービスです。

docs.aws.amazon.com

AWS Lambda Power Tuning

AWS Lambda Power Tuning は、Lambda 関数を対象にさまざまなメモリ割り当てを選択し、実行時間とコストを測定することで最適値の分析を支援してくれるツールです。 具体的には、AWS Step Functions のステートマシンを使用し、測定対象の Lambda 関数を実行して分析用のデータを収集します。

docs.aws.amazon.com

AWS Lambda Power Tuning は、筆者も AWS のサーバーレスのトレーニング登壇時によくデモを実施しているのですが、この記事では、AWS Compute Optimizer に着目していきたいと思います!


AWS Compute Optimizer における Lambda 関数の要件

以下のドキュメントにも記載がありますが、AWS Compute Optimizer で Lambda 関数の推奨を提示させるにはいくつか要件があります。

docs.aws.amazon.com

要件

  • Lambda 関数に設定されているメモリは 1,792 MB 以下であること

  • Lambda 関数は過去 14 日間に少なくとも 50 回呼び出されていること

2023 年 12 月現在、Lambda 関数には最大 10,240 MB のメモリを設定できるので、「1,782 MB 以下であること」という要件には少し疑問が残りましたが、今回はこの要件にマッチする Lambda 関数を用意して、推奨事項を提示してくれるか確認してみることにしました。

この要件をみると、AWS Compute Optimizer は、AWS Lambda Power Tuning のように、その場で Lambda 関数を実行してすぐに結果を出すのではなく、ある程度の期間、実行された Lambda 関数の情報から推奨事項を出してくれるので、現在、運用中の本番環境のワークロードを対象にしやすいというメリットがありますね。(本番環境で推奨事項を出すために AWS Lambda Power Tuning で実際に Lambda 関数を実行するのは、一般的には避けたいですよね。)


測定対象の Lambda 関数

今回は、測定対象として以下の Lambda 関数を Python で実装しました。

名前 設定メモリ(MB) 処理内容
demo-memory-under-provisioned 128 設定値である 128 MB ギリギリまでメモリを使用する(メモリ割り当てが十分でない状況にする)
demo-OOM 128 メモリ不足でエラーが発生する処理をする(関数エラーが発生する状況にする)
My-CPU-eater-function 128 1 回の呼出しで CPU を 5 秒間使用し続ける

上の表のうち、demo-memory-under-provisioned は、Lambda 関数で使用するメモリが設定値ギリギリまで使用するコードになっていることは、ログで確認できています。 下記はこの Lambda 関数実行時の REPORT ログですが、Memory Size の値と Max Memory Used の値が同じ になっていますね。ただ、メモリ不足エラーが起こらないように、あくまでギリギリにしています。

REPORT RequestId: xxx    Duration: 2229.80 ms    Billed Duration: 2230 ms      Memory Size: 128 MB   Max Memory Used: 128 MB

これらの Lambda 関数を Amazon Event Bridge のスケジューラを使用して定期的に実行して、14 日以上経過した後に AWS Compute Optimizer で推奨事項が表示されるか確認してみます。

(追記:メモリ割り当てが過剰な Lambda 関数についてもテストしようとしたのですが、なぜか今回の検証では Compute Optimizer でうまく検知させることができませんでしたので、これはあらためて調査したいと思います!mm)


結果

結論からすると、メモリ割り当てが不十分なもの、CPU を 5 秒間消費するものについては、推奨事項が表示されました。 ただ、メモリ不足でエラーが発生したものについては、推奨事項は表示されませんでした。

AWS マネジメントコンソールで AWS Compute Optimizer のダッシュボードでは、次のように表示されました。

レコメンデーションの表示

上の図のダッシュボードで、「レコメンデーションを表示」をクリックすると、次のように各関数毎の情報が表示されます。(下記は抜粋です。)

  • Lambda 関数のバージョンや検出理由

  • Lambda 関数の現在設定されているメモリと推奨設定メモリ

推奨値を出してくれるのは、ありがたいですね!

  • Lambda 関数の現在のコストと推奨コストや、そのコスト差

推奨値を適用した場合のコスト予測も出してくれるので、パフォーマンスだけでなくコストも含めて分析できます。


まとめ

AWS Compute Optimizer が、以下のような Lambda 関数について推奨事項を提示してくれることを確認できました。

  • メモリの割り当てが不十分な Lambda 関数
  • CPUを多く消費している Lambda 関数

ただ、今回のテストケースでは、メモリ不足で関数エラーが発生した Lambda 関数については推奨事項が提示されることはありませんでした。ただこのケースでは、関数エラーが発生しているのですぐにログで問題を検出できるため、Compute Optimizer で検出させるまでもない、と考えることもできますね。


所感

普段は、デモの実施のしやすさから AWS Lambda Power Tuning を説明する機会が多いのですが、今回、AWS Compute Optimizer について検証し、新たな気づきを得ることができたので、AWS Compute Optimizer についても積極的に情報発信していこうと思います!


/* -----codeの行番号----- */