user3872094
user3872094

Reputation: 3351

Combine two lambda functions

I'm writing a code that will connect API Gateway and DynamoDB. and they are as below.

Put Data

var body = JSON.parse(event.body);
    console.log(body.phone)
    var table = "userAddresses";
    var params = {
        TableName: table,
        Item: {
            "phone": body.phone,
            "apartmentNumber": body.apartmentNumber,
            "buildingNumber": body.buildingNumber,
            "state": body.state,
            "zip": body.zip
        }
    }

    docClient.put(params, function (err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
            var res = {
                "statusCode": 200,
                "headers": {},
                "body": JSON.stringify(data)
            };
            context.succeed(res);
        }
    });

Get Data

var body = JSON.parse(event.body);
    console.log(body.phone)
    var table = "userAddresses";
    var params = {
        TableName: table,
        Item: {
            "phone": body.phone
        }
    }
    docClient.get(params, function (err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
            var res = {
                "statusCode": 200,
                "headers": {},
                "body": JSON.stringify(data)
            };
            context.succeed(res);
        }
    });

And in my API Gateway I've created resources and methods, and pointed them to corresponding functions, but now I'm thinking to create a common lambda function with 2 methods like function putData() and function getData() and point them to appropriate methods instead of pointing to different Lambda functions. I tried to get the HTTP method by following https://kennbrodhagen.net/2015/12/02/how-to-access-http-headers-using-aws-api-gateway-and-lambda/ and then write as if(method==="GET"){...} else {...}, but unfortunately, I was unable to get the method name itself.

Please help me on how can I do this.

Thanks

Upvotes: 0

Views: 1259

Answers (2)

SteamDev
SteamDev

Reputation: 4404

There is no need to create custom mapping templates. In the "Integration Request" for your resource, make sure you check the "Use Lambda Proxy integration" checkbox.

Let's say your lambda function is as follows:

// NodeJS lambda function

exports.handler = function(event, context, callback) {
  // ...your application code...
};

With "Use Lambda Proxy integration" enabled, the event parameter will include http request details when your function executes. You will then have access to event.httpMethod: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-input-format

// Sample `event` for GET request

{
  "path": "/test/hello",
  "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
      "Accept-Language": "en-US,en;q=0.8",
      "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
  },
  "pathParameters": {"proxy": "hello"},
  "requestContext": {
      "accountId": "123456789012",
      "resourceId": "us4z18",
      "stage": "test",
      "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
      "identity": {
          "accountId": "",
          "sourceIp": "192.168.100.1",
          "userArn": "",
          "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
          "user": ""
      },
      "resourcePath": "/{proxy+}",
      "httpMethod": "GET",
      "apiId": "wt6mne2s9k"
  },
  "resource": "/{proxy+}",
  "httpMethod": "GET",
  "queryStringParameters": {"name": "me"},
  "stageVariables": {"stageVarName": "stageVarValue"}
}

NOTE: While using proxy integration, the data passed to your lambda function callback must be formatted in a specific schema, as outlined here:

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

Upvotes: 1

Milk
Milk

Reputation: 2655

You have to add a mapping in your API Gateway that will pass through the request method value. This could be hard coded in each end point's mapping.

The exact way to add this will depend on the structure of your current mappings.

This guide should be a helpful starting point: http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-mappings.html

Upvotes: 1

Related Questions