我目前正在开发一个基于 AWS 构建的大型系统,使用 Terraform 进行部署,并拥有数百个 lambda。我们最近收到了一项新要求,要求我们在处理所有 lambda 事件之前更新它们。由于有数百个 lambda,这意味着我需要跨多个代码库进行更改,这非常耗时,而且我可能会错过一些。
我想要一种简单且有保证的方法来将代码更改添加到每个 lambda,而不必更改每个代码库。
目前我正在创建一个 AWS Lambda 层,它将有一个函数来执行我的中间件逻辑并随后调用 lambda 处理程序的函数。
然后我可以将入口函数设置为所有 lambda 的 lambda 层的中间件函数。
我可以这样使用 lambda 层吗?我应该这样做吗?为什么?
目前我正在创建一个 AWS Lambda 层,它将有一个函数来执行我的中间件逻辑并随后调用 lambda 处理程序的函数。
然后我可以将入口函数设置为所有 lambda 的 lambda 层的中间件函数。
Lambda 层是一组安装在 Lambda 运行时容器上的
/opt
下的文件。它可以包含库、配置文件以及您可能想要放在那里的任何其他内容,但无法让 lambda 调用此代码而不是 lambda 处理程序。它只是坐在那里。
处理程序本身始终从
$LAMBDA_TASK_ROOT
加载(通常设置为 /var/task
,但是,根据 AWS,这与您无关)。
对从运行时获得的层的唯一特殊处理是运行时特定的路径(
/opt/nodejs
对于节点,opt/python
对于Python等)被添加到运行时的默认库搜索路径。您可以在 lambda 处理程序中执行类似 import * from "something"
之类的操作,它也会在层的文件夹中查找。
当然,您可以更改每个 lambda 的代码,并让它在运行时从层调用中间件作为第一顺序的业务,但我认为这不是您想要的。
如果您可以将 lambda 重新打包为 Docker 镜像,那么事情会变得更容易:您只需
COPY
将您的函数放在 Dockerfile 中的其他位置,然后用您的包装器替换实际的入口点。但是,当然,这也需要对每个 lambda 进行重大更改。