

# Amazon Lambda MicroVMs 的核心概念
<a name="microvms-how-it-works"></a>

Amazon Lambda MicroVMs 会使用您创建和管理的多种资源类型。本页介绍了每种资源类型、Lambda 如何将您的 MicroVM 映像构建为快照，以及 MicroVM 在运行时的生命周期状态变化：这些都是使用 MicroVM 构建应用程序的基础。

## 重要概念
<a name="microvms-key-concepts"></a>

**MicroVM**  
MicroVM 是一种资源，代表用于单个租户、用户会话或作业的隔离计算环境。每个 MicroVM 都会运行包含各种操作系统功能的 Amazon Linux 2023 操作系统，提供近乎即时的启动和恢复能力。MicroVM 通过入站 HTTPS 连接接收请求，并且可在空闲时暂停运行，但保持内存和磁盘状态。已暂停的 MicroVM 将在有流量返回时恢复。

**MicroVM 映像**  
MicroVM 映像是一种用于为 MicroVM 定义应用程序环境的资源。当您创建映像时，Lambda 会将其构建到快照中，从而实现近乎即时的启动（请参阅下文的[Lambda 如何构建映像](#microvms-build-process)）。  
要创建 MicroVM 映像，您需要提供一个 zip 压缩包，其中包含已上传到 Amazon S3 的 `Dockerfile` 以及您的应用程序构件。您必须以 Lambda 发布的托管式基础映像为基础（使用 `base-image-arn` 参数来指定）。您的 `Dockerfile` 用于定义 Lambda 将在托管式基础之上构建的应用程序层。  
MicroVM 映像已启用版本控制。每个版本都代表使用特定代码构件和基础映像生成的单个构建。版本将随构建状态（`PENDING` → `IN_PROGRESS` → `SUCCESSFUL` 或 `FAILED`）不断演进，构建成功的版本可以设置为 `ACTIVE` 或 `INACTIVE`。有关映像状态和管理的详细信息，请参阅 [MicroVM 映像](microvms-images.md)。

**网络连接器**  
网络连接器是用于控制流量如何到达您的 MicroVM 以及 MicroVM 如何到达外部服务的资源。您可以在运行时将连接器关联到 MicroVM，从而独立配置入站和出站访问权限。  
构建时和运行时连接器可以不同，从而让您的 MicroVM 能够在映像构建期间和运行时访问不同的环境。  
使用 Lambda 提供的入站端口访问（使用 JWE 身份验证）、Shell 访问和公共互联网出口默认值。创建您自己的网络连接器以通过您的 VPC 路由出站流量。

## Lambda 如何构建映像
<a name="microvms-build-process"></a>

当您创建或更新 MicroVM 映像时，Lambda 会执行一个构建进程来生成 Firecracker 快照。此快照会以完全初始化后的状态捕获您的应用程序，从而使利用该快照运行的 MicroVM 可以近乎即时地启动和恢复。

构建进程：

1. Lambda 使用您指定的托管式基础映像预调配一个全新的 MicroVM。

1. Lambda 会执行您的 `Dockerfile` 指令来安装依赖项并配置环境。

1. Lambda 将使用 `ENTRYPOINT` 或 `CMD` 命令启动您的应用程序。

1. 如果您启用了 `/ready` 钩子，Lambda 会等待您的应用程序发出准备就绪信号（HTTP 200）。

1. Lambda 会拍摄磁盘和内存状态的快照，包括所有正在运行的进程。

当您运行 MicroVM 时，Lambda 会使用该快照进行恢复。您的应用程序将以预初始化状态恢复，无需重复启动。

如果您的应用程序在构建期间生成了唯一的内容（例如唯一 ID、密钥或网络连接），则该内容将在运行相同映像版本的所有 MicroVM 之间共享。为避免这种情况，请在 MicroVM 启动后使用 `/run` 生命周期挂钩后生成唯一内容。有关详细信息，请参阅 [MicroVM 映像](microvms-images.md)中的“快照兼容性”部分。

## MicroVM 生命周期
<a name="microvms-lifecycle-overview"></a>

在运行时，MicroVM 会经历以下阶段：

1. **运行**：您可以调用 `run-microvm`。Lambda 将利用映像快照恢复 MicroVM，分配唯一的 ID 并创建端点。MicroVM 的状态将从 `PENDING` 变为 `RUNNING`。

1. **正在运行**：您的应用程序通过其端点 URL 接收和处理请求。

1. **暂停**：经过可配置的空闲期后（或通过 `suspend-microvm` API），MicroVM 会经历 `SUSPENDING` 到 `SUSPENDED` 阶段。内存和磁盘状态会得以保留。

1. **恢复**：当有流量到达（如果 `autoResumeEnabled=true`）或在您调用 `resume-microvm` 时，MicroVM 的状态会从 `SUSPENDED` 直接变为 `RUNNING`。

1. **终止**：当您调用 `terminate-microvm` 或超过最大持续时间时，MicroVM 会经历 `TERMINATING` 到 `TERMINATED` 阶段。

### 状态
<a name="microvms-states"></a>

下表介绍了每个 MicroVM 状态。这些状态使您能够构建可靠的应用程序并实现正确的错误处理逻辑。


| 州 | 说明 | 
| --- | --- | 
| PENDING | 正在预调配 MicroVM。正在分配资源并且正在加载快照。 | 
| RUNNING | MicroVM 处于活动状态，并通过其端点 URL 接受流量。/run 钩子已完成。 | 
| SUSPENDING | MicroVM 正在被暂停。/suspend 钩子正在执行。正在检查磁盘和内存。 | 
| SUSPENDED | MicroVM 已暂停。状态已保留。不会产生计算费用。可以恢复或终止。 | 
| TERMINATING | MicroVM 正在终止。/terminate 钩子正在执行。正在释放资源。 | 
| TERMINATED | MicroVM 已终止。这是最终状态。MicroVM 无法恢复或重新启动。 | 

### 状态变换
<a name="microvms-transitions"></a>

下表列举了 MicroVM 状态的有效变换以及会触发每种状态变换的因素。


| Initial state | 目标状态 | 触发器 | 
| --- | --- | --- | 
| PENDING | RUNNING | 预调配完成，/run 钩子已成功。 | 
| RUNNING | SUSPENDING | 超过空闲时长，或者显式调用了 suspend-microvm API。 | 
| SUSPENDING | SUSPENDED | /suspend 钩子已完成，内存和磁盘状态已检查。 | 
| SUSPENDED | RUNNING | 有流量到达 (autoResumeEnabled=true) 或显式调用了 resume-microvm API。 | 
| RUNNING | TERMINATING | 显式调用了 terminate-microvm API，或超过 maximumDurationInSeconds。 | 
| SUSPENDED | TERMINATING | 超过 suspendedDurationSeconds，或显式调用了 terminate-microvm API。 | 
| TERMINATING | TERMINATED | /terminate 钩子已完成，所有资源已释放。 | 

**重要**  
如果 `/run` 钩子失败或超时，MicroVM 可能会直接变为 `TERMINATING` 状态，永远不会达到 `RUNNING` 状态。在钩子中实施超时和错误处理逻辑，以避免静默失败。