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

创建 Lambda 容器映像

您可以使用 Docker CLI 等工具将 Lambda 函数代码和依赖项打包为容器映像。然后,您可以将映像上传到在 Amazon Elastic Container Registry (Amazon ECR) 上托管的容器注册表。请注意,您必须从与 Amazon ECR 中容器注册表相同的账户创建 Lambda 函数。

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

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

对于示例应用程序(包括 Node.js 示例和 Python 示例),请参阅 AWS 博客上的 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 对容器映像的要求

要将容器映像部署到 Lambda,请注意以下要求:

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

  2. 容器映像必须能够在只读文件系统上运行。您的函数代码可以访问具有 512 MB 存储空间的可写 /tmp 目录。如果您使用的映像需要 /tmp 外部的可写目录,请将其配置为写入 /tmp 目录下的目录。

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

  4. Lambda 仅支持基于 Linux 的容器映像。

容器映像设置

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 函数构建容器映像,可以从 Lambda 的 AWS 基本映像开始。

注意

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

先决条件

  • AWS Command Line Interface (AWS CLI)

    以下说明使用 AWS CLI 调用 AWS 服务 API 操作。要安装 AWS CLI,请参阅 AWS Command Line Interface 用户指南 中的安装、更新和卸载 AWS CLI

  • Docker 桌面

    以下说明使用 Docker CLI 命令创建容器映像。要安装 Docker CLI,请参阅 Docker Docs 网站上的获取 Docker

  • 函数代码

从 Lambda 的 AWS 基本映像创建映像

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

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

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

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

    • LAMBDA_TASK_ROOT=/var/task

    • LAMBDA_RUNTIME_DIR=/var/runtime

    下面显示了 Node.js 版本 12 的示例 Dockerfile:

    FROM public.ecr.aws/lambda/nodejs:12 # Alternatively, you can pull the base image from Docker Hub: amazon/aws-lambda-nodejs:12 COPY app.js package.json /var/task/ # 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" ]
  4. 使用 docker build 命令构建 Docker 映像。输入映像的名称。以下示例将映像命名为 hello-world

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

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

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

  6. 对您的 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
  7. 标记映像以匹配您的存储库名称,然后使用 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

从备用基本映像创建映像

先决条件

  • 这些区域有: AWS CLI

  • Docker 桌面

  • 函数代码

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

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

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

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

  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. (可选)使用运行时接口模拟器在本地测试应用程序。

  7. 对您的 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
  8. 标记映像以匹配您的存储库名称,然后使用 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

使用 AWS SAM 工具包创建映像

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

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

有关更多信息,请参阅 AWS 无服务器应用程序模型 开发人员指南 中的构建应用程序