Lambdaの同時実行数の計算方法と計算で必要となるデータをログインサイトから求める方法について記載します。
まず、なぜ同時実行数の計算が必要になるかについてですが、Lambdaには同時実行数の上限があるためです。
同時実行数のデフォルトは1000となっています。
これを超える場合には上限引き上げをAWSに依頼する必要があります。
引き上げが必要になる少なくとも 2 週間前に制限の引き上げをリクエストするのがベストプラクティスです。
参照:https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-concurrency-limit-increase/
同時実行数の上限引き上げは、事前にリクエストしておく必要があります。
また、同時実行数を超えるとスロットリングエラーというエラーが発生してしまいますので、事前に同時実行数を見積もり、同時実行数が1000を超える場合は、上限引き上げをAWSに依頼する必要があります。
スロットリングエラーが発生しないように正しく同時実行数の計算方法を理解していきましょー
それでは、同時実行数の計算方法について記載していきます。
同時実行数の計算方法
以下の計算式で求めることができます。
関数の平均実行時間 × 関数の平均リクエスト数 = 同時実行数
次に運用中の関数の同時実行数について、計算要素をログから求め、最終的に同時実行数を算出する方法について記載します。
関数の平均実行時間
関数の平均リクエスト数
関数の平均実行時間の求め方
CloudWatchのログインサイトを使用します。
CloudWatchのログインサイトで対象関数のログを検索をします。
検索時に使用するクエリは以下の通りです。
fields @timestamp, @message, @logStream, @log
| filter @message like 'REPORT RequestId'
| parse @message 'REPORT RequestId: *Duration:*ms*' as reqid, time, after
| stats avg(time)
上記クエリの結果が「関数の平均実行時間(ms)」になります。
関数の平均リクエスト数の求め方
こちらもCloudWatchのログインサイトを使用します。
CloudWatchのログインサイトで対象関数のログを選択して、以下のクエリを実行します。
fields @timestamp, @message, @logStream, @log
| filter @message like 'REPORT RequestId'
| stats count(@message)
上記クエリの結果を1秒に割り戻した数が「関数の平均リクエスト数」になります。
クエリの結果が36000でログ検索対象の時間が1時間の場合、以下の計算式のように「関数の平均リクエスト数」を算出します。
36000(クエリの結果)÷60(1分あたりに割り戻す)÷60(1秒あたりに割り戻す) = 10
同時実行数を算出してみる
上記で求めた「関数の平均実行時間(ms)」と「関数の平均リクエスト数」がそれぞれ以下の通りとします。
- 関数の平均実行時間:100(ms)
- 関数の平均リクエスト数:10
上記の場合、以下の計算で同時実行数を算出できます。
100(関数の平均実行時間(ms))÷1000(関数の平均実行時間を秒に換算)×10(関数の平均リクエスト数)=1(同時実行数)
まとめ
Lambdaの同時実行数の計算方法と計算に用いる値の調べ方についてみてきました。
Lambdaの同時実行数の計算は漠然と難しそうでしたが、改めて整理すると思ったより簡単に算出できたと思います!
同時実行数のスロットリングエラーではなく、タイムアウトエラーも知りたいよ、という場合は以下の記事もご参照ください