Forum Discussion

kevinashaw's avatar
kevinashaw
Occasional Contributor
5 years ago
Solved

OAS3, Lambda and method re-use

I've found an odd constraint in Swagger.

We have a pre-existing API that uses Lambda to handle method requests.  Many of our endpoints will call the same Lambda method with several Methods.  So that PUT, POST and DELETE will all be served by the same Lambda method.

In trying to define the API in Swagger/OAS, apparently I need to use the `operationID` operation to reference the name of the Lambda method.  However, this `operationID` is required to be unique, whereas our Lambda methods are designed to be re-used wherever possible.

How can I reference the same Lambda method from several API Methods,such as PUT, POST, etc?

Put another way, If we are to use Swagger/OAS we must break up our Lambda methods into multiple methods?

Or we can't use Swagger.  

This seems like a bizarre constraint.  

I really like Swagger, but this seems like a complete showstopper.

Am I missing something?  Does anyone else find this odd?

  • Hi Kevin,

     

    AWS and Lambda bindings can be configured by using the "x-amazon-apigateway-integration" extensions. "operationId" is only used in the absence of the x-amazon-... extensions.

     

    To bind different operations to the same Lambda function, specify the function name in the "uri" property inside "x-amazon-apigateway-integration". The "uri" value looks like this:

    x-amazon-apigateway-integration:
      type: aws
      uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME/invocations"
      ...
    

     

    Here's an example with two endpoints, /foo and /bar, which are bound to the same Lambda function named "Foo". Make sure to replace the REGION and ACCOUNT_ID with yours. Hope this helps!

    swagger: "2.0"
    info:
      title: Lambda function binding test
      version: 1.0.0
    produces:
    - application/json
    paths:
      /foo:
        get:
          operationId: foo
          responses:
            200:
              description: OK
          x-amazon-apigateway-integration:
            type: aws
            passthroughBehavior: when_no_match
            httpMethod: POST
            uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT_ID:function:Foo/invocations"
            responses:
              default:
                statusCode: 200
            parameters: {}
            requestTemplates: {}
      /bar:
        get:
          operationId: bar
          responses:
            200:
              description: OK
          x-amazon-apigateway-integration:
            type: aws
            passthroughBehavior: when_no_match
            httpMethod: POST
            uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT_ID:function:Foo/invocations"
            responses:
              default:
                statusCode: 200
            parameters: {}
            requestTemplates: {}

2 Replies

  • HKosova's avatar
    HKosova
    SmartBear Alumni (Retired)

    Hi Kevin,

     

    AWS and Lambda bindings can be configured by using the "x-amazon-apigateway-integration" extensions. "operationId" is only used in the absence of the x-amazon-... extensions.

     

    To bind different operations to the same Lambda function, specify the function name in the "uri" property inside "x-amazon-apigateway-integration". The "uri" value looks like this:

    x-amazon-apigateway-integration:
      type: aws
      uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME/invocations"
      ...
    

     

    Here's an example with two endpoints, /foo and /bar, which are bound to the same Lambda function named "Foo". Make sure to replace the REGION and ACCOUNT_ID with yours. Hope this helps!

    swagger: "2.0"
    info:
      title: Lambda function binding test
      version: 1.0.0
    produces:
    - application/json
    paths:
      /foo:
        get:
          operationId: foo
          responses:
            200:
              description: OK
          x-amazon-apigateway-integration:
            type: aws
            passthroughBehavior: when_no_match
            httpMethod: POST
            uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT_ID:function:Foo/invocations"
            responses:
              default:
                statusCode: 200
            parameters: {}
            requestTemplates: {}
      /bar:
        get:
          operationId: bar
          responses:
            200:
              description: OK
          x-amazon-apigateway-integration:
            type: aws
            passthroughBehavior: when_no_match
            httpMethod: POST
            uri: "arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/arn:aws:lambda:REGION:ACCOUNT_ID:function:Foo/invocations"
            responses:
              default:
                statusCode: 200
            parameters: {}
            requestTemplates: {}