スナップショットの使用
AWS Lambda MicroVMs が MicroVM イメージを構築すると、完全に初期化されたアプリケーションの Firecracker スナップショットがキャプチャされます。このページでは、スナップショットに含まれる内容、同じスナップショットを共有する MicroVM 間での一意性を処理する方法、スナップショット互換アプリケーションのベストプラクティスについて説明します。
スナップショットがキャプチャする内容
Firecracker スナップショットは、イメージビルドが完了した時点で MicroVM から次の状態をキャプチャします。
-
実行中のプロセスのメモリ状態 –
ENTRYPOINT/CMDによって起動されるすべてのプロセス (バックグラウンドデーモン、cron ジョブ、子プロセスなど)。 -
ディスク状態 – ビルドフェーズ中に書き込まれたすべてのファイルを含むルートファイルシステム (インストールされたパッケージ、コンパイルされたバイナリ、設定ファイル)。
-
ネットワーク接続とファイル記述子 – 初期化されたネットワーク接続、ファイルハンドル、パイプ、その他の記述子。
MicroVM を実行すると、Lambda は、このスナップショットから MicroVM を復元します。アプリケーションは、MicroVM イメージバージョンのビルドが中断された場所から正確に再開されます。
互換性に関する考慮事項
同じイメージバージョンから起動した MicroVM は同じ初期状態を共有するため、Lambda MicroVMs でアプリケーションを構築する際は以下のことを考慮してください。
-
一意性 – イメージバージョンのビルドフェーズでコードが一意のコンテンツ (一意の ID、シークレット、または疑似ランダム性のためのエントロピー) を生成する場合、そのコンテンツは同じイメージバージョンから実行されるすべての MicroVM 間で共有されます。一意のコンテンツの生成は、イメージ構築中ではなく、新しい MicroVM の起動後に行います。
/runライフサイクルフックを使用して、以前に生成された一意のコンテンツをリセットします。 -
ネットワーク接続 – イメージバージョンの構築フェーズ中に確立された接続は、イメージバージョンから MicroVM を実行するときに再確立する必要がある場合があります。接続の状態を検証し、必要に応じて再確立してください。ほとんどの場合、AWS SDK によって作成された接続は自動的に再確立されます。
スナップショットで一意性を処理する
同じイメージから実行されるすべての MicroVMは同じ初期状態を共有します。複数の MicroVM 間で一意性を維持するには:
-
MicroVM が起動された後、イメージバージョンの構築中でないときに一意の ID、シークレット、ランダムな値を生成します。
/runライフサイクルフックを使用して、一意の状態をリセットします。 -
プログラミング言語の暗号論的擬似乱数生成器 (CSPRNG) を使用する 言語標準の暗号化ライブラリが
/dev/randomデバイスまたは/dev/urandomデバイスからエントロピーを受信していることを確認します。これは、Java 11+ (SecureRandom ライブラリ)、Node.js (crypto.randomBytes ライブラリ)、Python 3.12+ (Secrets.SystemRandom ライブラリ)、Dotnet8+ (Cryptography.RandomNumberGenerator ライブラリ) などの一般的なプログラミング言語の暗号化ライブラリのデフォルトの動作です。MicroVM イメージスナップショットで使用すると、/dev/randomまたは/dev/urandomから読み取るソフトウェアはランダム性を維持します。 -
アプリケーションコードが OpenSSL を使用している場合、
public.ecr.aws/lambda/microvms:al2023-minimalから AWS 提供のベースコンテナイメージを使用して MicroVM イメージを構築します。このイメージには、スナップショット作成と互換性のある OpenSSL の AWS パッチ適用バージョンが含まれています。OpenSSL で独自のベースイメージを使用する場合は、Amazon Linux 2023 パッケージリストに記載されているパッチ適用済みバージョンの OpenSSL (openssl-snapsafe-libs) を使用します。