如何使用具有 Docker 的模拟 Lambda 环境创建 Lambda 层?

上次更新日期:2021 年 3 月 12 日

我想创建一个与目标环境运行时兼容的 AWS Lambda 层。该如何操作?

简短描述

在构建 Lambda 函数时,您要在受支持的 Lambda 运行时版本之间进行选择。要创建与特定运行时兼容的 Lambda 函数和层,您可以使用 AWS 无服务器应用程序模型 (AWS SAM) 来自动创建新资源。或者,您可以使用 AWS SAM 的底层 amazon/aws-sam-cli-build-image Docker 映像来创建它们。

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版的 AWS CLI。

以下说明以 Python 为例。对于其他编码语言,相应地调整步骤。

1.如果还没有安装 Docker,在您的计算机上安装适用于 Linux、Windows,或 macOS 的 Docker。

2.创建适当的目录结构,并在 pip 要求文件 (requirements.txt) 中指定您的依赖关系。如需更多信息,请参阅《pip 用户指南》中的要求文件。

例如,若希望您的 Lambda 层与 Python 版本 3.6 和 3.8 兼容,其结构应如下所示:

├── requirements.txt
└── python/
    └── lib/
        ├── python3.6/
        │   └── site-packages/
        └── python3.8/
            └── site-packages/

注意:函数和所有层的解压总大小不得超过部署程序包的解压大小限制,即 250MB。

如需关于在 Lambda 中受支持的 Python 版本的更多信息,请参阅使用 Python 构建 Lambda 函数。

3.为您在目录结构中指定的每个运行时运行以下命令一次。此操作会在适当的子文件夹中安装与该运行时兼容的库。

docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.6" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.6/site-packages/; exit"

重要提示:根据您要安装的兼容的库,将 3.6 替换为 3.73.8

4.运行以下命令来压缩 python 文件夹并创建层程序包。.zip 文件在 Lambda 环境的 /opt 文件夹中被压缩,可以通过您的 Lambda 函数代码访问该文件夹。

zip -r mypythonlibs.zip python > /dev/null

注意:使用您偏好的任何名称替换 mypythonlibs

5.运行以下命令以创建或更新层。包含您在之前指定的兼容的运行时。

aws lambda publish-layer-version --layer-name mypythonlibs --description "My python libs" --zip-file fileb://mypythonlibs.zip --compatible-runtimes "python3.6" "python3.8"

重要提示:使用您在上一步中使用的程序包的名称替换 mypythonlibs。将 My python libs 替换成您偏好的任何描述。

记下输出中的层的 Amazon 资源名称 (ARN)。步骤 6 需要 ARN。

6.运行以下命令来更新您的 Lambda 函数配置以使用该层:

aws lambda update-function-configuration --layers arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 --function-name my-function

重要提示:使用步骤 5 的层 ARN 替换 arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1

(可选)将 Docker 映像用于您的 Lambda 程序包

您还可以直接将 amazon/aws-sam-cli-build-image Docker 映像用于您的 Lambda 程序包,而无需创建层。

1.运行以下命令以获得您的依赖关系的所需版本:

docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.6" /bin/sh -c "pip install -r requirements.txt -t libs; exit"

重要提示:根据您要安装的兼容的库,将 3.6 替换为 3.73.8

2.创建一个 Lambda 部署程序包,其中包含您的函数代码和正确的库。