【问题标题】:AWS Lambda: 504 error when returning large data setAWS Lambda:返回大型数据集时出现 504 错误
【发布时间】:2015-11-14 17:10:33
【问题描述】:

我有一个 Lambda 函数,它接受多个数组 (~6) 并返回所有可能的组合。

当有几百种可能的组合时,Lambda 是成功的。但是,当有数千种可能性时,我会失败(下面的响应)。

请注意,我正在双向压缩/解压缩 JSON,以使负载尽可能小。

我正在以最大内存 (1536) 和 20 秒超时运行它。

对造成这种情况的原因有什么想法吗?

{
  "state": "rejected",
  "reason": {
    "name": "StatusCodeError",
    "statusCode": 504,
    "message": "504 - [object Object]",
    "error": {
      "message": "Endpoint request timed out"
    },
    "options": {
      "uri": "https://blahblah/prod/getCombinations",
      "method": "POST",
      "timeout": 120000,
      "json": {...
      },
      "simple": true,
      "resolveWithFullResponse": false
    },
    "response": {
      "statusCode": 504,
      "body": {
        "message": "Endpoint request timed out"
      },
      "headers": {
        "content-type": "application/json",
        "content-length": "41",
        "connection": "close",
        "date": "Thu, 20 Aug 2015 20:39:53 GMT",
        "x-amzn-requestid": "965d3b8d-477b-11e5-99d6-4102846d4b1e",
        "x-cache": "Error from cloudfront",
        "via": "1.1 b1103856e287e98f322630821d3c6e5b.cloudfront.net (CloudFront)",
        "x-amz-cf-id": "Dhk7ylTq6RDE74smC8uF8ajms8rpU0fp2dnexn4_I3qIXgvrrsg48w=="
      },
      "request": {
        "uri": {
          "protocol": "https:",
          "slashes": true,
          "auth": null,
          "host": "blahblah",
          "port": 443,
          "hostname": "blahblah",
          "hash": null,
          "search": null,
          "query": null,
          "pathname": "/prod/getCombinations",
          "path": "/prod/getCombinations",
          "href": "https://blahblah"
        },
        "method": "POST",
        "headers": {
          "accept": "application/json",
          "content-type": "application/json",
          "content-length": 10201
        }
      }
    }
  }
}

【问题讨论】:

  • 我刚刚将 my answer 中的初始 CloudFront 论坛参考替换为关于 CloudFront 504 行为的更具体的文档参考。
  • 冒着问清楚的风险,当您直接向 API Gateway(我假设 lambda 函数是如何启动的)而不是通过 CloudFront 发出请求时会发生什么?这看起来并不完全像我希望看到的那样,如果您正在点击 Cloudfront 内置的 30 秒请求超时计时器,而是您的函数根本无法在您提供的 20 秒超时内完成工作,并且 API Gateway 正在返回 504,Cloudfront 正确地返回给您...但是您需要从等式中删除 Cloudfront 并验证这一点。
  • 你是对的 - 当我使用 Lambda 控制台发送相同的测试数据时,程序成功。但是,从 Fiddler(或我的节点应用程序)发送帖子会导致上述行为。

标签: amazon-web-services amazon-cloudfront endpoint aws-lambda


【解决方案1】:

您可以从字面上阅读Amazon CloudFront 504 响应“端点请求超时”,即504 Gateway Timeout 通常表示服务器正在充当网关或代理,并且没有收到来自上游的及时响应服务器。

CloudFront 符合此标准,如 Customizing Error Responses 中所述,例如:

服务器错误表示源服务器存在问题。例如,HTTP 服务器正忙或不可用。当发生服务器错误时,您的源服务器将 500 范围内的 HTTP 状态代码返回给 CloudFront,或者 CloudFront 在一段时间内没有从您的源服务器获得响应并假定为 504 状态代码(网关超时)。 [强调我的]

感谢迈克尔 pointed out,CloudFront 自己的 request timeout for custom origins 是 30 秒:

DELETE、OPTIONS、PATCH、POST 和 POST 请求 – 如果源在 30 秒内没有响应,CloudFront 会断开连接并且不会再次尝试联系源。如有必要,客户端可以重新提交请求。

鉴于您的 AWS Lambda 函数的超时时间较短,为 20 秒,我怀疑您的数据集太大而无法在 20 秒内通过 POST 请求(可能是通过 Amazon API Gateway?!)传输和处理。

  • 如果您的数据集大于 1.5GB 的 Lambda 函数,执行持续时间为 20 秒,您需要将数据分割成更小的块,或者将计算从 Lambda 迁移到更具可扩展性的东西上 - 碰巧的是 AWS Compute博客只是提供了一个很好的示例如何促进Amazon ECS 对于此类运行时间较长的任务,请参阅 Chris Barclay 的 Better Together: Amazon ECS and AWS Lambda

【讨论】:

  • 我不认为这个错误是由 Cloudfront 引起的。在我看来,源服务器正在生成错误,而 Cloudfront 只是返回它收到的内容。 x-cache: error from cloudfront 并不一定意味着 Cloudfront 抛出错误,无论请求如何,源自 Cloudfront 的 504 都应该有 Content-Type: text/html。 FWIW,Cloudfront 的 504 计时器被硬编码为 30 秒,当计时器触发时,Cloudfront 会返回两次原点。
  • 啊,不知道 CloudFront 的硬编码 30 秒 request timeout for custom origins,感谢您提供此信息(请注意,另外两次尝试仅适用于 GET/HEAD 而不是 @ 987654335@ 在手边) - 因此,我删除了延长 Lambda 执行超时的不良建议。还不确定您的Content-Type 更改评估,那里没有说明 - 您碰巧有这方面的参考吗?
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2019-02-07
  • 2017-04-26
  • 2018-11-28
相关资源
最近更新 更多