AWS Lambda:返回大数据集时出现504错误

use*_*896 5 endpoint amazon-web-services amazon-cloudfront aws-lambda

我有一个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
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*pel 5

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

CloudFront 符合此标准,如自定义错误响应中所述,例如:

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

正如迈克尔谢天谢地指出的那样,CloudFront 自己的自定义源请求超时为30 秒:

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

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

  • 如果您的数据集大于 20 秒执行持续时间可以处理的 1.5GB Lambda 函数,您将需要将您的数据切成更小的块,或者将您的计算从 Lambda 迁移到更具可扩展性的东西上 - 偶然地,AWS 计算博客仅提供功能有关如何促进Amazon ECS 执行此类更长时间运行任务的不错示例,请参阅 Chris Barclay 的Better Together:Amazon ECS 和 AWS Lambda

  • 我不认为这个错误是由 Cloudfront 引起的。在我看来,源服务器正在生成错误,而 Cloudfront 只是返回它接收到的内容。`x-cache: error from cloudfront` 并不一定意味着 Cloudfront 抛出了错误,无论请求如何,源自 Cloudfront 的 504 都应该有一个 `Content-Type: text/html`。FWIW,Cloudfront 的 504 计时器被硬编码为 30 秒,当该计时器触发时,Cloudfront 返回了两次原点。 (2认同)