【问题标题】:Pushing MailGun webhook onto AWS SQS将 MailGun webhook 推送到 AWS SQS
【发布时间】: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


【解决方案1】:

正如您所提到的,您可以在 api 网关中进行 base64 编码并在 lambda 函数中调用 base64decode 来检索原始有效负载(每种语言都有标准库)。

另外,请注意,您可以将多部分表单数据用于非文件主体。 Get non file body from multipart/form-data using AWS API Gateway and Lambda

【讨论】:

  • 谢谢,试过了。我们在解析解码后的 base64 字符串时失败了。如果不编写我们自己的解析器,我无论如何都无法从中获取 key : value 参数。有什么想法吗?
  • 您是否尝试过使用像docs.python.org/2/library/base64.html 这样的标准库,然后解析输出?
  • 我们从 base64 解码没有问题,问题在于解析结果。不确定您是否曾经查看过 multipart/form-data 和 application/x-www-form-urlencoded 的“原始”数据?它非常非结构化,可能需要花几天时间查看规范才能获得基本的解析解决方案。也许我不理解你?你知道解析这个的“开箱即用”方法吗?
【解决方案2】:

我在构建 Suet 时遇到了同样的挑战。我最终切换到了我真正推荐的 Google Cloud 功能。不要在 Amazon API Gateway 上浪费时间。使用 Google Cloud Functions 并使用像 multer 这样的中间件。 (可以查看 Suet 的 webhook 处理程序的来源here)。

【讨论】:

    【解决方案3】:

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

    1. 设置您的 API Gateway 方法以使用“使用 Lambda 代理集成”
    2. 在您的 lambda(我使用 node.js)中,使用 busboy 处理来自 mailgun webhook 的多部分提交。 (使用此帖子向 busboy Busboy help 寻求帮助)
    3. 确保在所有 busboy 完成后要执行的任何代码都在 busboy 代码的“完成”部分执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 2015-11-13
      • 2017-07-18
      • 2017-01-10
      • 2018-10-11
      • 2022-10-17
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多