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

上次更新时间:2019 年 12 月 19 日

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

简短描述

在构建 Lambda 函数时,您要在受支持的 Lambda 运行时版本之间进行选择。您可以使用 lambci/lambda Docker 映像模拟实时的 Lambda 环境,并创建与由您指定的运行时兼容的层。如需更多信息,见 Docker 网站上的 lambci/lambda

记住,lambci/lambda 映像并非完全复制 Lambda 环境,其中有些文件可能缺失。

注意:当您运行 sam local start-api 以便在本地测试无服务器应用程序时,AWS 无服务器应用程序模型 (AWS SAM) 也会使用 lambci/lambda 映像。

解决方法

注意:这些说明以 Python 为例。对于其他语言,相应地调整步骤。

1.    如果还没有安装 Docker,在您的计算机上安装适用于 LinuxWindows,或 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/

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

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

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

注意:根据您要安装的兼容的库,将 3.6 替换为 3.73.8

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

4.    通过压缩 python 文件夹创建层程序包。.zip 文件将在 Lambda 环境的 /opt 文件夹中被压缩,而且可以从您的 Lambda 函数代码对其进行直接访问。

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

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

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

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

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

记下输出中的层的 Amazon 资源名称 (ARN)。您将在下一步用到它。

6.    运行以下命令。它会更新您的 Lambda 函数配置以使用相关层

注意:使用上一步的层 ARN 替换 arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1

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

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

您还可以直接将 lambci/lambda Docker 映像用于您的 Lambda 程序包,而无需创建层。运行以下命令以获得您的依赖关系的所需版本:

注意:根据您要安装的兼容的库,将 3.6 替换为 3.73.8

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

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