Python および .NET 関数向けの AWS Lambda SnapStart の一般提供を開始
こちらでJava以外でのSnapStartの提供開始がアナウンスされたので、さっそく自社のアプリケーションを使って確認してみました。
SnapStartとは
Lambdaの初期化コードを実行した後の状態のスナップショットを保存しておき、
実際に呼び出されたとき・Lambdaがスケールアップするときにはスナップショットから復元してから実行することでコールドスタート
にかかる時間を短縮しようというものです。
詳しくはこちら(コード例はJavaですが概念はわかりやすく説明されています)
設定方法
SnapStartでは関数バージョンの発行が必須です。
Lambda関数の設定でSnapStartを有効にしてから関数バージョンを発行するとスナップショットが作成されます。
関数バージョンが必須なので、APIのバックエンドに使用している場合はバージョンのデプロイとAPIとの紐づけなどの工夫が必要です。
また、明記されていませんが関数バージョンごとに課金されそうなので、過去の関数バージョンは積極的に削除する必要がありそうです。
先に結果から
On-Demand
Percentile 50: 0.27 seconds
Percentile 99: 5.83 seconds
Max Response Time: 5.84 seconds
Min Response Time: 0.20 seconds
SnapStart
Percentile 50: 0.27 seconds
Percentile 99: 2.40 seconds
Max Response Time: 2.42 seconds
Min Response Time: 0.20 seconds
並列実行:10 を1秒間隔で10回 = 100回
これを10分間隔で3回実行
必ず10のLambdaがプロビジョニングされるようにし、かつOn-Demandの場合はShutdownが行われることを期待して10分間隔で実行しました。
結果を見ると確かにSnapStart効果はありましたが、後述の料金を見ると喜んで飛びついて良いものか悩ましい数値となりました。
注意点
DB接続の管理
Lambda関数の処理を設計するにあたっての注意点がドキュメントに記載されています。
評価対象のLambda関数は、handlerの外でDB接続を保持するようにしているので、ドキュメントに記載された
Lambda がスナップショットから関数を再開するときは、関数が初期化フェーズ中に確立する接続の状態が保証されません。 ほとんどの場合、AWS SDK が確立するネットワーク接続は、自動的に再開されます。
これに注意が必要です。
うちのプログラムではhandler()の外のDB接続はpsycopg2を使っているので、復元後のDB再接続をうまく処理してくれるかどうかはpsycopg2に依存します。
リトライ処理を組み込むか、handler()の外でのDB接続をやめるか検討が必要そうです。
contextオブジェクトの内容が異なる
うちのプログラムでは、contextオブジェクトからlog_group_name, log_stream_nameを取得して使用しています。
これがSnapStartになると何故か値が入ってきません。これらを使用している処理がある場合は修正が必要となります。
なぜここの挙動が異なるのかは興味があります。
ちなみにcontextオブジェクトには設定されていませんがCloudWatchLogsにはちゃんとログが記録されていました。
料金
Java以外のランタイムではSnapStartは有料です。
SnapStartの料金は「関数バージョンがアクティブになっている時間」と「リストアされた回数」2つの要素から構成されています。
関数バージョンがアクティブになっている時間
SnapStartを有効にしてバージョンを発行したときからずーっと発生します
関数の割当メモリサイズで料金が変わります
リストアされた回数
キャッシュからリストアされるたびに発生します
関数の割当メモリサイズで料金が変わります
料金例
SnapStart の料金: 関数バージョンがアクティブになっている合計時間 (秒): 24 時間 × 31 日 x 3600 秒 = 2,678,400 秒 割り当てられた関数メモリ: 1024 MB ÷ 1024 MB -> 1 GB SnapStart キャッシュの合計使用量: 1 GB × 2,678,400 秒 -> 2,678,400 GB/秒 SnapStart キャッシュの料金: 2,680,000 GB/秒 × 0.0000015046 USD = 4.03 USD SnapStart リストアを使用するリクエスト数: 7,440,000 件の 1% = 74,400 SnapStart リストアの総使用量: 74,400 × 1 GB = 74,400 GB SnapStart リストアの料金: 74,400 GB × 0.0001397998 USD = 10.4 USD SnapStart の合計料金: SnapStart キャッシュの料金 + SnapStart リストアの料金 SnapStart の合計料金: 4.03 USD + 10.4 USD = 14.43 USD
メモリ割当量に依存した料金体系なので、メモリが大きい関数だとお気軽に設定できない金額になりそうです。
Comments