Serverless simulation plugin
This is a proof of concept to see if we can replicate Amazon API Gateway using docker images to run lambda
Features:
- λ runtimes supported by docker-lambda.
- CORS
- Authorizer
- Custom Authorizer supported
- Coginito Authorizer not implemented yet
- Lambda Integration
- Velocity templates support. supported
- Lambda Proxy Integration. supported
Prerequisite
Getting Started
Install the plugin
npm i --save-dev serverless-plugin-simulate
Configure your service to use the plugin
service: my-serviceprovider: name: aws runtime: nodejs4.3 # python2.7 is also supported# this is optional configurations# servicesPathDest is use for the case u want to compile all your src and out# put to another folder like dist## services allows specifying a docker-compose.yml file and (optional)# projectName. This will start the docker-compose stack when simulate is run.# If projectName is specified, it will be used when running docker-compose,# and the default docker-compose network will be passed to lambda docker commands# allowing all lambdas to access any hosts defined in docker-compose servicescustom: simulate: dist: dist services: file: docker-compose.yml # will use: $ docker-compose --project-name myproject ... # and: $ docker --network myproject_default ... projectName: myprojectplugins: - serverless-plugin-simulate
If you do not need to chain functions locally you can just run the API Gateway simulation by itself.
sls simulate apigateway -p 5000
Using the Lambda simulator
If you want to chain functions locally, you need to use the Lambda Simulator.
Run the Lambda Simulation
sls simulate lambda -p 4000
Run the API Gateway Simulation
sls simulate apigateway -p 5000 --lambda-port 4000
Use the environment variables to configure the AWS SDK to use the local Lambda simulation. You can use the same technique with any other AWS SDK.
const AWS = require('aws-sdk');const endpoint = process.env.SERVERLESS_SIMULATE ? process.env.SERVERLESS_SIMULATE_LAMBDA_ENDPOINT : undefinedconst lambda = new AWS.Lambda({ endpoint })const handler = (event, context, callback) => { const params = { FunctionName: 'my-other-function', Payload: JSON.stringify({ foo: 'bar' }) } lambda.invoke(params, (err, result) => { if (err) { return callback(err) } callback(null, { statusCode: 200, body: result.Payload }) })}
Examples
See the examples folder for examples.
npm install
- Installs all dependenciesnpm start
- Starts API Gateway simulation listening at http://localhost:5000npm run start:lambda
- Starts Lambda simulation listening at http://localhost:4000npm run start:apigateway
- Starts API Gateway simulation that uses the Lambda simulation listening at http://localhost:5000npm run start:services
- Starts mock services defined indocker-compose.yml
npm test
- tests custom authorizer (Authorization:TOKEN 12345)
Authors
- Gert JvR - Initial work - gertjvr
- John McKim - johncmckim
See also the list of contributors who participated in this project.
Contributing
Please create an issue before submitting an Pull Request.
Acknowledgements
This would not be possible without lambci
- docker-lambda - Docker images and test runners that replicate the live AWS Lambda environment
@johncmckim for suggesting the idea