View a markdown version of this page

创建您的第一个 Lambda MicroVM - AWS Lambda

创建您的第一个 Lambda MicroVM

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

先决条件

在开始操作前,您需要做好两项准备:

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

  2. 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 会从某个私有 AWS ECR 存储库中拉取数据,则还需将 ecr:GetAuthorizationTokenecr:BatchGetImage 添加到该权限策略。

创建您的第一个 MicroVM 映像

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

第 1 步:编写您的应用程序和 Dockerfile

创建一个将在您的 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 映像中的“快照兼容性”部分。

第 2 步:打包并上传到 Amazon S3

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

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

第 3 步:创建 MicroVM 映像

调用 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

当您的 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

对 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 上线运行。

清理

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

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

后续步骤

  • 查看核心概念以了解快照进程、生命周期状态和基础映像。

  • 探索 MicroVM 映像以了解映像构建钩子、版本控制和快照兼容性。

  • 查看 运行 MicroVM以获取 SDK 示例、生命周期挂钩和扩缩策略。