【问题标题】:AWS API Gateway error response generates 502 "Bad Gateway"AWS API Gateway 错误响应生成 502“Bad Gateway”
【发布时间】:2017-08-08 10:42:07
【问题描述】:

我有一个带有 LAMBDA_PROXY 集成请求类型的 API 网关。在 Lambda 中调用 context.succeed 后,响应标头将按预期发送回代码 302(如下所示)。但是,我想处理500404 错误,到目前为止我唯一确定的是,当我收到502 Bad Gateway 时,我错误地返回了错误。我的context.fail 有什么问题?

这是我的 handler.js

const handler = (event, context) => { 
    //event consists of hard coded values right now
    getUrl(event.queryStringParameters)
    .then((result) => {
        const parsed = JSON.parse(result);
        let url;
        //handle error message returned in response
        if (parsed.error) {
            let error = {
                statusCode: 404,
                body: new Error(parsed.error)
            }
            return context.fail(error);
        } else {
            url = parsed.source || parsed.picture;
            return context.succeed({
                statusCode: 302,
                headers: {
                  Location : url
                }
              });
        }
    });
};

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    如果您在 Lambda 函数(或 context.fail)中抛出异常,API Gateway 会读取它,就好像您的后端出现问题并返回 502。如果这是您预期的运行时异常并希望返回 500 /404,使用 context.succeed 方法和你想要的状态码和消息:

    if (parsed.error) {
      let error = {
        statusCode: 404,
        headers: { "Content-Type": "text/plain" } // not sure here
        body: new Error(parsed.error)
    }
    return context.succeed(error);
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,就我而言,问题是我的函数在context.done() 中没有返回任何内容。所以我不是context.done(null),而是context.done(null, {});

      【讨论】:

        【解决方案3】:

        我从多个方面得到了 502。以下是我目前所了解的。

        答案 1:

        claudia generate-serverless-express-proxy --express-module {src/server?} 如果您不使用 claudia and express,则此答案对您无济于事。

        答案 2:

        Lambda 函数->基本设置->超时。将其增加到合理的程度。默认为 3 秒。但是第一次构建它通常需要更长的时间。

        【讨论】:

        • 非常感谢@Michael,默认情况下我的 lambda 配置为 6 秒超时。增加超时解决 de 502 响应
        【解决方案4】:

        我遇到了这样的问题,我在正文中将 JSON 作为 JavaScript 对象返回,但您应该将它作为字符串返回。我所要做的就是在返回之前执行JSON.stringify(dataobject) 将 JSON 转换为字符串。

        https://aws.amazon.com/premiumsupport/knowledge-center/malformed-502-api-gateway/

        【讨论】:

          猜你喜欢
          • 2019-08-24
          • 2017-09-09
          • 2018-04-23
          • 2019-09-15
          • 2021-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多