7

I created a simple AWS Lambda function to add two numbers using python 3.6. It reads val1 & val2 values in json body. When I tested lambda function in lambda console it works fine. But when I call lambda function by a POST request through AWS API gateway using POSTMAN, it responses with "message": "Internal server error" (502 Bad Gateway). Can anyone help me with this error?

Lambda function

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 body

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

2 Answers 2

13

This error occurs due to the behaviour of the event object (python dictionary). When you test lambda function in lambda console JSON body will directly passed to the event object. But when you try it through API gateway, not only event object is the request payload but also body attribute is set as a string.

For example your JSON body will be like this in event object

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

To resolve this error try json.loads() method to convert body string to 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)
    }
Sign up to request clarification or add additional context in comments.

Comments

1

I ended up here with the same error only I was using Serverless and Node. I was returning an HTTP response without using stringify on the body. As seen in the bad example below:

Bad:

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

Good:

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

I hope this helps others who may run into the 502 error.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.