---
title: "Lambda SnapStart を Java 以外で有効化する方法"
slug: snapstart-any-langs
tags: [lambda]
authors: [tbrand]
---

Lambda SnapStat を Java 以外で有効化する方法をご紹介いたします。

- **こちらの記事で紹介している方法は、AWS 公式で案内している方法ではありません**
- **実施する場合は、あくまで検証のために行い、本番環境では絶対に利用しないでください**

<!-- truncate -->

## 背景

Lambda SnapStart はコールドスタートのボトルネックを改善する機能です。初回起動時の実行環境のメモリとディスクの状態の Firecracker MicroVM スナップショットを作成し、キャッシュします。次回以降のコールドスタートは、スナップショットをロードすることで高速化を図ります。

現時点 (2023/07/13) では、Lambda SnapStart は Java 11 マネージドランタイムのみをサポートしています。Node.js や Python などはサポートされていません。そこで、この記事では Lambda SnapStart を Java 11 以外の言語で書かれた Lambda 関数でも有効化する方法を紹介します。**ただし、あくまでハックな方法であり、AWS 公式が案内する手順ではありません。検証にとどめ、本番環境では絶対に利用しないでください。**また、具体的なコードや設定ファイルなどを紹介することは控えさせていただきますので、ご了承ください。

## 有効化手順

Java 11 以外のランタイムを選択すると、そもそも SnapStart を有効化できないため、Java 11 のランタイムを選択した状態で、いかに他の言語の Lambda 関数を動かすかというのが議題です。具体的に申し上げますと、以下の 2 ステップを考慮する必要があります。

1. Java 11 ランタイムで、**どのようにして他の言語を実行可能にするか**
2. どのようにして **Lambda 関数として実行可能にするか**

### Java 11 ランタイムで、どのようにして他の言語を実行可能にするか

とどのつまり、Java 11 ラインタイムを無視して、他の言語が実行できれば問題ないわけです。
これに関しては、現状わかっているだけでも以下の手段があります。

1. コンパイル言語であるなら、バイナリをインストールすれば良い
2. スクリプト言語なら、ランタイムをインストールすれば良い (Lambda Layer に置いてパスを通す)
3. スクリプト言語でもコンパイル可能であればそれを利用する
4. JVM で実行可能な形式に変換できるなら、それも可 (JRuby など)

(1) に関してはほとんど説明不要で、例えば Go や Rust などはこれに当たります。生成されたバイナリを Lambda 関数にアップロードすれば良いです。(2) に関しては、例えば `node` や `python` などを Lambda Layer に置けば、その言語が利用できるようになります。ただし、250 MB の制限があるため、収まるか検証が必要です。(3) に関しては、例えば JavaScript のオルタナティブランタイムである Deno がこれに当たります。Deno であれば `deno compile` コマンドで実行可能ファイルを作成可能です。また、Node.js に関しても v19.7 ~ に試験的に導入された postject という機能で実行可能バイナリを生成することができます。ただし、こちらは手元で検証した結果 glibc のバージョンが合わずに実行できませんでした。(4) に関してはあまり検証できていませんが、理論的には JRuby などは実行可能だと思います。また、2.x 系しかサポートされていませんが Jython (implementation of Python in Java) もこれに当たります。

以上のように、限定的ではあるものの、ハックすれば Java 11 ランタイムを選択した場合でも、他の言語が実行可能であることはわかりました。しかし、Lambda 関数としてどのようなコードになるでしょうか。

### どのようにして Lambda 関数として実行可能にするか

これは現状わかっている範囲で、1 択です。[Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter) を利用します。Lambda Web Adapter を利用すれば、Lambda 関数の invoke を、通常の HTTP リクエストとして受けることができます。つまり、慣れ親しんだ Web フレームワークが利用できます。

### サンプル

- Lambda Web Adapter のリポジトリの examples に、`deno compile` を利用して SnapStart を有効化しているサンプルがあります。([こちら](https://github.com/awslabs/aws-lambda-web-adapter/tree/main/examples/deno-zip))

## まとめ

この記事では Lambda SnapStart を Java 11 以外の言語で有効化する手順について説明しました。3 度目になりますが、**AWS 公式で案内している手順ではありません。これらの手順に関して、AWS からはいかなるサポートも受けることができません。また、本番環境での利用は絶対にしないでください。**