是否可以在执行 Lambda 函数之前将 AWS Lambda 层用作中间件?

Can I use AWS Lambda Layers as a Middleware before my Lambda Function executes?

提问人:Ryan T. 提问时间:10/11/2023 更新时间:10/12/2023 访问量:75

问:

上下文

我目前正在开发一个基于 AWS 构建的大型系统,该系统使用 Terraform 部署,并拥有数百个 lambda。我们最近收到了一项新要求,要求我们在处理所有 lambda 事件之前对其进行更新。由于有数百个 lambda,这意味着我需要跨多个代码库进行更改,这很耗时,而且我可能会错过一些。

问题

我想要一种简单且有保证的方法,将我的代码更改添加到每个 lambda 中,而无需更改每个代码库。

可能的解决方案

目前,我正在创建一个 AWS Lambda 层,该层将具有一个函数来执行我的中间件逻辑,然后调用 lambda 处理程序的函数。

然后,我可以将入口函数设置为所有 lambda 的 lambda 层的中间件函数。

问题

我可以以这种方式使用 lambda 层吗,我应该这样做,为什么?

amazon-web-services 中间件 aws-lambda-layers

评论

1赞 Paolo 10/11/2023
所以从本质上讲,你想把公共逻辑移到一个层上吗?这应该完全没问题

答:

2赞 Quassnoi 10/12/2023 #1

目前,我正在创建一个 AWS Lambda 层,该层将具有一个函数来执行我的中间件逻辑,然后调用 lambda 处理程序的函数。

然后,我可以将入口函数设置为所有 lambda 的 lambda 层的中间件函数。

Lambda 层是挂载在 Lambda 运行时容器下的一堆文件。它可以包含库、配置文件以及您可能想要放在那里的任何其他内容,但无法让 lambda 调用此代码而不是 lambda 处理程序。它只是坐在那里。/opt

处理程序本身始终从 (通常设置为 ,而不是说它是每个 AWS 的任何业务)。$LAMBDA_TASK_ROOT/var/task

对于从运行时获得的层,唯一的特殊处理方式是将特定于运行时的路径(用于节点、Python 等)添加到运行时的默认库搜索路径中。您可以在 lambda 处理程序中执行类似操作,它也会在层的文件夹中查找。/opt/nodejs/opt/pythonimport * from "module"

当然,您可以更改每个 lambda 的代码,并让它在运行时从层中调用中间件作为第一顺序,但我认为这不是您想到的。

如果你能将你的lambda重新打包为Docker镜像,那将变得更容易:你可以只将函数放在Dockerfile的其他地方,并用你的包装器替换实际的入口点。但是,当然,它也需要以显着的方式更改每个 lambda。COPY

另一种选择是通过带有转换器的 EventBridge 管道传输事件。它使用 Apache VTL 作为转换模板语言,它不是那么强大,但可以处理基本任务,例如添加类似内容的字段。

EventBridge Pipes 支持几乎任何内容作为事件源,支持 Lambda 作为事件目标,因此将它们用作 SQS、S3、Kinesis 和其他常见事件源的直接替代品应该不难。

评论

0赞 Ryan T. 10/12/2023
谢谢你的回答!有点沮丧,我不能指出 lambda 层代码,但您分享的其他选项似乎值得探索!