serverless-reqvalidator-plugin
Serverless plugin to set specific validator request on method
Installation
npm install serverless-reqvalidator-plugin
Requirements
This require you to have documentation plugin installed
serverless-aws-documentation
Using plugin
Specify plugin
plugins: - serverless-reqvalidator-plugin - serverless-aws-documentation
In serverless.yml
create custom resource for request validators
xMyRequestValidator: Type: "AWS::ApiGateway::RequestValidator" Properties: Name: 'my-req-validator' RestApiId: Ref: ApiGatewayRestApi ValidateRequestBody: true ValidateRequestParameters: false
For every function you wish to use the validator set property reqValidatorName: 'xMyRequestValidator'
to match resource you described
debug: handler: apis/admin/debug/debug.debug timeout: 10 events: - http: path: admin/debug method: get cors: true private: true reqValidatorName: 'xMyRequestValidator'
Use Validator specified in different Stack
The serverless framework allows us to share resources among several stacks. Therefore a CloudFormation Output has to be specified in one stack. This Output can be imported in another stack to make use of it. For more information see here.
Specify a request validator in a different stack:
plugins: - serverless-reqvalidator-pluginservice: my-service-afunctions: hello: handler: handler.myHandler events: - http: path: hello reqValidatorName: 'myReqValidator'resources: Resources: xMyRequestValidator: Type: "AWS::ApiGateway::RequestValidator" Properties: Name: 'my-req-validator' RestApiId: Ref: ApiGatewayRestApi ValidateRequestBody: true ValidateRequestParameters: false Outputs: xMyRequestValidator: Value: Ref: my-req-validator Export: Name: myReqValidator
Make use of the exported request validator in stack b:
plugins: - serverless-reqvalidator-pluginservice: my-service-bfunctions: hello: handler: handler.myHandler events: - http: path: hello reqValidatorName: Fn::ImportValue: 'myReqValidator'
Use an external validator by ID
If you have an existing request validator defined outside of CloudFormation e.g. Terraform, you can reference it by id.
plugins: - serverless-reqvalidator-pluginservice: my-service-afunctions: hello: handler: handler.myHandler events: - http: path: hello reqValidatorName: id: 'g5ch0h'
Full example
service: name: my-serviceplugins: - serverless-webpack - serverless-reqvalidator-plugin - serverless-aws-documentationprovider: name: aws runtime: nodejs6.10 region: eu-west-2 environment: NODE_ENV: ${self:provider.stage}custom: documentation: api: info: version: '1.0.0' title: My API description: This is my API tags: - name: User description: User Management models: - name: MessageResponse contentType: "application/json" schema: type: object properties: message: type: string - name: RegisterUserRequest contentType: "application/json" schema: required: - email - password properties: email: type: string password: type: string - name: RegisterUserResponse contentType: "application/json" schema: type: object properties: result: type: string - name: 400JsonResponse contentType: "application/json" schema: type: object properties: message: type: string statusCode: type: number commonModelSchemaFragments: MethodResponse400Json: statusCode: '400' responseModels: "application/json": 400JsonResponsefunctions: signUp: handler: handler.signUp events: - http: documentation: summary: "Register user" description: "Registers new user" tags: - User requestModels: "application/json": RegisterUserRequest method: post path: signup reqValidatorName: onlyBody methodResponses: - statusCode: '200' responseModels: "application/json": RegisterUserResponse - ${self:custom.commonModelSchemaFragments.MethodResponse400Json}package: include: handler.tsresources: Resources: onlyBody: Type: "AWS::ApiGateway::RequestValidator" Properties: Name: 'only-body' RestApiId: Ref: ApiGatewayRestApi ValidateRequestBody: true ValidateRequestParameters: false