AWS Lambda 随机返回 502 作为状态

Posted

技术标签:

【中文标题】AWS Lambda 随机返回 502 作为状态【英文标题】:AWS Lambda randomly gives back 502 as status 【发布时间】:2018-09-23 10:42:40 【问题描述】:

我有一个 lambda 函数,它利用 Graphql 和 webscraping 来返回一些数据作为响应。有时它可以正常工作而不会出现 502 之类的错误,有时则不会。对我来说,502 错误看起来完全是随机的,因为我一直发送相同的请求和相同的数据。

我在 AWS 控制台中的超时设置为 5 分钟。

这些是我得到的错误(在浏览器中):

无法加载 [BIG URL] 没有“Access-Control-Allow-Origin”标头 出现在请求的资源上。因此,来源 '[mydomainurl]' 是 不允许访问。响应的 HTTP 状态代码为 502。

spread.js:25 获取 【大网址】502()

但是,当我转到 Chrome 中的“网络”选项卡并在浏览器中查看复制的链接地址时,我会收到带有所需数据的 JSON 响应。我在 CloudWatch 中找不到错误。

标题

响应标头

content-length: 36
content-type: application/json
date: Fri, 13 Apr 2018 06:17:06 GMT
status: 502
via: 1.1 67284fcf464f6f1529cc1e521669622c.cloudfront.net (CloudFront)
x-amz-apigw-id: FRC2oEiuDoEF_YQ=
x-amz-cf-id: O1VfzIVPySw657r6WV34EvcPMTyeT7eFUBnM3P30NXBmdjTeWHfryw==
x-amzn-requestid: 4766f279-3ee2-11e8-9e72-bdddab0f02d6
x-cache: Error from cloudfront

请求标头

:authority: wqbgu8c3ql.execute-api.eu-west-1.amazonaws.com
:method: GET
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7
origin: [url]
referer: [url]
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/65.0.3325.181 Safari/537.36

回应: "message": "内部服务器错误"

我的 handler.js

'use strict'

const 
  graphql,
  GraphQLSchema,
  GraphQLObjectType,
  GraphQLString,
  GraphQLNonNull
 = require('graphql')

const schema = require('./schema/schema');


module.exports.query = (event, context, callback) => graphql(schema, event.queryStringParameters.query)
.then(
  result => callback(null, 
    statusCode: 200,
    headers: 
      "Access-Control-Allow-Origin" : "*"
    ,
    body: JSON.stringify(result)
  ),
  err => callback(err)
)

也许我在回调中返回错误的方式有问题?

【问题讨论】:

您可以打开 API Gateway 日志记录,您将在 CloudWatch 中看到更多信息。 谢谢,我去看看 API Gateway 日志记录 另请注意,作为参考,在您的情况下,No 'Access-Control-Allow-Origin' header is present on the requested resource... 只是错误的症状,而不是原因。您不想以此为基础进行故障排除,这不会在 API Gateway 日志中找到。 还要注意,如果您在 Lambda 代码中点击 err => callback(err),这不会将错误返回给请求者,至少默认情况下不会——它会抛出 502 ,这就是您所看到的。 查看此答案:***.com/a/43578149/80434 > Lambda 函数的最长执行时间限制为 5 分钟。实际限制是在创建 Lambda 函数时配置的。限制已经到位,因为 Lambda 函数旨在小而快,而不是大型应用程序。您的错误消息显示任务在 15.00 秒后超时。这意味着一旦任务达到 15 秒的运行时间,AWS 就会故意停止该任务。它与函数当时正在做什么无关,也与正在处理的文件无关。 【参考方案1】:

对于 Python,请使用以下

def returnresponse(status_code, message):
    myjson = 
    myjson['statusCode']=status_code
    myjson['body']=json.dumps(message)
    myjson['headers']=
    myjson['headers']['Access-Control-Allow-Origin']="*"
    myjson['headers']['Content-Type']="application/json"
    return myjson

您可以从上面删除 Content-Type 标头。 在您的 lambda 类型的末尾:

return returnresponse(200, "hello world")

还要检查您进行 API 调用的代码。就我而言,我使用了 javascript。如果您使用的是 javascript,请删除“数据类型:json”,除非您在正文中返回 json 数据。

【讨论】:

以上是关于AWS Lambda 随机返回 502 作为状态的主要内容,如果未能解决你的问题,请参考以下文章

将 Lambda 运行时从 Node 8.x 更改为 Node 12.x 后,从 AWS API Gateway 随机获得 502 Bad Gateway 响应

不可预测的 Cloudfront 502 错误

AWS Lambda-API 网关“消息”:“内部服务器错误”(502 Bad Gateway)

如何从 AWS Lambda 返回 1*1 像素作为响应? [复制]

AWS Lambda 和 RDS 之间的间歇性超时

在 AWS 上部署的 NodeJs 上的 Post 函数返回错误:502