ソリューションアーキテクトに求められる視点(12/14)　Lambda SnapStart による起動パフォーマンスの向上

## はじめに
ソリューションアーキテクトに求められる視点を整理してみました。

アプリケーション開発に注力するために、ユーザーインタラクションが重要なウェブアプリケーションで、マネージドサービスを効果的に活用することで、ユーザーエクスペリエンスを向上させる方法について、考えました。


今回は、**Lambda SnapStart による起動パフォーマンスの向上**です。実務や試験で、ご参考にして頂けましたら、幸いです。

## **アーキテクトに求められる視点**
レイテンシの影響を受けやすいアプリケーションです。
Lambda 関数は、ライブラリのロード、クラスの初期化、一意の ID の生成を行うための初期化コードがハンドラーの外部に含まれています。
起動時のパフォーマンスを改善したいと考えています。

## **ソリューション**
Lambda 関数を更新して、スナップショット前のフックを追加します。一意の ID を生成するコードをハンドラーに移動します。各 Lambda 関数のバージョンを公開します。公開された Lambda 関数のバージョンに対して Lambda SnapStart をアクティブ化します。 

## 解説
Lambda SnapStartは、関数の初期化フェーズを事前に実行し、そのスナップショットを保存します。関数が呼び出されるたびに、このスナップショットを使用して関数を迅速に起動します。これにより、初期化時間を短縮し、レイテンシーを低減します。

ランタイムフックを使用して、Lambda がスナップショットを作成する前、または Lambda がスナップショットから関数を再開した後でコードを実装できます。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/snapstart-runtime-hooks.html

**別の観点**
各 Lambda 関数のバージョンを公開します。各 Lambda 関数が対応するバージョンを指すようにプロビジョニングされた同時実行構成を設定します。
**コスト面を考えると**
プロビジョニングされた同時実行性によりコールド スタートの待ち時間が短縮されますが、使用されていないときでも一定数のインスタンスをウォーム状態に維持し、リクエストを処理できるようにしておくため、SnapStart に比べてコストが高くなります。

参考となる記事
SnapStartでコールドスタートが高速化することを確認してみた

https://dev.classmethod.jp/articles/calc-snapstart-effect/

Lambda SnapStart による起動パフォーマンスの向上

Lambda SnapStart for Java を使用すると、**レイテンシの影響を受けやすいアプリケーションの起動パフォーマンスを、追加コストなしで最大 10 倍向上できます。**　通常は関数コードを変更する必要もありません。起動レイテンシ (コールド スタート時間と呼ばれることが多い) に最も大きく影響するのは、Lambda が関数の初期化に費やす時間です。これには、関数のコードの読み込み、ランタイムの開始、関数コードの初期化が含まれます。

SnapStartを使用すると、Lambdaは関数バージョンを公開するときに関数を初期化します。LambdaはFirecracker microVMを使用します。初期化された実行環境のメモリとディスクの状態のスナップショットを作成し、そのスナップショットを暗号化して、低レイテンシのアクセスのためにキャッシュします。関数バージョンを初めて呼び出したとき、および呼び出しがスケールアップするにつれて、Lambda は新しい実行環境を**最初から初期化するのではなく、キャッシュされたスナップショットから再開し、起動レイテンシを改善します。**

https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html


AWS Lambda SnapStartは、Lambda関数の起動パフォーマンスを向上させるための機能です。特に、Javaで記述されたLambda関数は、初期化に時間がかかることが多いため、SnapStartを使用することで、初期化時間を大幅に短縮できます。

### Lambda SnapStartの概要
Lambda SnapStartは、関数の初期化フェーズを事前に実行し、そのスナップショットを保存します。関数が呼び出されるたびに、このスナップショットを使用して関数を迅速に起動します。これにより、初期化時間を短縮し、レイテンシーを低減します。

レイテンシーに敏感なアプリケーションや高頻度の関数呼び出しに対して、一貫したパフォーマンスを提供できます。SnapStartの設定は簡単で、AWS Management ConsoleやAWS CLIを使用して迅速に有効化できます。


### 特徴と利点

| 特徴                                    | 説明                                                                                       |
|-----------------------------------------|------------------------------------------------------------------------------------------|
| 初期化時間の短縮                        | 初期化フェーズを事前に実行し、スナップショットを使用して迅速に起動します。 |
| レイテンシーの低減                      | 初期化時間が短縮されるため、関数の呼び出しレイテンシーが低減します。 |
| 一貫したパフォーマンス                  | スナップショットを使用することで、一貫した起動パフォーマンスを提供します。 |
| 簡単な設定                              | AWS Management ConsoleやAWS CLIを使用して簡単に設定できます。 |

### 使用シナリオ

#### 1. **レイテンシーに敏感なアプリケーション**
リアルタイム処理やユーザーインタラクションが重要なアプリケーションで、関数の初期化時間を短縮する必要がある場合に有効です。

#### 2. **高頻度の関数呼び出し**
頻繁に呼び出される関数で、初期化時間がパフォーマンスに影響を与える場合に有効です。

### 設定手順

#### ステップ1: Lambda関数の作成または更新
1. **AWS Management Consoleにログイン**
   AWS Management Consoleにログインし、Lambdaサービスに移動します。

2. **Lambda関数の作成または選択**
   新しいLambda関数を作成するか、既存のLambda関数を選択します。

3. **関数コードの設定**
   Lambda関数コードをアップロードします。初期化コードはハンドラーの外部に配置します。

#### ステップ2: SnapStartの有効化
1. **Lambda関数の設定**
   Lambda関数の設定ページに移動します。

2. **SnapStartの有効化**
   「Configuration」タブの「General configuration」セクションで、「SnapStart」を有効にします。

3. **デプロイ**
   SnapStartを有効にした後、関数をデプロイします。デプロイ時にスナップショットが作成されます。

#### ステップ3: パフォーマンスの確認
1. **関数の呼び出し**
   Lambda関数を呼び出し、初期化時間が短縮されていることを確認します。

2. **CloudWatch Logsの確認**
   CloudWatch Logsを確認し、関数の初期化時間が短縮されていることを確認します。

### 使用例

#### 1. **リアルタイムデータ処理改善**
リアルタイムでデータを処理するアプリケーションで、Lambda関数の初期化時間を短縮することで、データ処理のレイテンシーを低減します。

#### 2. **ユーザーインタラクション改善**
ユーザーインタラクションが重要なウェブアプリケーションで、Lambda関数の初期化時間を短縮することで、ユーザーエクスペリエンスを向上させます。

※ **ユーザーインタラクションとは**、ウェブサイトやアプリケーションの利用者（ユーザー）がそれらのプラットフォームで行う行動全般を指します。 具体的には、ページの閲覧、リンクのクリック、フォームの記入、動画の再生、スクロール行動などが含まれます。 ユーザーインタラクションは、SEO（検索エンジン最適化）にとって重要な指標です。

https://seotimes.jp/glossary/user-interaction/

#### ソリューションは、あくまで、一例です。他の解決方法もあるので、参考程度にしてください。

#### 読んでいただき、ありがとうございました。

アプリケーション開発に集中するための方法を模索した
本記事はQmonus Value Streamの投稿キャンペーン記事です。