スライド/Python LambdaのSnapStartとAWS Lambda Powertools version 20
:追加された部分
:削除された部分
(差分が大きい場合、文字単位では表示しません)
スライド/Python LambdaのSnapStartとAWS Lambda Powertools
## 自己紹介
- 夏目 祐樹 (ナツメ ユウタ)
- クラスメソッド
- 製造ビジネステクノロジー部
- 好きなAWS Service
- Lambda, DynamoDB, SQS, S3
- 近況
- FF7 Rebirthを100時間以上プレイするもクリアまで行かず
---
## Cold Start
---
## Cold Start
![[9005460307943389] perf-optimize-figure-1](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/8c497cf2-dbeb-4943-9a69-3d9c33375fb9.png)
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html#cold-start-latency
- AWS公式の考え方ではMicro VMの作成までがコールドスタート
- 再実行時はハンドラの実行から
- 広義の考え方ではコードの初期化も含める
---
## Cold Start
- どうしてもコードの初期化で初回の実行は遅くなる
- Pythonのboto3の読み込みでも1秒くらいかかる
- Pandasとか重いライブラリを読めばもっとかかる
- GoやRustなどシングルバイナリを生成するような言語ではコールドスタートもウォームスタートも大した差にはならない
---
## ユーザーのくふう (1)
- 手動ウォームアップ
- 何らかの手段でLambdaを実行させCold Startを回避する
- ただし
- 手動ウォームアップの実行中にリクエストが来たらCold Startが起きる
- 事前に立ち上げた数よりも多いリクエストが来たらCold Startが起きる
---
## ユーザーのくふう (2)
- Lambdalith (Monolithic function)
- 1つのLambdaで複数のイベントを処理する
- 例えば、APIで複数のパスを一つのLambdaで処理する
- ただし、Cold Startを多少抑制できる程度
---
## AWSのくふう (1)
- Provisioned Concurrency
- AWSによる自動ウォームアップ
- ただし
- 設定した実行数よりも多いリクエストが来たらCold Startが起きる
- ウォームアップしている期間についても課金される
---
## AWSのくふう (2)
- Snap Start (Java)
- re:Invent 2022で発表された機能
- Java 11以降で使用可能
- コードの初期化済みの環境をキャッシュし、そこから実行することで広義のコールドスタートを高速化する
---
## Pythonと.NETでSnapStartのサポートを開始
---
## AWSのくふう (3)
- Snap Start (Python, .NET)
- SnapStart (Python, .NET)
- 2024/11/18から利用できるようになった
- Python 3.12 以降と .NET 8以降で使用可能
---
## Snap Startの特徴
## SnapStartの特徴
- 初期化された実行環境のメモリとディスク状態のFirecracker microVMのスナップショットを保存し、それを再利用することで初回実行を高速化する
- スナップショットの保存はLambda関数のバージョン発行時
- 使用できるリージョンは9つ
- バージニア北部, オハイオ, オレゴン, シンガポール, シドニー, 東京, フランクフルト, アイルランド, ストックホルム
---
## Snap Startの課金体系
## SnapStartの課金体系
- Pythonと.NETでは使用に料金がかかる (Javaは無料)
- Lambda関数のバージョン毎に課金される
- 課金体系は二つ
- キャッシュの保存期間
- USD 0.0000015046/GB*秒
- USD 3.9540888/GB*月 (730h/月)
- キャッシュのレストア回数
- USD 0.0001397998/GB*回
- 7153.1回*GB/USD - 7153.1回*GB/USD
---
## Python RuntimeのSnapStart (1)
- Handlerに設定しているPythonファイルをインポートしてから、キャッシュが作成される
- そのためグローバル領域での処理は行われる
---
## Python RuntimeのSnapStart (2)
```python
import json
from datetime import datetime, timezone
dt_cache = datetime.now(timezone.utc)
def lambda_handler(event, context):
# TODO implement
data = {
"cache": str(dt_cache),
"now:": str(datetime.now(timezone.utc))
}
text = json.dumps(data)
print(text)
return data
```
自己紹介
- 夏目 祐樹 (ナツメ ユウタ)
- クラスメソッド
- 製造ビジネステクノロジー部
- 好きなAWS Service
- Lambda, DynamoDB, SQS, S3
- 近況
- FF7 Rebirthを100時間以上プレイするもクリアまで行かず
Cold Start
Cold Start
- AWS公式の考え方ではMicro VMの作成までがコールドスタート
- 再実行時はハンドラの実行から
- 広義の考え方ではコードの初期化も含める
Cold Start
- どうしてもコードの初期化で初回の実行は遅くなる
- Pythonのboto3の読み込みでも1秒くらいかかる
- Pandasとか重いライブラリを読めばもっとかかる
- Pythonのboto3の読み込みでも1秒くらいかかる
- GoやRustなどシングルバイナリを生成するような言語ではコールドスタートもウォームスタートも大した差にはならない
ユーザーのくふう (1)
- 手動ウォームアップ
- 何らかの手段でLambdaを実行させCold Startを回避する
- ただし
- 手動ウォームアップの実行中にリクエストが来たらCold Startが起きる
- 事前に立ち上げた数よりも多いリクエストが来たらCold Startが起きる
ユーザーのくふう (2)
- Lambdalith (Monolithic function)
- 1つのLambdaで複数のイベントを処理する
- 例えば、APIで複数のパスを一つのLambdaで処理する
- ただし、Cold Startを多少抑制できる程度
AWSのくふう (1)
- Provisioned Concurrency
- AWSによる自動ウォームアップ
- ただし
- 設定した実行数よりも多いリクエストが来たらCold Startが起きる
- ウォームアップしている期間についても課金される
AWSのくふう (2)
- Snap Start (Java)
- re:Invent 2022で発表された機能
- Java 11以降で使用可能
- コードの初期化済みの環境をキャッシュし、そこから実行することで広義のコールドスタートを高速化する
Pythonと.NETでSnapStartのサポートを開始
AWSのくふう (3)
- SnapStart (Python, .NET)
- 2024/11/18から利用できるようになった
- Python 3.12 以降と .NET 8以降で使用可能
SnapStartの特徴
- 初期化された実行環境のメモリとディスク状態のFirecracker microVMのスナップショットを保存し、それを再利用することで初回実行を高速化する
- スナップショットの保存はLambda関数のバージョン発行時
- 使用できるリージョンは9つ
- バージニア北部, オハイオ, オレゴン, シンガポール, シドニー, 東京, フランクフルト, アイルランド, ストックホルム
SnapStartの課金体系
- Pythonと.NETでは使用に料金がかかる (Javaは無料)
- Lambda関数のバージョン毎に課金される
- 課金体系は二つ
- キャッシュの保存期間
- USD 0.0000015046/GB*秒
- USD 3.9540888/GB*月 (730h/月)
- キャッシュのレストア回数
- USD 0.0001397998/GB*回
- 7153.1回*GB/USD
- キャッシュの保存期間
Python RuntimeのSnapStart (1)
- Handlerに設定しているPythonファイルをインポートしてから、キャッシュが作成される
- そのためグローバル領域での処理は行われる
Python RuntimeのSnapStart (2)
import json
from datetime import datetime, timezone
dt_cache = datetime.now(timezone.utc)
def lambda_handler(event, context):
# TODO implement
data = {
"cache": str(dt_cache),
"now:": str(datetime.now(timezone.utc))
}
text = json.dumps(data)
print(text)
return data