

# 快照的使用
<a name="microvms-images-snapshots"></a>

当 AWS Lambda MicroVMs 构建 MicroVM 映像时，将会以完全初始化后的状态拍摄应用程序的 Firecracker 快照。本页介绍快照包含的信息、如何确保共享同一快照的 MicroVM 之间的唯一性，以及与快照兼容应用程序的最佳实践。

## 快照会捕捉哪些信息
<a name="microvms-snapshots-what-is-captured"></a>

Firecracker 快照会在映像构建完成时从您的 MicroVM 中捕获以下状态：
+ **正在运行的进程的内存状态**：由 `ENTRYPOINT`/`CMD` 启动的所有进程，包括后台进程守护程序、cron 作业和子进程。
+ **磁盘状态**：根文件系统，包括在构建阶段写入的所有文件（已安装的软件包、已编译的二进制文件、配置文件）。
+ **网络连接和文件描述符**：任何已初始化的网络连接、文件句柄、管道和其他描述符。

当您运行 MicroVM 时，Lambda 会使用该快照进行恢复。应用程序会准确从 MicroVM 映像版本构建中断的地方恢复。

## 兼容性注意事项
<a name="microvms-images-snapshots-compatibility"></a>

由于从同一映像版本启动的所有 MicroVM 具有相同的初始状态，因此在使用 Lambda MicroVMs 构建应用程序时，请注意以下几点：
+ **唯一性**：如果您的代码在映像版本构建阶段生成了唯一的内容（唯一 ID、密钥或伪随机性的熵），则该内容将在运行相同映像版本的所有 MicroVM 之间共享。在新 MicroVM 启动后生成唯一的内容，而不是在映像构建期间。使用 `/run` 生命周期挂钩重置之前生成的唯一内容。
+ **网络连接**：从映像版本运行 MicroVM 时，可能需要重建在映像版本构建阶段建立的连接。验证连接状态，并在必要时重建连接。在大多数情况下，由 AWS SDK 创建的连接会自动重建。

## 使用快照处理唯一性
<a name="microvms-images-snapshots-uniqueness"></a>

从同一映像运行的所有 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 映像。此映像包含由 AWS 修补的 OpenSSL 版本，与快照兼容。如果需要在 OpenSSL 中使用自己的基础映像，请使用 [Amazon Linux 2023 软件包列表](https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages.html)中列出的已修补 OpenSSL（openssl-snapsafe-libs）。