我可以触发 Lambda 函数或 SNS 事件来响应 AppSync GraphQL 突变吗?

Posted

技术标签:

【中文标题】我可以触发 Lambda 函数或 SNS 事件来响应 AppSync GraphQL 突变吗?【英文标题】:Can I trigger a Lambda function or SNS event in response to an AppSync GraphQL Mutation? 【发布时间】:2019-11-11 17:12:59 【问题描述】:

AWS AppSync/GraphQL 订阅与 AWS Amplify 相结合听起来很棒,因为您可以开箱即用地为您的所有客户端订阅架构中指定的高级域事件。

虽然这似乎是一种自然的扩展,但应该有一种方法可以将所有这些事件广播到 lambda 或 SNS 等服务,以在内部对这些事件做出反应。也许您想记录事件、重新索引或汇总更新的数据,或者向用户发送电子邮件或推送通知。就像 DynamoDB Streams 允许您触发 lambda 以更新表一样。有人知道实现这一目标的好方法吗?

似乎没有用于 lambda 的 AppSync 触发器源,但似乎有几种方法可以做到这一点:

    在 ECS/Fargate 上创建一个长期运行的进程/服务,订阅它想要广播到 SNS/Lambda 的每个突变。不理想,因为您必须自己管理和扩展该流程。

    使用 DynamoDB Streams 作为 lambda 触发器。但是,DynamoDB 表更改事件的级别低于 GraphQL 突变事件,这假设您的唯一数据源是 DynamoDB,而 AppSync/GraphQL 可以插入许多其他数据源。

    为每个突变创建 lambda 解析器,并将事件广播到 SNS/Lambda。对于简单地广播 SNS 事件,也许有一种聪明的方法可以使用管道解析器将可重用的解析器附加到每个突变...

我不确定 Amplify 框架如何为他们的 @searchable 转换器提供支持,无论是 #2 还是 #3 或其他什么,但似乎这是在同一个范围内(重新索引 Elasticsearch 中的数据作为响应更新)。我确实记得听说你可以编写自己的变形金刚……也许可以编写自己的变形金刚@broadcasted,它还可以将所有突变事件广播到 SNS ????

我很惊讶我没有看到很多关于这个话题的讨论。如果有人有一些好的想法,或者我的想法有误,请告诉我。

【问题讨论】:

你看过管道解析器吗? docs.aws.amazon.com/appsync/latest/devguide/… 【参考方案1】:

听起来您正试图根据传入的突变触发 lambda 函数。

就像您在选项 3 中提到的 - lambda 解析器可以实现此功能,但如果您想要调用一个发布到 SNS 作为执行步骤的通用 lambda - 那么您可以使用管道解析器。其中“通用”lambda 函数将成为管道中步骤的数据源,然后拥有您将用于 Dynamo/ES/Aurora Serverless 的常规解析器。

文档: https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html

【讨论】:

感谢@Ashwin 的指点!我想我对围绕“类型”和“字段”的语言有点困惑。我一直在解析“字段”的上下文中听到管道解析器,我认为这意味着仅在查询期间解析类型的字段。在您链接的文档中,有一个很好的示例表明名为 signUp 的突变也是突变“类型”上的“字段”。一切实际上只是一个类型或字段。因此,完全支持设置一个可重用的管道解析器,将突变事件广播到 SNS,甚至直接调用 lambda。

以上是关于我可以触发 Lambda 函数或 SNS 事件来响应 AppSync GraphQL 突变吗?的主要内容,如果未能解决你的问题,请参考以下文章

AWS SNS子脚本与lambda函数的触发器?

从 SNS 触发 Step Function

设置SNS主题以在另一个之后触发Lambda Function一条消息

Terraform:通知 SNS 的 CloudWatch 事件

使用云形成从 SNS 触发 lambda?

从本地机器发布 SNS 消息并测试 Lambda