【问题标题】:AWS Lambda-API gateway "message": "Internal server error" (502 Bad Gateway)AWS Lambda-API 网关“消息”:“内部服务器错误”(502 Bad Gateway)
【发布时间】:2019-12-10 18:45:38
【问题描述】:

我创建了一个简单的 AWS Lambda 函数来使用 python 3.6 添加两个数字。它读取 json 正文中的 val1val2 值。当我在 lambda 控制台中测试 lambda 函数时,它工作正常。但是,当我使用 POSTMAN 通过 AWS API 网关通过 POST 请求调用 lambda 函数时,它会响应“消息”:“内部服务器错误”(502 Bad Gateway)。谁能帮我解决这个错误?

Lambda 函数

import json
def lambda_handler(event, context):
    # TODO implement
    val1 = int(event['val1'])
    val2 = int(event['val2'])
    val3 = val1 + val2
    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(val3)
    }

JSON 正文

{
    "val1": "3",
    "val2": "5"
}

【问题讨论】:

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


    【解决方案1】:

    我在使用 Serverless 和 Node.js 时遇到了同样的错误。 我没有在正文上使用 stringify 就返回了 HTTP 响应。如下面的坏例子所示:

    不好:

    return {
                statusCode,
                body: body.message,
                headers: {
                    "Access-Control-Allow-Origin": "*",
                    "Access-Control-Allow-Credentials": true,
                },
            };
        };
    }
    

    好:

    return {
                statusCode,
                body: JSON.stringify(body.message),
                headers: {
                    "Access-Control-Allow-Origin": "*",
                    "Access-Control-Allow-Credentials": true,
                },
            };
        };
    }
    

    我希望这对可能遇到 502 错误的其他人有所帮助。

    【讨论】:

      【解决方案2】:

      由于事件对象(python 字典)的行为而发生此错误。当您在 lambda 控制台中测试 lambda 函数时,JSON 正文将直接传递给事件对象。但是当您通过 API 网关尝试时,不仅事件对象是请求负载,而且 body 属性也设置为字符串。

      例如,您的 JSON 正文在事件对象中将是这样的

      body: "{\n    \"val1\": \"3\",\n    \"val2\": \"5\"\n}"
      

      要解决此错误,请尝试使用 json.loads() 方法将正文字符串转换为 json。

      import json
      def lambda_handler(event, context):
          # TODO implement
          try:
              event = json.loads(event['body'])
              val1 = int(event['val1'])
              val2 = int(event['val2'])
              val3 = val1 + val2
          except:
              val3 = 'request error'
          return {
              'statusCode': 200,
              'headers': {'Content-Type': 'application/json'},
              'body': json.dumps(val3)
          }
      

      【讨论】:

      • 谢谢,这对我有用
      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 2019-12-21
      • 1970-01-01
      • 2020-04-02
      • 2017-01-06
      • 2023-02-16
      • 2020-10-16
      • 2017-08-08
      相关资源
      最近更新 更多