Lambda SnapStart と Provisioned Concurrency の違いを教えてください
困っていた内容
コールドスタート対策のため、Lambda SnapStart と Provisioned Concurrency を検討しています。
どのような違いがあり、コールドスタート対策にはどちらが推奨されるか教えてください。
どう対応すればいいの?
コールドスタートの排除が目的の場合、Provisioned Concurrency をご検討ください。
Lambda SnapStart は、初期化された実行環境のキャッシュを利用し、起動時のレイテンシーを低減する機能です。ベストエフォートであり、ワークロードに依存してパフォーマンスが向上しない場合もあります。
Provisioned Concurrency は、指定した数の初期化された実行環境をウォームアップし、意図的にウォームスタートを実現する機能です。指定した範囲内の同時実行数であれば 2 桁ミリ秒台で応答できる状態が期待できます。
なお、SnapStart はコールドスタートしないことを保証しませんが、予測不可能なスパイクのあるワークロードにおける起動レイテンシーの低減に効果的です。
また、SnapStart は追加費用がかかりますが、コールドスタート時の初期化時間短縮により、Lambda のトータルコストが安くなる場合もあります。
ワークロードや期待する効果に応じて使い分けてください。
なお、SnapStart と Provisioned Concurrency は同時に有効化できません。
参考資料
Q.Lambda SnapStart と Provisioned Concurrency (PC) のどちらを選択すればよいですか?
Lambda SnapStart は、1 回限りの初期化コードの実行中に発生する可変レイテンシーを低減することで、関数の起動時間を高速化するのに役立つパフォーマンス最適化機能です。Lambda SnapStart は起動レイテンシーを低減しますが、ベストエフォート型の最適化として機能し、コールドスタートの排除を保証するものではありません。レイテンシー要件が厳しく、起動時間が 2 桁 (ミリ秒) 必要なアプリケーションでは、PC を使用することをお勧めします。
…(中略)…
Q.同じ機能で Lambda SnapStart と PC の両方を有効にできますか?
いいえ。Lambda SnapStart と PC を同時に、同じ機能で有効にすることはできません。
SnapStart はこれら追加の利用費用がかかりますが、通常、コールドスタートは呼び出しの 1% 未満で発生 します。つまりリストアでSnapStart の利用費用が発生するといっても 99% タイルの呼び出しでは課金されない、ということと、SnapStart によって、従来の SnapStart を使わない場合のコールドスタートの度に行われていた初期化処理の時間分、つまりもともとの関数の Invocation の利用料金分が削減されますので、実行回数が多いワークロードなどは SnapStart を利用したほうがトータルではコストが安くなることがあります。
SnapStart を使用するタイミング
Lambda SnapStart は、モジュールの依存関係やフレームワークのロードなど、1 回限りの初期化コードによって生じるレイテンシーの変動に対処するように設計されています。これらのオペレーションの最初の呼び出し時は、完了に数秒かかることがあります。最適なシナリオでは、SnapStart を使用すると、このレイテンシーが数秒から 1 秒未満に短縮されます。SnapStart は、大規模な関数呼び出しで使用すると最も効果的です。頻繁に呼び出されない関数では、パフォーマンスが同じように向上されない場合があります。
…(中略)…
プロビジョニングされた同時実行は、関数を、初期化され、2 桁ミリ秒台で応答できる状態に維持します。アプリケーションに SnapStart で適切に対処できない厳格なコールドスタートレイテンシー要件がある場合は、プロビジョニングされた同時実行を使用します。