Lambda の java ランタイム用機能 「Snap Start」 について、 スナップショットの保存期間 ( 14 日 ) を過ぎるとどうなるのか確認してみた。

記事タイトルとURLをコピーする

こんにちは😺 カスタマーサクセス課の山本です。

はじめに結論

前提として、14 日以内に関数を呼び出していればスナップショットは消えません。14 日のうちに 1 回は呼ばれるような関数なら、安心して Snap Start を利用できます。(常に Cold Start が回避できる)
関数の呼び出しが 14 日間なかった場合、スナップショットは消えます。
Snap Start が有効な関数バージョンのスナップショットが消えると、次回の実行がエラーとなります。(SnapStartNotReadyException) このタイミングでスナップショットを作成開始します。 スナップショットが作成されるまでの期間(ほぼほぼ Cold Start の時間)、同バージョンの実行はエラーになります。
スナップショットが作成完了すると、関数を実行できるようになります。
またスナップショットが消えていると、AWS マネジメントコンソールから、同関数バージョンのテスト実行ができなくなります。

公式ドキュメントの該当箇所

公式ドキュメント Lambda SnapStart のアクティブ化と管理 には以下の記載があります。

  • 該当箇所 1 つ目

    Lambda は、以下の場合にスナップショットを削除します。

    • 関数または関数バージョンが削除された。
    • 関数バージョンが 14 日間呼び出されなかった。呼び出されないまま 14 日間が過ぎると、関数バージョンの状態が Inactive に移行します。14 日後に関数バージョンを呼び出すと、Lambda は SnapStartNotReadyException レスポンスを返し、新しいスナップショットの初期化を開始します。関数バージョンが Active 状態になるまで待ってから、もう一度呼び出してください。
  • 該当箇所 2 つ目

    Inactive – 関数バージョンが 14 日間呼び出されていません。Lambda は、関数バージョンが Inactive になるとスナップショットを削除します。14 日後に関数バージョンを呼び出すと、Lambda は SnapStartNotReadyException レスポンスを返し、新しいスナップショットの初期化を開始します。関数バージョンが Active 状態になるまで待ってから、もう一度呼び出してください。

スナップショットが 14 日後に消えることを実際に確認してみた

Snap Start を ON にしたバージョンを発行して、14 日間、実行を 1 回もしませんでした。
14 日経過後に AWS マネジメントコンソール上で テスト実行して、SnapStartNotReadyException を起こそうと思ったところ、テスト実行がグレーアウトしていました。
画面取得し忘れてたんですが・・ここです。

以下のようになっていました。

仕方ないので、AWS CLI (aws lambda invoke)から実行して、SnapStartNotReadyException になることを確認しました。

aws lambda invoke --function-name javatest:1 version1.log && cat version1.log

Lambda を実行しないまま 14 日経った後の1回目の実行で、以下のエラーになりました。
画像の一番上の実行です。

An error occurred (SnapStartNotReadyException) when calling the Invoke operation: Lambda is initializing your function.It will be ready to invoke once your function state becomes ACTIVE.

関数の状態が ACTIVE になるのを待てということでした。
何回か同じコマンドを実行しているうちに、スナップショットが作成されて、実行可能になりました。(画像の一番最後の実行です。)

なお、関数の状態が ACTIVE になっているかどうかは、以下のコマンドで確認できます。参考:Lambda 関数の状態

aws lambda get-function --function-name javatest:1 --query 'Configuration.[State, LastUpdateStatus]'

ACTIVE になっていました。😺

Lambda の実行ログには スナップショットを作成したログのログストリームが 9 個ほどありました。

ACTIVE になってから実行した際のログストリームもありました。

14 日以内に関数を呼び出していればスナップショットは消えないことを実際に確認してみた

Snap Start が ON の関数バージョンを作成して 7 日後に、1 度だけ実行しました。
その 9 日後 (すなわち 関数バージョンの作成から 16 日後)に、同関数バージョンを実行しました。

そうしたところ、SnapStartNotReadyException は起きず、正常に実行できました。

まとめ

Snap Start が有効な Lambda 関数バージョンは 実行しないで 14 日経つとスナップショットが消えてしまいます。
その場合、AWS マネジメントコンソールからは実行できなくなります。
AWS CLI や SDK から 関数を実行すると スナップショットを再作成してくれます。
スナップショットが再作成された後に、同 Lambda 関数バージョンを実行できるようになります。

Snap Start 関連のブログです。

概要編:
blog.serverworks.co.jp

試してみた前編:
blog.serverworks.co.jp

試してみた後編:
blog.serverworks.co.jp

一意性チェックツール編:
blog.serverworks.co.jp

余談

先日に登った蓼科山の登山道から浅間山が綺麗に見えたので貼っておきますね。😺

遠くに槍ヶ岳も見えました。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。

今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。

山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。

基本的にのんびりした性格です。座右の銘は「いつか着く」