我可以在 Lambda 函数执行之前使用 AWS Lambda Layers 作为中间件吗?

问题描述 投票:0回答:1

背景

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

问题

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

可能的解决方案

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

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

问题

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

amazon-web-services aws-lambda middleware aws-lambda-layers
1个回答
0
投票

目前我正在创建一个 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 进行重大更改。

© www.soinside.com 2019 - 2024. All rights reserved.