Lambdaのコールドスタート調査を短時間で行う

背景

  • LambdaをVPCに入れたときのコールドスタートにかかる時間を測定したい
    • LambdaをVPCに入れることがアンチパターンという情報は見たが、自分で測定したことがなかった
  • Amazon Connectから呼び出すLambdaとDBをどうつなげるか調査のため
    • VPC内のリソースを参照しても大丈夫なのか、その他の方法をとるべきなのか
  • いつ起こるかわからないコールドスタートを待ったり、長い時間をかけてログを取るのが面倒なので、確実にコールドスタートを発生させたい

 

参考にした良記事

https://www.linkedin.com/pulse/aws-lambda-container-lifetime-config-refresh-frederik-willaert

→ ポイント
  • Lambda内のグローバル変数は同一コンテナであれば共有される
    • 別コンテナに変わったことを検知するためにグローバル変数を使う
      • (コールドスタート=別コンテナに変わったこと、という認識)
  • 生きている全コンテナをKillするためには再デプロイが有効
    • ただし再デプロイだとバージョンが増えて非常に無駄なので aws CLI の aws lambda update-function-configuration を使う

 

コード

計測対象: シンプルなLambda関数

  • このLambda関数をVPC内、VPC外でそれぞれ試す

 

 

計測用Lambda関数

 

 

計測実行のためのシェルスクリプト

 

 

結果

数百回の呼び出しで試行しました。

  • VPC外
    • コールドスタート100回に1回程度の頻度で、3秒ほどかかるリクエストが発生
    • 普段のコールドスタートはコンマ数秒
  • VPC内
    • コールドスタート20回に1回程度の頻度で、8-9秒ほどかかるリクエストが発生
      • 最大で17秒を確認
    • 普段のコールドスタートはコンマ数秒

 

VPCに入れると数十秒かかると聞いていましたが、思ったよりも短かったです。

何か他の条件が加わるとこれより長くなるのかもしれません。

上記は短期間に何度も呼び出すテストだったので、念のため定期呼び出しでも計測してみています。