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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Lambda 容器映像

您的 Amazon Lambda 函数代码由脚本或编译的程序及其依赖项组成。您可以使用部署程序包将函数代码部署到 Lambda。Lambda 支持两种类型的部署程序包:容器镜像和 .zip 文件归档。

有三种方法可以为 Lambda 函数构建容器映像:

提示

要缩短 Lambda 容器函数激活所需的时间,请参阅 Docker 文档中的使用多阶段构建。要构建高效的容器映像,请遵循编写 Dockerfiles 的最佳实践

要从容器映像创建 Lambda 函数,请在本地构建映像,然后将其上传到 Amazon Elastic Container Registry(Amazon ECR)存储库。然后,在您创建该函数时指定存储库 URI。Amazon ECR 存储库必须与 Lambda 函数位于同一 Amazon Web Services 区域 内。只要映像与 Lambda 函数位于同一区域内,您就可以使用其他 Amazon 账户中的映像创建函数。有关更多信息,请参阅 Amazon ECR 跨账户权限

本页面介绍了创建与 Lambda 兼容的容器映像的基本映像类型和要求。

注意

您无法更改现有函数的部署包类型(.zip 或容器映像)。例如,您不能将容器映像函数转换为使用.zip 文件存档。您必须创建新函数。

要求

安装 Amazon Command Line Interface(Amazon CLI)版本 2Docker CLI。此外,请注意以下要求:

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

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

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

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

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

使用 Lambda 的 Amazon 基本映像

您可以使用 Lambda 的其中一个 Amazon 基本映像,为函数代码构建容器映像。基本镜像预加载了语言运行时和在 Lambda 上运行容器镜像所需的其他组件。将函数代码和依赖项添加到基本镜像中,然后将其打包为容器镜像。

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

Node.js 20、Python 3.12、Java 21、AL2023 及更高版本的基础镜像基于亚马逊 Linux 2023 最小容器镜像。早期的基础镜像使用亚马逊 Linux 2。与 Amazon Linux 2 相比,AL2023 具有多项优势,包括较小的部署占用空间以及 glibc 等更新版本的库。

基于 AL2023 的图像使用microdnf(符号链接为dnf)作为包管理器yum,而不是 Amazon Linux 2 中的默认包管理器。 microdnf是的独立实现dnf。有关基于 AL2023 的映像中包含的软件包列表,请参阅比较安装在 Amazon Linux 2023 容器映像上的软件包中的最小容器列。有关 AL2023 和亚马逊 Linux 2 之间区别的更多信息,请参阅 C Amazon ompute 博客Amazon Lambda上的 Amazon Linux 2023 运行时简介

注意

要在本地运行基于 AL2023 的映像,包括使用 Amazon Serverless Application Model (Amazon SAM),必须使用 Docker 版本 20.10.10 或更高版本。

要使用 Amazon 基本映像构建容器映像,请选择您的首选语言的说明:

使用 Amazon 仅限操作系统的基础镜像

Amazon 仅限操作系统的运行时系统包含 Amazon Linux 发行版和运行时系统接口模拟器。这些镜像通常用于为编译语言(例如 GoRust)以及 Lambda 未提供基础映像的语言或语言版本(例如 Node.js 19)创建容器镜像。您也可以使用仅限操作系统的基础映像来实施自定义运行时系统。要使映像与 Lambda 兼容,则必须在映像中包含适用于您的语言的运行时系统接口客户端

标签 运行时 操作系统 Dockerfile 淘汰

al2023

仅限操作系统的运行时系统 Amazon Linux 2023 仅适用于操作系统运行时的 Dockerfile 已开启 GitHub

al2

仅限操作系统的运行时系统 Amazon Linux 2 仅适用于操作系统运行时的 Dockerfile 已开启 GitHub

Amazon Elastic Container Registry Public Gallery:gallery.ecr.aws/lambda/provided

使用非 Amazon 基本映像

Lambda 支持符合以下映像清单格式之一的任何映像:

  • Docker Image Manifest V2,Schema 2(与 Docker 版本 1.10 和更新版本配合使用)

  • Open Container Initiative (OCI) 规范(v1.0.0 和更高版本)

Lambda 支持的最大未压缩图像大小为 10GB,包括所有层。

注意

要使映像与 Lambda 兼容,则必须在映像中包含适用于您的语言的运行时系统接口客户端

运行时接口客户端

如果使用仅限操作系统的基础映像或者备用基础映像,则必须在映像中包括运行时系统接口客户端。该运行时系统接口客户端必须扩展 Lambda 运行时 API,它管理 Lambda 与函数代码之间的交互。Amazon 为以下语言提供开源运行时系统接口客户端:

如果您使用的语言没有 Amazon 提供的运行时系统接口客户端,则必须创建您自己的运行时系统接口客户端。

Amazon ECR 权限

在从容器映像创建 Lambda 函数之前,您必须在本地构建映像并将其上传到 Amazon ECR 存储库。在您创建该函数时,指定 Amazon ECR 存储库 URI。

确保创建函数的用户或角色的权限包含 Amazon 托管策略 GetRepositoryPolicySetRepositoryPolicy

例如,使用 IAM 控制台创建具有以下策略的角色:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ecr:SetRepositoryPolicy", "ecr:GetRepositoryPolicy" ], "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world" } ] }

Amazon ECR 存储库策略

要将相同账户中的函数用作 Amazon ECR 中的容器映像,您可以向 Amazon ECR 存储库策略添加 ecr:BatchGetImageecr:GetDownloadUrlForLayer 权限。以下示例显示最小策略:

{ "Sid": "LambdaECRImageRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ] }

有关更多 Amazon ECR 存储库权限的信息,请参阅《Amazon Elastic Container Registry 用户指南》中的私有存储库策略

如果 Amazon ECR 存储库中不包含这些权限,Lambda 会为 ecr:BatchGetImageecr:GetDownloadUrlForLayer 添加容器镜像存储库权限。仅当 Lambda 的主要调用具有 ecr:getRepositoryPolicyecr:setRepositoryPolicy 权限时,Lambda 才能添加这些权限。

要查看或编辑您的 Amazon ECR 存储库权限,请参阅《Amazon Elastic Container Registry 用户指南》中的设置私有存储库策略声明

Amazon ECR 跨账户权限

相同区域中的不同账户可以创建一个使用您的账户拥有的容器镜像的函数。在以下示例中,您的 Amazon ECR 存储库权限策略需要以下语句,才能向账号 123456789012 授予访问权限。

  • CrossAccountPermission— 允许账户 123456789012 创建和更新使用此 ECR 存储库中的图像的 Lambda 函数。

  • LambdaeC ImageCrossAccountRetrievalPolicy R — 如果长时间不调用函数,Lambda 最终会将函数的状态设置为非活动状态。此语句是必需的,以便 Lambda 可以检索容器镜像,代表 123456789012 拥有的函数进行优化和缓存。

例 – 添加对存储库的跨账户权限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPermission", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "AWS": "arn:aws:iam::123456789012:root" } }, { "Sid": "LambdaECRImageCrossAccountRetrievalPolicy", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "Service": "lambda.amazonaws.com" }, "Condition": { "StringLike": { "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*" } } } ] }

要授予对多个账户的访问权限,您可以在 CrossAccountPermission 策略中将该账户 ID 添加到主体列表,并在 LambdaECRImageCrossAccountRetrievalPolicy 中将该账户 ID 添加到条件评估列表。

如果您在 Amazon Organization 中使用多个账户,我们建议您在 ECR 权限策略中枚举每个账户 ID。此方法遵循在 IAM policy 中设置窄权限的 Amazon 安全最佳实践。

容器映像设置

以下是常规容器映像设置。如果您在 Dockerfile 中使用这些设置,请注意 Lambda 是如何解释和处理这些设置的:

  • ENTRYPOINT – 指定应用程序入口点的绝对路径。

  • CMD – 指定要通过 ENTRYPOINT 传入的参数。

  • WORKDIR – 指定工作目录的绝对路径。

  • ENV – 为 Lambda 函数指定环境变量。

有关 Docker 如何使用容器映像设置的更多信息,请参阅 Docker Docs 网站上 Dockerfile 参考中的 ENTRYPOINT。有关使用 ENTRYPOINT 和 CMD 的更多信息,请参阅 Amazon 开源博客上的揭秘 Docker 中的 ENTRYPOINT 和 CMD

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

警告

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

要覆盖容器映像中的配置值
  1. 打开 Lamba 控制台的 Functions page(函数页面)。

  2. 选择要更新的函数。

  3. Image configuration(映像配置)下,选择 Edit(编辑)

  4. 为任意覆盖设置输入新值,然后选择 Save(保存)

  5. (可选)要添加或覆盖环境变量,请在 Environment variables(环境变量)下选择 Edit(编辑)

有关更多信息,请参阅 使用 Lambda 环境变量