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

时间:2019-08-02 06:59:59

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

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

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"
}

2 个答案:

答案 0 :(得分:3)

由于事件对象(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)
    }

答案 1 :(得分:0)

我最终遇到了同样的错误,只是我使用的是 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 错误的人。