【问题标题】:Is there a way to filter the AWS DynamoDb Stream before triggering lambdas?有没有办法在触发 lambda 之前过滤 AWS DynamoDb 流?
【发布时间】:2021-12-02 05:28:29
【问题描述】:

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

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

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

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

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

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

  • 能够过滤 DynamoDb 触发器
  • 不是让 lambdas 由 dynamodb 触发,而是在其间有一个 AWS 服务,每次更改都会触发它,它会根据更新内容知道要触发哪个 lambdas

编辑:

我对我标记为答案的解决方案不是很满意,主要原因是设计中的单点故障,而且它需要依靠 SNS 来进行发布/订阅,并且 SNS 不高如果您尝试拥有高可用性系统(4 个 9 左右),它可能会失败

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

【问题讨论】:

  • 你不能这样做。而是将所有内容流式传输到单个 lambda,然后 lambda 会将事件分发到不同的 lambda 函数。可以使用 sns/sqs 将第一个 lambda 与其他 lambda 解耦。
  • @Marcin 是的,这是我的预期,这就是我在第二个解决方案中的意思,不确定它应该是单个 lambda 还是其他 AWS 服务
  • 遗憾的是,这是唯一的选择。您可以考虑是直接从第一个 lambdas 调用其他 lambdas,还是在其他 lambdas 处理它们之前将 db 事件放入 sqs 或 sns。
  • 您可以使用 aws api 调用其他 lambda。如果您的函数在 python 中,您将使用 boto3 的 invoke 方法。您可以异步调用它们(即调用而不等待任何返回值)。无需 api 网关即可工作。您只需向第一个 lambda 的执行角色添加权限,就可以调用其他函数。
  • 我主要使用 ts 但是我很确定有一个类似的 boto3 。是的,我显然不想为此使用 api 网关!感谢您的帮助:D

标签: amazon-web-services aws-lambda amazon-dynamodb event-sourcing


【解决方案1】:

现在有办法做到这一点,

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

【讨论】:

  • 太棒了!谢谢你的更新,我会看看我是否可以真正更新我们的解决方案,因为这更强大和更容易(更简单)
【解决方案2】:

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

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

【讨论】:

  • 如果我要实现这样的东西,我怎样才能避免让调度程序功能出现单点故障的风险?因为在这种情况下,我的所有 lambdas 都将由调度程序/调用程序触发
  • 更明确地说,调度程序函数最有可能需要一个 SNS 主题,而其他函数将按主题订阅,这样所有内容都将被过滤。 AWS 确保他们的 lambdas 具有高可用性,但不确定 SNS 是否相同(我的 AWS 经验还是有点有限)
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2021-10-04
相关资源
最近更新 更多