创建 Lambda 容器镜像 - AWS Lambda

创建 Lambda 容器镜像

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

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

先决条件

要将容器镜像部署到 Lambda,需要 AWS CLIDocker CLI。此外,请注意以下要求:

  • 容器镜像必须实施 Lambda 运行时 API。AWS开源运行时接口客户端实施 API。您可以将运行时接口客户端添加到首选基本镜像中以使其与 Lambda 兼容。

  • 容器映像必须能够在只读文件系统上运行。您的函数代码可以访问具有介于 512 MB 至 10,240 MB(以 1 MB 为增量)的存储空间的可写 /tmp 目录。

  • 默认 Lambda 用户必须能够读取运行函数代码所需的所有文件。Lambda 通过定义具有最低权限的默认 Linux 用户来遵循安全最佳实践。验证您的应用程序代码是否不依赖于其他 Linux 用户被限制运行的文件。

  • Lambda 仅支持基于 Linux 的容器镜像。

  • Lambda 提供多架构基础镜像。但是,您为函数构建的镜像必须仅针对其中一个架构。Lambda 不支持使用多架构容器镜像的函数。

映像类型

您可以使用AWS提供的基本镜像或备用基本镜像(例如 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 的更多信息,请参阅 AWS 开源博客上的揭秘 Docker 中的 ENTRYPOINT 和 CMD

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

警告

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

从 AWS 基本镜像创建镜像

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

  • 多架构基本镜像

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

  • 架构特定的基本镜像

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

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

注意

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

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

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

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

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

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

    • 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 '{}'

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

从备选基本镜像创建镜像

先决条件

  • 这些区域有: AWS 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 替换为您的 AWS 账户 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 函数。

使用 AWS SAM 工具包创建映像

您可以使用 AWS Serverless Application Model (AWS SAM) 工具包创建和部署定义为容器映像的函数。对于新项目,您可以使用 AWS SAM CLI init 命令在首选运行时为项目设置支架。

在 AWS SAM 模板中,您将 Runtime 类型设置为 Image 并提供基本映像的 URI。

有关更多信息,请参阅 AWS Serverless Application Model 开发人员指南中的构建应用程序