大柳です。
少し古い話になりますが、2017年6月のAWS DevDaysでのAWS西谷 圭介さんのセッション「全部教えます!サーバレスアプリのアンチパターンとチューニング」で、こんな話をされていました。
グローバルスコープの処理はDuration(Lambdaの課金対象時間)には含まれない。
関数/メソッドの実行からDurationのカウントが始まる。課金は100ms単位。
例えば時間のかかる初期化処理はグローバルスコープで実行すれば、Duration対象時間を短くして課金額をわずかでも減らせる可能性があります。実際、何秒までDurationにカウントされないか検証してみました。
検証方法
以下のようなLambdaコードを実行してグローバルスコープでSleep処理を実行することで、意図的にグローバルスコープでの処理時間を稼いで、実際のDurationを見てみます。
検証結果
グローバルスコープでの実行時間とDurationは以下のようになりました。
整理すると、このようになります。
・グローバルスコープでの実行時間が10秒未満 → Durationにはカウントされない
・グローバルスコープでの実行時間が10秒以上 → グローバルスコープでの実行時間もDurationにカウントされる
まとめ
グローバルスコープでの実行時間が10秒未満ならDurationにカウントされないことが分かりました。
Lambda内で時間のかかる処理、例えば大きなファイルをS3からダウンロードする場合などに、グローバルスコープで処理を実行することでDurationを少なくして課金を抑えられる可能性があります。
しかしながら、グローバルスコープで処理することで生まれる弊害もあるかもしれないので、利用時はお気を付けください。