创建 Lambda 容器镜像 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

创建 Lambda 容器镜像

Amazon 提供了一组可用于创建容器映像的开源基本映像。这些基本镜像包括运行时接口客户端,用于管理 Lambda 和函数代码之间的交互。

有关示例应用程序(包括 Node.js 示例和 Python 示例),请参阅Amazon博客上的 Lambda 的容器镜像支持

先决条件

要将容器镜像部署到 Lambda,需要 Amazon CLIDocker 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。有关使用 ENTRYPOINT 和 CMD 的更多信息,请参阅 Amazon 开源博客上的揭秘 Docker 中的 ENTRYPOINT 和 CMD

构建映像时,您可以在 Docckerfile 中指定容器映像设置。您还可以使用 Lambda 控制台或 Lambda API 覆盖这些配置。这允许您使用不同的运行时配置部署相同的容器映像,从而部署多个函数。

警告

当您在 Dockerfile 中指定 ENTRYPOINT 或 CMD 或作为覆盖时,请确保输入绝对路径。此外,不要使用符号链接作为容器的入口点。

从 Amazon 基本镜像创建镜像

要为新 Lambda 函数构建容器镜像,可以从 Lambda 的Amazon基本镜像开始。Lambda 提供了两种类型的基本镜像:

  • 多架构基本镜像

    指定主镜像标签之一(例如 python:3.9java:11) 以选择此类型的镜像。

  • 架构特定的基本镜像

    指定带架构后缀的镜像标签。例如,指定 3.9-arm64 为 Python 3.9 选择 arm64 基本镜像。

您还可以使用其他容器注册表的备用基本镜像。Lambda 提供了开源运行时接口客户端,您可以将其添加到备用基本镜像以使其与 Lambda 兼容。

注意

Amazon定期为 Lambda 的Amazon基本镜像提供更新。如果 Dockerfile 在 FROM 属性中包含映像名称,则 Docker 客户端将从 Amazon ECR 存储库中提取最新版本的映像。要使用更新后的基本映像,必须重建容器映像并更新函数代码

通过Amazon基本镜像为 Lambda 创建镜像

  1. 在本地计算机上,为新函数创建项目目录。

  2. 在项目目录中创建名为 app 的目录,然后将函数处理程序代码添加到应用程序目录中。

  3. 使用文本编辑器创建新的 Dockerfile。

    Amazon 基本映像提供了以下环境变量:

    • LAMBDA_TASK_ROOT=/var/task

    • LAMBDA_RUNTIME_DIR=/var/runtime

    与函数处理程序一起,在 ${LAMBDA_TASK_ROOT} 目录下安装所有依赖项,以确保在调用该函数时,Lambda 运行时可以找到它们。

    以下示例展示了一个适用于 Node.js、Python 和 Ruby 的示例 Dockerfile:

    Node.js 14
    FROM public.ecr.aws/lambda/nodejs:14 # Assumes your function is named "app.js", and there is a package.json file in the app directory COPY app.js package.json ${LAMBDA_TASK_ROOT} # Install NPM dependencies for function RUN npm install # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.handler" ]
    Python 3.8
    FROM public.ecr.aws/lambda/python:3.8 # Copy function code COPY app.py ${LAMBDA_TASK_ROOT} # Install the function's dependencies using file requirements.txt # from your project folder. COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.handler" ]
    Ruby 2.7
    FROM public.ecr.aws/lambda/ruby:2.7 # Copy function code COPY app.rb ${LAMBDA_TASK_ROOT} # Copy dependency management file COPY Gemfile ${LAMBDA_TASK_ROOT} # Install dependencies under LAMBDA_TASK_ROOT ENV GEM_HOME=${LAMBDA_TASK_ROOT} RUN bundle install # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.LambdaFunction::Handler.process" ]
  4. 使用 docker build 命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为 hello-world

    docker build -t hello-world .
  5. 使用 docker run 命令启动 Docker 映像。对于此示例,请输入 hello-world 作为映像名称。

    docker run -p 9000:8080 hello-world
  6. (可选)使用运行时接口模拟器在本地测试应用程序。在新的终端窗口中,使用 curl 命令将事件发布到以下终端节点:

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    此命令调用在容器映像中运行的 函数并返回响应。

从备选基本镜像创建镜像

先决条件

  • 这些区域有: Amazon CLI

  • Docker 桌面

  • 函数代码

使用备用基本映像创建映像

  1. 选择基本镜像。Lambda 支持所有 Linux 发行版,例如 Alpine、Debian 和 Ubuntu。

  2. 在本地计算机上,为新函数创建项目目录。

  3. 在项目目录中创建名为 app 的目录,然后将函数处理程序代码添加到应用程序目录中。

  4. 使用文本编辑器创建具有以下配置的新 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" ]
  5. 使用 docker build 命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为 hello-world

    docker build -t hello-world .
  6. (可选)使用运行时接口模拟器在本地测试应用程序。

将镜像上载到 Amazon ECR 存储库

在以下命令中,请将替换为 123456789012 替换为您的 Amazon 账户 ID,并将区域值设置为您想要在其中创建 Amazon ECR 存储库的区域。

注意

在 Amazon ECR 中,如果将镜像标签重新分配给另一个镜像,则 Lambda 不会更新镜像版本。

  1. 对您的 Amazon ECR 注册表进行 Docker CLI 身份验证。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  2. 使用 create-repository 命令在 Amazon ECR 中创建存储库。

    aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
  3. 标记镜像以匹配您的存储库名称,然后使用 docker push 命令将镜像部署到 Amazon ECR。

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest docker push 123456789012.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 开发人员指南中的构建应用程序