Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get Lambda Function to get httpmethod from ApiGateway with method ANY?

I'm attempting to create an API Gateway that will take in ANY method in AWS. Once the API has been called, the lambda function will then parse out the message that was sent, and decide what to do from there. So, given an API Gateway method of:

Type: AWS::ApiGateway::Method
    Properties:
      RestApiId: !Ref myRestApi
      ResourceId: !Ref myResource
      HttpMethod: ANY
      AuthorizationType: NONE
      Integration:
        Type: AWS_PROXY
        IntegrationHttpMethod: POST
        Uri:
          Fn::Join:
          - ''
          - - 'arn:aws:apigateway:'
            - Ref: AWS::Region
            - :lambda:path/2015-04-30/functions/
            - Fn::GetAtt:
              - myLambdaFunction
              - Arn
            - /invocations

And it will successfully call myLambdaFunction, how do I then have the lambda function in node get which HttpMethod was actually sent?

For example:

exports.handler = (event, context, callback) => {
    const response = {
        statusCode: 200,
        headers: {
            "x-custom-header" : "This exists for reasons."
        }

    };

// I know that event doesn't actually have any httpmethod, but I'm not sure what it does have, or how to use it.
    switch(event.httpmethod) {
      case "POST":
        console.log("POST!!!");
        create(event, context, callback);
        break;
      case "GET":
        console.log("GET!!!");
        read(event, context, callback);
        break;
      case "PUT":
        console.log("PUT!!!");
        update(event, context, callback);
        break;
    }

The lambda above, should be able to console.log whichever method it got, but I'm not sure what should go in place of the event.httpmethod which is something I just made up.

like image 597
trueCamelType Avatar asked Aug 29 '26 22:08

trueCamelType


1 Answers

You are looking for the event.httpMethod (note CAPITAL M) property.

If you are not sure what data your Lambda event has, you can always log the result by using

console.log(event);

and the result will be visible in the CloudWatch log associated with the Lambda function.

For proxy integration between API Gateway and Lambda, you can find specific details about those events in the AWS API Gateway developer guide:

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {String containing incoming request headers}
    "multiValueHeaders": {List of strings containing incoming request headers}
    "queryStringParameters": {query string parameters }
    "multiValueQueryStringParameters": {List of query string parameters}
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}

Or in the AWS Lambda Developer Guide:

{
  "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",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Desktop-Viewer": "true",
    "CloudFront-Is-Mobile-Viewer": "false",
    "CloudFront-Is-SmartTV-Viewer": "false",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Viewer-Country": "US",
    "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "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",
    "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
    "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
    "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": {
      "cognitoIdentityPoolId": "",
      "accountId": "",
      "cognitoIdentityId": "",
      "caller": "",
      "apiKey": "",
      "sourceIp": "192.168.100.1",
      "cognitoAuthenticationType": "",
      "cognitoAuthenticationProvider": "",
      "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"
  }
}
like image 169
matsev Avatar answered Sep 01 '26 17:09

matsev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!