创建 Lambda 容器镜像
Amazon 提供了一组可用于创建容器映像的开源基本映像。这些基本镜像包括运行时接口客户端,用于管理 Lambda 和函数代码之间的交互。
有关示例应用程序(包括 Node.js 示例和 Python 示例),请参阅Amazon博客上的 Lambda 的容器镜像支持
主题
先决条件
要将容器镜像部署到 Lambda,需要 Amazon CLI 和 Docker CLI
-
容器镜像必须实施 Lambda 运行时 API。Amazon开源运行时接口客户端实施 API。您可以将运行时接口客户端添加到首选基本镜像中以使其与 Lambda 兼容。
-
容器映像必须能够在只读文件系统上运行。您的函数代码可以访问具有 512 MB 存储空间的可写
/tmp
目录。 -
默认 Lambda 用户必须能够读取运行函数代码所需的所有文件。Lambda 通过定义具有最低权限的默认 Linux 用户来遵循安全最佳实践。验证您的应用程序代码是否不依赖于其他 Linux 用户被限制运行的文件。
-
Lambda 仅支持基于 Linux 的容器镜像。
-
Lambda 提供多架构基础镜像。但是,您为函数构建的镜像必须仅针对其中一个架构。Lambda 不支持使用多架构容器镜像的函数。
映像类型
您可以使用Amazon提供的基本镜像或备用基本镜像(例如 Alpine 或 Debian)。Lambda 支持符合以下镜像清单格式之一的任何镜像:
Docker Image Manifest V2,Schema 2(与 Docker 版本 1.10 和更新版本配合使用)
Open Container Initiative (OCI) 规范(v1.0.0 和更高版本)
Lambda 支持最大 10 GB 的镜像。
容器工具
要创建容器映像,您可以使用支持以下容器映像清单格式之一的任何开发工具:
Docker Image Manifest V2,Schema 2(与 Docker 版本 1.10 和更新版本配合使用)
OCI 规格(v1.0.0 及更高版本)
例如,您可以使用 Docker CLI 构建、测试和部署容器映像。
容器映像设置
Lambda 支持 Docckerfile 中的以下容器镜像设置:
-
ENTRYPOINT – 指定应用程序入口点的绝对路径。
-
CMD – 指定要通过 ENTRYPOINT 传入的参数。
-
WORKDIR – 指定工作目录的绝对路径。
-
ENV – 为 Lambda 函数指定环境变量。
Lambda 忽略 Dockerfile 中任何不支持的容器镜像设置的值。
有关 Docker 如何使用容器映像设置的更多信息,请参阅 Docker Docs 网站上 Dockerfile 参考中的 ENTRYPOINT
构建映像时,您可以在 Docckerfile 中指定容器映像设置。您还可以使用 Lambda 控制台或 Lambda API 覆盖这些配置。这允许您使用不同的运行时配置部署相同的容器映像,从而部署多个函数。
当您在 Dockerfile 中指定 ENTRYPOINT 或 CMD 或作为覆盖时,请确保输入绝对路径。此外,不要使用符号链接作为容器的入口点。
从 Amazon 基本镜像创建镜像
要为新 Lambda 函数构建容器镜像,可以从 Lambda 的Amazon基本镜像开始。Lambda 提供了两种类型的基本镜像:
-
多架构基本镜像
指定主镜像标签之一(例如
python:3.9
或java:11
) 以选择此类型的镜像。 -
架构特定的基本镜像
指定带架构后缀的镜像标签。例如,指定
3.9-arm64
为 Python 3.9 选择 arm64 基本镜像。
您还可以使用其他容器注册表的备用基本镜像。Lambda 提供了开源运行时接口客户端,您可以将其添加到备用基本镜像以使其与 Lambda 兼容。
Amazon定期为 Lambda 的Amazon基本镜像提供更新。如果 Dockerfile 在 FROM 属性中包含映像名称,则 Docker 客户端将从 Amazon ECR 存储库中提取最新版本的映像。要使用更新后的基本映像,必须重建容器映像并更新函数代码。
通过Amazon基本镜像为 Lambda 创建镜像
-
在本地计算机上,为新函数创建项目目录。
-
在项目目录中创建名为
app
的目录,然后将函数处理程序代码添加到应用程序目录中。 -
使用文本编辑器创建新的 Dockerfile。
Amazon 基本映像提供了以下环境变量:
-
LAMBDA_TASK_ROOT=/var/task
-
LAMBDA_RUNTIME_DIR=/var/runtime
与函数处理程序一起,在 ${LAMBDA_TASK_ROOT} 目录下安装所有依赖项,以确保在调用该函数时,Lambda 运行时可以找到它们。
以下示例展示了一个适用于 Node.js、Python 和 Ruby 的示例 Dockerfile:
-
-
使用
docker build
命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为hello-world
。docker build -t
hello-world
. -
使用
docker run
命令启动 Docker 映像。对于此示例,请输入hello-world
作为映像名称。docker run -p 9000:8080
hello-world
-
(可选)使用运行时接口模拟器在本地测试应用程序。在新的终端窗口中,使用
curl
命令将事件发布到以下终端节点:curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
此命令调用在容器映像中运行的 函数并返回响应。
从备选基本镜像创建镜像
先决条件
-
这些区域有: Amazon CLI
-
Docker 桌面
-
函数代码
使用备用基本映像创建映像
-
选择基本镜像。Lambda 支持所有 Linux 发行版,例如 Alpine、Debian 和 Ubuntu。
-
在本地计算机上,为新函数创建项目目录。
-
在项目目录中创建名为
app
的目录,然后将函数处理程序代码添加到应用程序目录中。 -
使用文本编辑器创建具有以下配置的新 Dockerfile:
将
FROM
属性设置为基本映像的 URI。添加安装运行时接口客户端的说明。
设置
ENTRYPOINT
属性以调用运行时接口客户端。设置
CMD
参数以指定 Lambda 函数处理程序。
以下示例显示了一个适用于 Python 的 Dockerfile:
# Define function directory ARG FUNCTION_DIR="/function" FROM python:buster as build-image # Install aws-lambda-cpp build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev # Include global arg in this stage of the build ARG FUNCTION_DIR # Create function directory RUN mkdir -p ${FUNCTION_DIR} # Copy function code COPY app/* ${FUNCTION_DIR} # Install the runtime interface client RUN pip install \ --target ${FUNCTION_DIR} \ awslambdaric # Multi-stage build: grab a fresh copy of the base image FROM python:buster # Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the build image dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ] CMD [ "app.handler" ]
-
使用
docker build
命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为hello-world
。docker build -t
hello-world
. -
(可选)使用运行时接口模拟器在本地测试应用程序。
将镜像上载到 Amazon ECR 存储库
在以下命令中,请将替换为 123456789012
替换为您的 Amazon 账户 ID,并将区域值设置为您想要在其中创建 Amazon ECR 存储库的区域。
在 Amazon ECR 中,如果将镜像标签重新分配给另一个镜像,则 Lambda 不会更新镜像版本。
-
对您的 Amazon ECR 注册表进行 Docker CLI 身份验证。
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin123456789012
.dkr.ecr.us-east-1
.amazonaws.com -
使用
create-repository
命令在 Amazon ECR 中创建存储库。aws ecr create-repository --repository-name
hello-world
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE -
标记镜像以匹配您的存储库名称,然后使用
docker push
命令将镜像部署到 Amazon ECR。docker tag
hello-world
:latest123456789012
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest docker push123456789012
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest
容器镜像驻留在 Amazon ECR 容器注册表中之后,您可以创建并运行 Lambda 函数。
使用 Amazon SAM 工具包创建映像
您可以使用 Amazon Serverless Application Model (Amazon SAM) 工具包创建和部署定义为容器映像的函数。对于新项目,您可以使用 Amazon SAM CLI init
命令在首选运行时为项目设置支架。
在 Amazon SAM 模板中,您将 Runtime
类型设置为 Image
并提供基本映像的 URI。
有关更多信息,请参阅 Amazon Serverless Application Model 开发人员指南中的构建应用程序。