View a markdown version of this page

快照的使用 - AWS Lambda

快照的使用

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

快照会捕捉哪些信息

Firecracker 快照会在映像构建完成时从您的 MicroVM 中捕获以下状态:

  • 正在运行的进程的内存状态:由 ENTRYPOINT/CMD 启动的所有进程,包括后台进程守护程序、cron 作业和子进程。

  • 磁盘状态:根文件系统,包括在构建阶段写入的所有文件(已安装的软件包、已编译的二进制文件、配置文件)。

  • 网络连接和文件描述符:任何已初始化的网络连接、文件句柄、管道和其他描述符。

当您运行 MicroVM 时,Lambda 会使用该快照进行恢复。应用程序会准确从 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 映像。此映像包含由 AWS 修补的 OpenSSL 版本,与快照兼容。如果需要在 OpenSSL 中使用自己的基础映像,请使用 Amazon Linux 2023 软件包列表中列出的已修补 OpenSSL(openssl-snapsafe-libs)。