

# 创建您的第一个 Lambda MicroVM
<a name="microvms-getting-started"></a>

本教程将演示创建一个 Amazon Lambda MicroVM 映像并使用该映像运行一个 MicroVM 的过程。本教程完成后，您将拥有一个可通过 HTTPS 访问的正在运行的应用程序。

## 先决条件
<a name="microvms-getting-started-prereqs"></a>

在开始操作前，您需要做好两项准备：

1. 位于您需要的 Amazon 区域的**一个 Amazon S3 存储桶**，用来存储您的应用程序构件（您将在第 2 步中创建的 zip 文件）。

1. Lambda 在创建映像时将要代入的**一个 IAM 构建角色**。Lambda 将使用此角色从 Amazon S3 下载您的代码构件，并将构建日志写入 CloudWatch。

使用如下信任策略创建该 IAM 角色。这将允许 Lambda 服务代入该角色：

```
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "Service": "lambda.amazonaws.com" },
    "Action": ["sts:AssumeRole", "sts:TagSession"]
  }]
}
```

将以下权限策略附加到该角色。将 `<your-bucket-name>` 替换为您的 Amazon S3 存储桶名称：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::<your-bucket-name>/*"
    },
    {
      "Effect": "Allow",
      "Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

**注意**  
如果您的 `Dockerfile` 会从某个私有 Amazon ECR 存储库中拉取数据，则还需将 `ecr:GetAuthorizationToken` 和 `ecr:BatchGetImage` 添加到该权限策略。

## 创建您的第一个 MicroVM 映像
<a name="microvms-getting-started-first-image"></a>

MicroVM 映像会以完全初始化后的状态捕获您的应用程序。从该映像运行 MicroVM 时，您的应用程序会立即启动，无需引导，也不会有初始化延迟。

### 第 1 步：编写您的应用程序和 Dockerfile
<a name="microvms-getting-started-step1"></a>

创建一个将在您的 MicroVM 中运行的简单 HTTP 服务器。此示例使用没有外部依赖项的 Node.js：

**`app.js`**

```
// Minimal HTTP server — listens on port 8080
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ status: 'ok', path: req.url }));
});

server.listen(8080, () => {
  console.log('Listening on port 8080');
});
```

然后创建一个 `Dockerfile` 来打包和启动您的应用程序：

**`Dockerfile`**

```
# Use a lightweight Node.js runtime for your application layers
FROM node:24-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy your application code
COPY app.js .

# Declare the port your app listens on
EXPOSE 8080

# Start the application — Lambda snapshots the running state
CMD ["node", "app.js"]
```

**注意**  
`FROM` 指令用于设置应用程序层的容器映像。可以使用任何兼容的容器映像。Lambda 托管式基础映像（提供 MicroVM 操作系统和服务组件）将在第 3 步中使用 `--base-image-arn` 单独指定。  
如果您的应用程序会生成唯一值（ID、密钥或加密材料），请使用所用语言的标准加密安全伪随机数生成器（CSPRNG）库，来确保跨 MicroVM 的唯一性。如果您的应用程序使用 OpenSSL，请使用包含快照兼容版本的 Lambda 基础容器映像。有关详细信息，请参阅 [MicroVM 映像](microvms-images.md)中的“快照兼容性”部分。

### 第 2 步：打包并上传到 Amazon S3
<a name="microvms-getting-started-step2"></a>

将您的 `app.js` 和 `Dockerfile` 打包为 zip 存档文件，然后将其上传到您的 Amazon S3 存储桶。在计算机终端中运行以下命令。

```
zip app.zip app.js Dockerfile
aws s3 cp app.zip s3://{{your-bucket-name}}/app.zip
```

### 第 3 步：创建 MicroVM 映像
<a name="microvms-getting-started-step3"></a>

调用 `create-microvm-image` 来开始构建。Lambda 将从 Amazon S3 下载您的 zip 文件，运行您的 `Dockerfile`，启动您的应用程序，然后以完全初始化后的状态拍摄一个 Firecracker 快照：

```
aws lambda-microvms create-microvm-image \
  --name my-first-microvm-image \
  --code-artifact uri=s3://{{your-bucket-name}}/app.zip \
  --base-image-arn arn:aws:lambda:{{us-east-1}}:aws:microvm-image:al2023-1 \
  --build-role-arn arn:aws:iam::{{123456789012}}:role/MicrovmBuildRole
```

该映像的初始状态将为 `CREATING`。通过以下方式检查构建状态：

```
aws lambda-microvms get-microvm-image \
  --image-identifier my-first-microvm-image
```

构建完成后，`state` 字段将变为 `CREATED`：

```
{
  "imageName": "my-first-microvm-image",
  "imageArn": "arn:aws:lambda:us-east-1:123456789012:microvm-image:my-first-microvm-image",
  "state": "CREATED",
  "imageVersion": "1.0",
  ...
}
```

如果状态为 `CREATE_FAILED`，请在 CloudWatch 中检查位于 `/aws/lambda/microvms/my-first-microvm-image` 下的构建日志。

## 运行您的第一个 MicroVM
<a name="microvms-getting-started-run"></a>

当您的 MicroVM 映像达到 `CREATED` 状态后，即可以从中运行 MicroVM。一个映像可以启动多个 MicroVM：每个租户、用户会话或作业一个。

使用以下命令运行一个 MicroVM：

```
aws lambda-microvms run-microvm \
  --image-identifier my-first-microvm-image \
  --ingress-network-connectors "arn:aws:lambda:{{us-east-1}}:aws:network-connector:aws-network-connector:ALL_INGRESS" \
  --egress-network-connectors "arn:aws:lambda:{{us-east-1}}:aws:network-connector:aws-network-connector:INTERNET_EGRESS" \
  --idle-policy '{"autoResumeEnabled":true,"maxIdleDurationSeconds":900,"suspendedDurationSeconds":300}'
```

参数解释：
+ `--ingress-network-connectors`：在所有端口上启用流向您的 MicroVM 的入站 HTTPS 流量。这是一个 Lambda 托管式连接器。
+ `--egress-network-connectors`：启用从您的 MicroVM 流出的出站互联网访问。这是一个 Lambda 托管式连接器。
+ `--idle-policy`：配置自动暂停-恢复行为。此策略会在 MicroVM 处于不活动状态 15 分钟后将其暂停不超过 5 分钟，然后在有流量到达时自动恢复。

响应包括 MicroVM ID 和端点 URL：

```
{
  "microvmId": "mvm-01234567-abcd-ef01-2345-6789abcdef01",
  "state": "PENDING",
  "endpoint": "mvm-01234567-abcd-ef01-2345-6789abcdef01.lambda-microvm.us-east-1.on.aws",
  ...
}
```

等待状态变为 `RUNNING`：

```
aws lambda-microvms get-microvm \
  --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01
```

## 连接到您的 MicroVM
<a name="microvms-getting-started-connect"></a>

对 MicroVM 端点的所有请求都需要有身份验证令牌。使用以下命令生成一个令牌：

```
aws lambda-microvms create-microvm-auth-token \
  --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01 \
  --expiration-in-minutes 30 \
  --allowed-ports '[{"allPorts":{}}]'
```

响应的 `authToken` 字段中会包含一个令牌。使用该令牌向正在运行的应用程序发送请求：

```
curl https://mvm-01234567-abcd-ef01-2345-6789abcdef01.lambda-microvm.us-east-1.on.aws/ \
  -H "X-aws-proxy-auth: {{<token-value>}}"
```

您应会看到来自应用程序的响应：

```
{"status":"ok","path":"/"}
```

您的 MicroVM 已在运行并处理流量。您在第 1 步中编写的应用程序在端点 URL 上线运行。

## 清理
<a name="microvms-getting-started-cleanup"></a>

要避免持续产生费用，请在完成后终止 MicroVM：

```
aws lambda-microvms terminate-microvm \
  --microvm-identifier mvm-01234567-abcd-ef01-2345-6789abcdef01
```

## 后续步骤
<a name="microvms-getting-started-next"></a>
+ 查看[核心概念](microvms-how-it-works.md)以了解快照进程、生命周期状态和基础映像。
+ 探索 [MicroVM 映像](microvms-images.md)以了解映像构建钩子、版本控制和快照兼容性。
+ 查看 [运行 MicroVM](microvms-launching.md)以获取 SDK 示例、生命周期挂钩和扩缩策略。