有没有办法在触发 lambda 之前过滤 AWS DynamoDb Stream?

Is there a way to filter the AWS DynamoDb Stream before triggering lambdas?

所以我们有几个 lambda 监听数据库的变化,在每个 lambda 中我们必须在开始时进行过滤,因为这个特定的 lambda 不关心所有的变化,只关心一个特定的变化。

更明确地说,我们正在应用事件溯源,而 lambda 应该是事件处理程序。我希望 lambda A 仅在将事件 A 插入数据库时​​触发,而不是在插入事件时触发!对于 lambda B 和事件 B 等也是如此。

目前我们在每个 lambda 的开头都有一个过滤器:

lambdaA handler:
const eventsToBeProcessed = events.filter(
   (event) => event.eventName === 'EventA'
);

既然我们有一大堆 lambda,当我只需要触发一个时,触发所有这些 lambda 是没有意义的!

我对 AWS 不是很有经验,但我假设解决方案是:

编辑:

我对我标记为答案的解决方案不是很满意,主要原因是设计中的单点故障,而且它需要依靠 SNS 来做 publish/subscribe 和SNS 不是高度可用的,如果您尝试拥有一个高度可用的系统(4 个 9 左右),它可能会让您失望

我最终采用的解决方案(至少现在)是,当我将我的事件推送到事件存储中时,如果我想触发副作用,我将把它推送到 AWS 的 EventBridge(一个事件有规则的巴士)。 EventBridge 最好的部分是你可以设置你想要的规则,你想要的总线,然后在总线有事件 A 时调用(例如)Lambda A 等等。

我认为让一个 Lambda 函数响应对 DynamoDB 流的添加,将事件分派给相应的下游函数是有意义的。

                                         ------------
                                     -->  Function A
--------     ---------------------       ------------
 Stream  -->  Dispatcher Function                        
--------     ---------------------       ------------
                                     -->  Function B
                                         ------------

现在有办法做到这一点,

https://aws.amazon.com/blogs/compute/filtering-event-sources-for-aws-lambda-functions/

这是lambda的一个新特性,它使用与AWS Eventbdridge相同的语法。

aws lambda create-event-source-mapping \
--function-name fleet-tire-pressure-evaluator \
--batch-size 100 \
--starting-position LATEST \
--event-source-arn YOUR_DB_STREAM_ARN \
--filter-criteria '{"Filters": [{"eventName": ["EventA"]}]}'

You can refer to this documentation to know the exact syntax