[AWS] Lamda SnapStartを試してみた！

## はじめに

こんにちは！[フューチャー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/future)の6日目を担当します、佐藤と申します！
今回はつい1週間前にAWS re:Inventで発表された新機能「Lambda SnapStart」について機能のお試し＋効果の検証を行ってみたので、お伝えして行きたいと思います。
ちょうど気になってたんだよな〜という人も、aws...?lambda...?という人も読めるように書いていますので、どうぞお茶でも飲みながら読んでいただけたらと思います。よろしくお願いします！

## Lambda SnapStartとは？

まずLambdaとは？というところですが、一言で言ってしまえば
`自分で作った関数を置いといて、何かのトリガーで実行してくれる君`
です。
例えば、利用者がログインを試行した時トークンを発行する関数を実行してくれる、あるメールが来た時ストレージにメールを保存する関数を実行してくれる、そんな感じのサービスです。

で、今回追加された`SnapStart`についてですが、これも一言で言うと
`lambdaのコールドスタートの待ち時間を劇的に減らすことができるオプション`
となっていて、これはAWS最大のイベントであるre:Inventで、しかも初日に発表されたものなので期待大...!なものです。
※コールドスタート...電源を入れてない状態から何か実行することで、要するに時間がかかると思えばOK

具体的には、コールドスタートにおける

1. lambdaがコールされる
1. 新しいMicroVMを起動する
1. 全ての言語ランタイムをプリインストールする
1. （自分達が実際に書いた）関数を実行できる形に変換する
1. 言語ランタイムに応じた初期化処理を行う
1. 関数を実行する

というプロセスにおける、5.のスナップショットを取得し、次回以降の実行時にそれを復元することで
1.~5.（特に時間がかかると言われる5.の初期化処理）の処理時間をすっ飛ばすことが出来るというもので、
正確にはスナップショットの復元時間があるので完全に省略できるわけではないですが、
これによって"劇的に"lambdaのコールドスタート時間が短縮できるそうです。

コストについては、スナップショットを取ったり保存したりするだけだからか
`このオプションを有効にすることによって追加料金は発生しない`
とのことです！嬉しい！
（一方Provisioned Concurrencyオプションは常にインスタンスを構えてるのでコスト爆上がり。今まで高コストだったものが無料で使える革新さ...!）

※2022年12月6日現在、`Java 11`ランタイムかつ`x86_64`アーキテクチャでのみ利用可能。
（[ここ](https://dev.classmethod.jp/articles/lambda-measure/)を見ると分かるが、javaがレベチでコールドスタートが遅いという背景がありそう）

## オプションを有効化する方法

1. まず`Java 11`ランタイム、`x86_64`アーキテクチャのlambda関数を作る
![スクリーンショット 2022-12-05 0.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/91719f59-f60d-d322-7017-f6c85655d5c2.png)

1. 設定 > 一般設定 > 編集 を押下する
![スクリーンショット 2022-12-05 1.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/3f9542b9-3444-fa85-184f-3fa9651409d2.png)

1. SnapShotを`PublishedVersions`に変更し、保存を押下する！
![スクリーンショット 2022-12-05 1.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/2fb7c5d1-08e4-9cae-8fb5-527f310a6fdd.png)

## 実際に動かして、タイムを比較してみた！

### 用意するもの
- 以下の`Lambda`関数
    - `snapstart_on_func`：`Java 11`、`x86_64`でSnapStartオプションは`ON`
    - `snapstart_off_func`：`Java 11`、`x86_64`でSnapStartオプションは`OFF`

### 手順

1. `オプションを有効化する方法`項に従って、`snapstart_on_func`と`snapstart_off_func`を作る

1. それぞれテスト実行してみる
![スクリーンショット 2022-12-05 2.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/fe9488fe-ae1f-1f7e-7c4f-b7788962230f.png)

### 計測結果

ということで、↑の手順に従ってテスト実行時間を計測していきます！

- SnapStartなし：コールドスタート（460.31ms）
![スクリーンショット 2022-12-05 3.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/70d8940c-e3df-4d0c-79c9-719d071b7d96.png)

- SnapStartあり：コールドスタート（425.37ms）
![スクリーンショット 2022-12-05 3.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/d14a5f08-392c-7183-bf1b-8a6bbe229e33.png)

- SnapStartなし：ホットスタート（1.15ms）
![スクリーンショット 2022-12-05 3.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/09534353-be7d-cc70-1f6e-e26f52e002a1.png)

- SnapStartあり：ホットスタート（1.16ms）
![スクリーンショット 2022-12-05 3.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115102/3f117a9b-2542-05a9-ebed-dc662ca1f907.png)

## 結果発表ーーーーっっ！！！

はい。ということでSnapStartあり/なしの比較実験の結果は以下となりました。

|  | SnapStartなし | SnapStartあり |
| :--- | :---: | ---: |
| コールドスタート | 460.31ms | 425.37ms |
| ホットスタート | 1.15ms | 1.16ms |

うーん、、、正直パッとしない結果ですね、、笑
（一応460.31msに対して425.37msなので、約8%の短縮）

ホットスタートは両者条件が同じなので差はほとんどなし、一方でコールドスタートは予想通りタイムが縮まっている、で定性的には予想通りなものの、もう少し短縮されると思っていただけに少し残念。

とはいえ、今回の検証はlambda関数を作った時に勝手に作られる空の関数を使っており、必要なパッケージや処理が極端に少なかったという事情があるので、実際にプロジェクトで使うとなればもっと恩恵を受けられると思っています。
（恐らくSnapStartなしxコールドスタートが際限なく長くなる一方、SnapStartありxコールドスタートはあまり変わらないと予想。この記事を見たどなたか、追加検証オネガイシマス。。。）

## 感想

ということで、数値はパッとしなかったもの、効果は明確にあるということが分かり、更にコストを含めたデメリットが特にないということで、このオプションは常にONで良いんじゃないかな〜なんて思いました。

このスピードじゃ満足出来ないよ！って人は`Provisioned Concurrency`なり別のサービス使うなりで明確に住み分け出来ているので、低コストでLambda×Javaを高速化させたい、という人は是非活用してみてください！

それでは、Future株式会社のAdvent Calendarはまだまだ続きますので、明日以降も乞うご期待！

## 参考リンク

- https://dev.classmethod.jp/articles/session-lamba-snapstart/
- https://aws.amazon.com/jp/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/
- https://dev.classmethod.jp/articles/lambda-measure/
- https://qiita.com/Daiki_Yamaguchi/items/60aceeb95343afa9b94b