Lambda 层与部署包
将共享依赖打包到可复用的 Lambda 层中,并管理大型运行时所需的部署包。
Lambda 层与部署包 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
Lambda 中的依赖项问题
Lambda 部署包必须自包含,所有依赖项(库、SDK、二进制文件)都必须包含在 ZIP 中。这会迅速增大包的大小:使用 NumPy、Pandas 和 SciPy 的 Python 数据科学函数,解压后可能超过 200 MB。函数代码的每次更新都要求重新上传整个软件包,包括未更改的库。Lambda 层通过将共享依赖项与函数代码分离来解决这一问题。
什么是 Lambda Layer
Lambda Layer 是一个 ZIP 存档,其中包含库、自定义运行时、数据或配置文件。Layer 与函数代码分开存储,并会挂载到函数的执行环境中的 /opt 目录。多个函数可以共享同一个 Layer——只需更新一次 Layer,所有使用它的函数都能受益。每个 Lambda 函数最多可以使用 5 个 Layer,解压后的总大小必须小于 250 MB。
创建和发布 Layer
要创建 Layer,请按照运行时要求的正确目录结构打包依赖项(例如,Python 使用 python/lib/python3.12/site-packages/),将其压缩为 ZIP,然后发布。发布后,该 Layer 会获得一个 版本 ARN。附加 Layer 到函数时,请引用此 ARN。每次更新 Layer 时都会创建一个新版本;函数会继续使用其配置的版本,直到您明确更新函数。
# Build layer for Python
mkdir -p layer/python
pip install pandas numpy -t layer/python/
cd layer && zip -r ../my-data-layer.zip python/
# Publish the layer
aws lambda publish-layer-version \
--layer-name 'DataScienceLayer' \
--zip-file fileb://my-data-layer.zip \
--compatible-runtimes python3.12 python3.11将 Layer 附加到函数
创建或更新函数时,可以使用 --layers 参数为函数添加 Layer。Lambda 会在函数启动前将所有附加的 Layer 挂载到 /opt。/opt/python 下的 Python 软件包会自动加入 Python 路径;/opt/nodejs/node_modules 下的 Node.js 模块会被自动找到。您的函数代码可以像使用本地安装的软件包一样 import 或 require Layer 中的软件包。
aws lambda update-function-configuration \
--function-name 'DataProcessor' \
--layers \
'arn:aws:lambda:us-east-1:123456789012:layer:DataScienceLayer:3' \
'arn:aws:lambda:us-east-1:123456789012:layer:UtilsLayer:1'AWS 提供的公共 Layer
AWS 会发布官方 Layer,您无需自行构建即可使用。例如,AWS Lambda Powertools Layer(提供结构化日志记录、跟踪和功能开关)、数据库驱动程序 Layer,以及用于在本地缓存 SSM/Secrets Manager 值的 AWS Parameters and Secrets Lambda Extension Layer。Datadog 和 New Relic 等第三方供应商也会为其监控代理发布公共 Layer。请查看无服务器应用程序存储库和 Lambda 控制台,了解可用的公共 Layer。
通过 Layer 使用 Lambda 扩展
Lambda Extensions 会在同一执行环境中与您的函数代码并行作为独立进程运行。它们会接入 Lambda 的生命周期事件(初始化、调用和关闭),以执行遥测数据收集、安全扫描或配置缓存等任务。扩展以 Lambda Layer 的形式分发。AWS 提供 CloudWatch Lambda Insights 扩展和 AWS AppConfig 扩展;供应商则会以扩展形式提供自定义监控代理。
部署软件包格式:ZIP 与容器
Lambda 支持两种部署格式:
- ZIP(压缩后最大 50 MB,解压后最大 250 MB):上传速度快,支持 Layer,并适用于所有运行时。
- 容器镜像(最大 10 GB):存储在 Amazon ECR 中,使用标准 Docker 工具,不支持 Layer,适合依赖项非常大的场景(例如机器学习模型和大型二进制文件)。
容器镜像必须实现 Lambda Runtime Interface(使用 AWS 提供的基础镜像),这样 Lambda 才知道如何调用您的处理程序。
# Dockerfile for a Lambda container image
FROM public.ecr.aws/lambda/python:3.12
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ['app.lambda_handler']容器镜像工作流程
构建和部署 Lambda 容器镜像遵循标准的容器工作流程:使用 docker build 构建镜像,将其推送到 Amazon ECR,并在创建或更新 Lambda 函数时引用镜像 URI。容器镜像是不可变的——每个镜像标签都对应一个特定的函数版本。Lambda 会在其基础设施中缓存容器镜像,因此首次冷启动之后的后续冷启动速度会更快。
# Build and push to ECR
docker build -t my-lambda-function .
aws ecr get-login-password | docker login --username AWS \
--password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
docker tag my-lambda-function \
123456789012.dkr.ecr.us-east-1.amazonaws.com/my-repo:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-repo:latest版本和别名
Lambda Versions 是函数代码和配置的不可变快照。每次发布版本时,Lambda 都会冻结部署软件包、环境变量和 Layer。别名是指向特定版本的命名指针——prod 可以指向版本 5,staging 可以指向版本 6。您还可以使用加权别名,将一定比例的流量路由到新版本,以执行金丝雀部署(例如,将 10% 的流量路由到 v6,将 90% 的流量路由到 v5)。
# Publish a version and create/update an alias
aws lambda publish-version --function-name 'DataProcessor'
# Returns version number, e.g., "Version": "7"
aws lambda update-alias \
--function-name 'DataProcessor' \
--name 'prod' \
--function-version '7' \
--routing-config 'AdditionalVersionWeights={"6": 0.1}'Layer 版本管理和弃用
Layer 同样具有版本。发布新的 Layer 版本后,现有函数会继续使用其固定的版本,直到您更新这些函数。这样,您就可以安全地更新共享 Layer,而不会同时破坏所有函数——可以逐步推出新版本。最终,请弃用旧的 Layer 版本,以减少存储和维护负担。即使您从控制台删除 Layer 版本,Lambda 仍会保留它们,直到没有函数引用这些版本为止。
如何在 Layer 和容器镜像之间选择
当所有依赖项解压后的总大小小于 250 MB、您希望在多个函数之间共享依赖项,并且希望快速迭代(只更新一次 Layer,所有函数都能受益)时,请使用 Layer。当依赖项超过 250 MB、您需要使用自定义基础 OS 软件包、已有 Docker 工作流程,或希望捆绑大型资源(例如机器学习模型和参考数据库)时,请使用容器镜像。容器镜像与 Lambda Layer 不兼容,但提供了更大的灵活性。
快速检查
请测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。
课程回顾
本课介绍了:Lambda Layer 将共享依赖项与函数代码分开打包,从而减小软件包大小,并支持在多个函数之间复用;当依赖项超过 250 MB 的 ZIP 限制,或已经采用 Docker 工作流程时,最大可通过 ECR 使用 10 GB 的容器镜像是更合适的选择;而版本和别名则支持不可变发布,以及通过加权流量拆分实现的金丝雀部署。接下来,我们将学习 Lambda@Edge 和事件驱动模式。
常见问题解答
「Lambda 层与部署包」课时是免费的吗?
是的 — 「Lambda 层与部署包」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「Lambda 层与部署包」这节课中我会学到什么?
将共享依赖打包到可复用的 Lambda 层中,并管理大型运行时所需的部署包。 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Lambda 层与部署包」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。