Javaの帰還 (Return of the Java)

この記事は AWS Lambda と Serverless Advent Calendar 2023 14 日目の記事です。

昨年2022年re:Invent 2022のAWS Lambda SnapStartの発表でJava Runtimeが再び注目されました。

AWS Lambdaの登場からの歴史

2014年11月にAWS Lambdaが発表されました。この発表でランタイムはNode.jsのみでファンクションの最大実行時間も60秒となっていました。

2015年6月にJava Supportが発表されます。この発表の記事を読むとすでにコールドスタートにかかる時間が問題となっていたことがわかります。

We’re continuing to invest in speeding up the initialization time to make the cold / infrequent use case even better.

その後しばらくは目立ったコールドスタートへの対応はなかったのですが、2019年12月にようやくProvisioned Concurrencyの発表がありました。同時実行 (Concurrency) をプロビジョンすることでコールドスタート時間を短縮することができます。

そして、2022年12月についにSnapStart発表の時が訪れます。

SnapStartの仕組み

AWS Lambdaはサーバーレスと呼ばれることもありますが、実際にはLinux OSの上で実行されます。使用するLinux OSについてもAmazon Linux 2023へのアップグレードが進んでいるようです。

LinuxCRIUというユーザースペースでCheckpointとRestoreを実装しようというプロジェクトがあります。これは実行中のコンテナやアプリケーションの状態をディスクに保存でき、保存から復元して同じ状態から実行できるようにします。

SnapStartはJavaCRaCプロジェクトの成果を利用します。CRaC自体はCRIUのような特定の実装に依存しないよう設計されていますが、現在のところCRIUを利用して実現されているためLinux OSのCRIUサポートを必要としています。SnapStartを有効にするとLambdaの実行中のメモリイメージが保存されます。Lambda実行時に保存されたイメージを復元して開始します。これによって、Java Runtime環境のロードや初期化時間等のコールドスタート時間を短縮できます。

なぜ今この記事を書いているのか

昨年の発表後、Java Runtimeを採用するAWS Lambdaが増えると予想していました。しかし私の知る限りあまりそうした変化を感じることができずにいます。Java言語を使う多くのプロジェクトでは、Springのようなフレームワークを利用して実装されます。こうしたフレームワークがCRaCに対応していなかったことも一因ではと考えています。

2023年5月16日にAzulから「Reduce Java Application Startup and Warmup Times with CRaC」の記事で商用サポートが発表され、11月16日のSpring Framework 6.1でCRaCのサポートが発表され、Spring Boot 3.2以降で使用できるようになりました。

Springを使ったかなり多くの資産があると考えていて、こうした資産の再利用が可能になったことでJava Runtimeを使ったAWS Lambdaが増えることを期待しています。

参考リンク