【アップデート】Pythonと.NETでもSnapStartが利用可能になりました!!

【アップデート】Pythonと.NETでもSnapStartが利用可能になりました!!

ついにPythonと.NETでもSnapStartが利用可能になりました!!
Clock Icon2024.11.19

リテールアプリ共創部@大阪の岩田です。

re:Invent 2022で発表されたSnapStartは設定変更のみでLambdaのコールドスタートを改善できる非常に魅力的な機能でした。しかしながら、サポートされるランタイムはJava11以上のみという状況が長らく続いており、他のランタイムを利用するユーザーは自身が利用するランタイムでもSnapStartが利用可能になるのを待ち望んでいたのではないでしょうか?

それがついに2024/11/18付けのアップデートでSnapStartがサポートするランタイムが増えました!!

従来のJavaに加えてPython3.12以上と.NET8以上(といっても.NETは8が最新ですが)のランタイムでSnapStartがサポートされています。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-lambda-snapstart-python-net-functions/

ちょっと設定を変更するだけでコールドスタートのレイテンシが改善されるので、LambdaのランタイムにPythonや.NETを利用されている方はぜひお試しください。

環境など

今回検証に利用したLambdaの設定は以下の通りです。

  • ランタイム: Python3.12
  • ランタイムバージョンARN: arn:aws:lambda:us-east-1::runtime:7515e00d6763496e7a147ffa395ef5b0f0c1ffd6064130abb5ecde5a6d630e86
  • パッケージサイズ
    • コードサイズ: 1.5KB
    • 紐づけたレイヤーのサイズ: 圧縮前で11M、圧縮後で2.8M

やってみる

さっそく自分が管理している適当なLambda FunctionでSnapStartを試してみます。

私はPython3.12のLambda × API Gatewayで構築したサンシャイン池崎BotというSlack Botを運用しているので、こちらのBotを使ってSnapStartの有効化を試してみます。

サンシャイン池崎BotはSAMでデプロイしているので、以下の通りSAMテンプレートにSnapStart関連の記述を追加しました。

...Resources:
  SlackEvent:
    Type: AWS::Serverless::Function
    Properties:
      # ↓追加
      SnapStart:
        ApplyOn: PublishedVersions
      AutoPublishAlias: SnapStart
      # ↑追加      

変更箇所はたったこれだけです。

準備ができたらsam buildsam deployでデプロイします。

SnapStartが有効化された様子

デプロイが完了するとLambdaのSnapStartがPublishedVersionsとなっていることが分かります。

適当にBotを起動させてX-Rayのトレース結果を見比べてみます。

SnapStart有効化前

まずSnapStartを有効化する前のトレース結果です。API GWからLambdaが起動されてから約250ms後にInit処理がスタートし、Init処理には1.01秒を要しています。

SnapStart有効化前のトレース結果

SnapStart有効化後

SnapStart有効化後はこちらです。

API GWからLambdaが起動されてから約120ms後にRestore処理がスタートし、Restore処理は559msで完了しています。

API GW → Lambdaという処理全体で見ると500ms程度高速化していることが分かります。

SnapStart有効化後のトレース結果

参考までに上記トレースに紐づくログです。

REPORT RequestId: 02fe2461-ddfa-4cc7-b513-f65adf73ae60	Duration: 16.29 ms	Billed Duration: 64 ms	Memory Size: 512 MB	Max Memory Used: 83 MB	Restore Duration: 558.86 ms	Billed Restore Duration: 47 ms	
XRAY TraceId: 1-673c237b-6507f76a25a2f9ba510f8f98	SegmentId: 6a5914043a0bd9ea	Sampled: true	

JavaのSnapStartと同様にRestore Durationが出力されていることが分かります。

まとめ

簡単にではありますがSnapStartによってコールドスタートのレイテンシが改善されることを確認してみました。

今回は紹介していませんが、Pythonと.NETでもJavaと同様にhookポイントが提供されており、スナップショット取得の直前やリストア完了直後に任意の処理を差し込むことも可能です。このあたりの機能もうまく活用して処理を最適化していきたいですね。

他のランタイムもSnapStartに対応して全てのランタイムでSnapStartが利用可能になるのが待ち遠しいです!!

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.