将MailGun webhook推送到AWS SQS

时间:2017-07-06 19:47:03

标签: aws-api-gateway webhooks amazon-sqs mailgun

我需要处理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

3 个答案:

答案 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)

不确定您是否找到了解决方案,但我使用了以下设置。

  1. 设置您的API网关方法以使用"使用Lambda代理集成"
  2. 在你的lambda(我使用node.js)中使用busboy来处理来自mailgun webhook的多部分提交。 (使用这篇文章寻求有关busboy Busboy help
  3. 的帮助
  4. 确保在所有busboy完成后要执行的任何代码都在' finish'中执行。部分业务代码。