[アップデート] SnapStart を有効化した AWS Lambda でも AWS X-Ray トレースがサポートされるようになりました

2023.05.11

いわさです。

AWS Lambda で Java ランタイムを選択した際に、コールドスタートのボトルネックを改善するためのオプションのひとつに「SnapStart」という re:Invent 2022 で発表された機能があります。

それ以前はプロビジョニング同時実行機能などを使って事前にウォームアップさせておくオプションがあったのですが、SnapStart の場合は無料で利用が出来るので、昨今の AWS Summit Tokyo のセッションでも、まず最初のオプションとして使ってみましょうという紹介がされていました。

ただし、使用にあたっては非対応の機能がいくつかあって、その点は注意する必要があるという点も説明されていました。

SnapStart を採用した場合の非対応の機能のひとつに X-Ray が使えなくなるというものがあったのですが、本日のアップデートで SnapStart を有効化した Lambda 関数でも AWS X-Ray を使うことが出来るようになりました。

また、AWS Summit Tokyo のセッションや日本語公式ドキュメントでも記述がありますが、SnapStart は re:Invent での発表後は Java 11 のみがサポートされていました。
しかし、先月末のアップデートで Java 17 が Lambda マネージドランタイムでサポートされたタイミングで SnapStart もサポート対象になっているようです、

特別な手順はない、通常どおりアクティブトレースを有効化するだけ

このアップデートの利用にあたって特別な手順はありません。
X-Ray アクティブトレースを有効化した Java の Lambda 関数を作成し、SnapStart も有効化させるだけです。

なおこの記事では SnapStart を有効化した場合の関数の実装面については触れません。
リストアがあったり、前後のフックの割り込みが出来たりと、これまでハンドラの中か外か以外にもいくつか概念があるので従来と違うライフサイクルになっているという点にご注意ください。
詳細は冒頭の AWS Summit Tokyo のセッション記事が参考になるかと思います。

Java SnapStart はバージョン発行時にスナップショットを保存し、それが使われますのでバージョンを発行します。

発行されたバージョンを確認してみると、SnapStart 最適化ステータスが有効化されていることが確認できます。

実行してみる

後は通常どおり対象バージョンの関数を Invoke してやるだけです。
アクティブトレースを有効化した API Gateway から実行してみます。API Gateway を使う意味は特にないですけど。

SnapStart を有効化した Lambda 関数の場合、従来は Lambda の Init フェーズにどの程度かかったかなどが X-Ray トレースから確認が出来ませんでした。
API Gateway などからトレースした場合は、Lambda 全体としてどの程度時間がかかったかのみわかる状態でした。

今回のアップデート後は次のように各フェーズの時間がわかるようになっています。これはコールドスタートが発生していないインスタンスが存在している場合です。

次はコールドスタートが発生する場合で、リストアフェーズにどの程度時間がかかっているのかが確認出来ます。

さいごに

本日は SnapStart を有効化した AWS Lambda でも AWS X-Ray トレースがサポートされるようになったので早速使ってみました。

とりあえず速報的に有効化して使っただけなのですが、サブセグメントとかカスタムで定義しても問題なく取得出来るのかとか、別途検証したいと思います。

これまで X-Ray が非対応であったために SnapStart の採用を様子見していた方には非常に朗報なのではないでしょうか。
是非、使ってみてください。