Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send a request with a body to AWS Lambda

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?
like image 585
JohnAndrews Avatar asked Dec 24 '22 01:12

JohnAndrews


2 Answers

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"
  }
}
like image 90
A.Khan Avatar answered Dec 25 '22 14:12

A.Khan


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.

like image 24
JohnAndrews Avatar answered Dec 25 '22 15:12

JohnAndrews