返回大型数据集时,AWS Lambda:504错误

时间:2015-08-20 21:31:37

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

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

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

请注意,我正在两个方向压缩/解压缩JSON,以使有效负载尽可能小。

我使用max memory(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
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:3)

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

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

  

服务器错误表示原始服务器出现问题。例如,HTTP服务器忙或不可用。发生服务器错误时,您的原始服务器会将500范围内的HTTP状态代码返回到CloudFront,或者 CloudFront在一段时间内不会从您的原始服务器获得响应,并假定504状态代码< / strong>(网关超时)。 [强调我的]

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

  

DELETE,OPTIONS,PATCH,POST和POST请求 - 如果原点在30秒内没有响应,CloudFront将断开连接,不再尝试联系原点。如有必要,客户可以重新提交请求。

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

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