4
votes

I have uploaded an AWS Lambda function where the lambda_handler looks as follows:

import json
def lambda_handler(event, context):

    print(event)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!'),
        'event': event
    }

Problem 1: returning event

When I test it using the Lambda Management Console I can create a test event with parameters which also return the exact same format and all works fine:

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

However, when I use Postman, then I get something totally else, which returns to me:

{
    "message": "Internal server error"
}

I suspect its because the event looks something more like:

{'resource': '/hello', 'path': '/hello', 'httpMethod': 'GET', 'headers': {'Accept': '*/*', ... etc

Problem 2: adding json parameters in body creates an error

When I try in Postman to add in the body > raw > JSON(application/JSON) the keys above, then I get the error:

ERROR: The request could not be satisfied

Questions

I have two questions:

  • How do I pass parameters in the body and be able to capture it in AWS lambda using the event or context?
  • How do I return the event properly?
2
Are you passing the header with Content-Type:application/json?amanb
In body I specify that right?JohnAndrews
Not in the body, but as a header. Test this on Postman first. Also, you must be using an API link for this?amanb
The API link may require some sort of authentication as well. Please share the status code that you get on Postman. For internal server error, its most likely 500.amanb
When you are sending information in the body, you should do a POST request. If you are trying to do a GET request, the body has no significance. This link maybe helpful docs.aws.amazon.com/apigateway/latest/developerguide/…amanb

2 Answers

6
votes

Assuming you have set up your Lambda as proxy integration in AWS API Gateway. If you want to attach query string params and no body then your method type should be GET.

The event you would receive in your Lambda for request /GET your-path/?myKey1=value1&myKey2=value2 should something like:

{
    "resource": "",
    "path": "/your-path",
    "httpMethod": "GET",
    "headers": {
    },
    "queryStringParameters": {
      "myKey1": "value1",
      "myKey2": "value2"
    },
    "pathParameters": {
    },        
    "body": "{}"
  }

You can access query string params in queryStringParameters property.

If you send request using Postman and attach body then your Lambda integration type should be POST/PUT. Data that you add in Postman request body would be available in event["body"].

Last thing if you test Lambda directly in the console then event will be received as you put in the body. You will need to format your event according to the integration method type. If it is POST/PUT then:

{
 "body": {
   "someValue": {..}
 }
}

If it is GET then:

{
 "queryStringParameters": {
    "myKey1": "value1",
    "myKey2": "value2"
  }
}
2
votes

Figrued it out, after help from @Althar Khan.

Apparently the API Gateway of AWS Lambda only accepts certain properties:

...
return {
    "statusCode": 200,
    "headers": {
        "my_header": "my_value"
    },
    "body": JSON.stringify(responseBody),
    "isBase64Encoded": false
};

In this response, there are four fields: statusCode, headers, body, and isBase64Encoded.

In this example, the function's response is in the format that the API Gateway expects. For additional information, see Output Format of a Lambda Function for Proxy Integration.