我需要处理MailGun webhooks。我确实直接在我们的Web服务器上实现了一个解决方案来处理webhook,但是MailGun从一个大型活动中生成了很多调用它实际上是一个DOS攻击。
我一直在研究的一个解决方案是将AWS API网关用于Lambda函数,然后推送到SQS队列。然后我们可以按照我们可以管理的速率轮询队列。遗憾的是,由于AWS API Gateway不支持多部分/表单数据内容类型(某些webhook是这样),我们无法使其工作。这意味着我们的SQS消息没有很好的格式化/结构化。我们可以做的最好的事情是使用映射模板中的$ util.escapeJavaScript($ input.body)函数来创建一个SQS消息,其中包含webhook内容的原始字符串(带有转义的javascript字符),这些字符串实际上是不可解析的,即我们可以不能从中获取数据。
我已经开始使用Zapier处理webhook并直接推送到SQS队列。这可以有效地解析各种内容类型,并为我们创建一个结构良好的消息,但服务的成本是不可行的。
有人以另一种方式解决了这个问题吗?是否有API网关无法正确解析内容的解决方案?我故意远离MailGuns事件轮询API,因为在轮询数据可以“信任”之前它会导致严重的延迟(根据MailGun)。
基本上,有没有另一种方法可以从内容类型multipart / form-data和application / x-www-form-urlencoded到队列中获取一个解析得很好的消息?
任何想法都会非常感激!
要添加,此链接会突出显示APS Gateway和multipart \ form-data内容的问题: API Gateway - Post multipart\form-data
答案 0 :(得分:1)
正如您所提到的,您可以在api网关中进行base64编码,并在lambda函数中调用base64decode来检索原始有效负载(每种语言都有标准库)。
另外,请注意,您可以对非文件正文使用多部分表单数据。 Get non file body from multipart/form-data using AWS API Gateway and Lambda
答案 1 :(得分:1)
构建Suet时遇到了同样的挑战。我最终切换到我真正推荐的Google Cloud功能。不要在Amazon API Gateway上浪费时间。使用Google Cloud Functions并使用multer等中间件。 (你可以看到Suet的webhook处理程序here的来源)。
答案 2 :(得分:0)
不确定您是否找到了解决方案,但我使用了以下设置。