【发布时间】:2017-12-10 23:28:09
【问题描述】:
我需要处理 MailGun webhook。我确实直接在我们的 Web 服务器上实施了一个解决方案来处理 Webhook,但是 MailGun 从一个大型活动中产生了如此多的调用,以至于它实际上变成了 DOS 攻击。
我一直在研究的一个解决方案是将 AWS API Gateway 用于 Lambda 函数,然后推送到 SQS 队列。然后我们可以以我们可以管理的速率轮询队列。不幸的是,我们无法让它工作,因为 AWS API Gateway 不支持 multipart/form-data 内容类型(其中一些 webhook 是)。这意味着我们的 SQS 消息的格式/结构不佳。我们能做的最好的事情是使用映射模板中的 $util.escapeJavaScript($input.body) 函数来创建一个 SQS 消息,其中包含有效不可解析的 webhook 内容的原始字符串(带有转义的 javascript 字符),即我们可以不要从中获取数据。
我尝试过使用 Zapier 处理 webhook 并直接推送到 SQS 队列。这可以有效地解析各种内容类型并为我们创建结构良好的消息,但服务成本不可行。
有没有人用另一种方式解决过这个问题?是否有 API Gateway 无法正确解析内容的解决方案?我故意远离 MailGuns 事件轮询 API,因为它在轮询数据可以被“信任”(根据 MailGun)之前存在显着延迟。
基本上,还有另一种方法可以从内容类型 multipart/form-data 和 application/x-www-form-urlencoded 到队列中获取经过良好解析的消息吗?
任何想法都将不胜感激!
添加,此链接突出显示 APS 网关和 multipart\form-data 内容的问题: API Gateway - Post multipart\form-data
【问题讨论】:
-
好的,想想这个,我们可以使用 $util.base64Encode($input.body) 来创建原始 webhook 消息的 64 位表示。这可以在没有转义字符的情况下存储在队列中,并在我们拿起它时进行解码。我的问题是我们如何以与 Web 服务器相同的方式解析它以获取内容?一种想法是将其发送到我们的网络服务器并让它像任何其他请求一样解析 - 问题是,我们如何将其作为原始请求发送?或者也许有办法直接在 PHP 中解析它?
标签: aws-api-gateway webhooks amazon-sqs mailgun