提问人:Ryan T. 提问时间:10/11/2023 更新时间:10/12/2023 访问量:75
是否可以在执行 Lambda 函数之前将 AWS Lambda 层用作中间件?
Can I use AWS Lambda Layers as a Middleware before my Lambda Function executes?
问:
上下文
我目前正在开发一个基于 AWS 构建的大型系统,该系统使用 Terraform 部署,并拥有数百个 lambda。我们最近收到了一项新要求,要求我们在处理所有 lambda 事件之前对其进行更新。由于有数百个 lambda,这意味着我需要跨多个代码库进行更改,这很耗时,而且我可能会错过一些。
问题
我想要一种简单且有保证的方法,将我的代码更改添加到每个 lambda 中,而无需更改每个代码库。
可能的解决方案
目前,我正在创建一个 AWS Lambda 层,该层将具有一个函数来执行我的中间件逻辑,然后调用 lambda 处理程序的函数。
然后,我可以将入口函数设置为所有 lambda 的 lambda 层的中间件函数。
问题
我可以以这种方式使用 lambda 层吗,我应该这样做,为什么?
答:
目前,我正在创建一个 AWS Lambda 层,该层将具有一个函数来执行我的中间件逻辑,然后调用 lambda 处理程序的函数。
然后,我可以将入口函数设置为所有 lambda 的 lambda 层的中间件函数。
Lambda 层是挂载在 Lambda 运行时容器下的一堆文件。它可以包含库、配置文件以及您可能想要放在那里的任何其他内容,但无法让 lambda 调用此代码而不是 lambda 处理程序。它只是坐在那里。/opt
处理程序本身始终从 (通常设置为 ,而不是说它是每个 AWS 的任何业务)。$LAMBDA_TASK_ROOT
/var/task
对于从运行时获得的层,唯一的特殊处理方式是将特定于运行时的路径(用于节点、Python 等)添加到运行时的默认库搜索路径中。您可以在 lambda 处理程序中执行类似操作,它也会在层的文件夹中查找。/opt/nodejs
/opt/python
import * from "module"
当然,您可以更改每个 lambda 的代码,并让它在运行时从层中调用中间件作为第一顺序,但我认为这不是您想到的。
如果你能将你的lambda重新打包为Docker镜像,那将变得更容易:你可以只将函数放在Dockerfile的其他地方,并用你的包装器替换实际的入口点。但是,当然,它也需要以显着的方式更改每个 lambda。COPY
另一种选择是通过带有转换器的 EventBridge 管道传输事件。它使用 Apache VTL 作为转换模板语言,它不是那么强大,但可以处理基本任务,例如添加类似内容的字段。
EventBridge Pipes 支持几乎任何内容作为事件源,支持 Lambda 作为事件目标,因此将它们用作 SQS、S3、Kinesis 和其他常见事件源的直接替代品应该不难。
评论