Skip to content


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time



GitHub version Build Status License: MIT serverless

Boilerplate template for the serverless-framework.

Want to learn how to get start with the serverless framework? Watch my YouTube video where I explain about how to use the framework, while using this GitHub repository.


  1. AWS account

  2. Docker

Getting Started


Deploy two serverless services (APIs)

  • todo-api - NodeJS 12.x (JavaScript/TypeScript)
    • CRUD app - To keep it simple, we're using an S3 bucket as a database. The contents are saved to the objects' user-defined metadata
  • greet-api - Python 3.8
    • Send a name and get a greeting

Both services have dependencies, and we'll use Lambda Layers to meet these dependencies.

  1. Clone this repository (or Use as template and then clone)

    $ (home) git clone
  2. Use this Docker image

    Image Usage Examples
    • With aws-vault

      $ (serverless-template) aws-vault exec PROFILE_NAME -- bash ./scripts/
    • AWS Environment variables

      $ (serverless-template) export AWS_SECRET_ACCESS_KEY=A123123
      $ (serverless-template) export AWS_ACCESS_KEY_ID=B1232123123
      $ (serverless-template) export AWS_REGION=eu-west-1
      $ (serverless-template) export AWS_PROFILE=my-profile-name
      $ (serverless-template) bash ./scripts/
    • AWS Credentials & Config files

      $ (serverless-template) bash ./scripts/

    Tip: Take a look at the docker_run script

    $ (serverless-template) bash ./scripts/
    ...                     # Pulling image ...
    $ /code (master)        # We're in!
  3. Build App - this includes installing dependencies

    $ /code (master) bash ./scripts/
    🔎  Identifying services folders ...
    ✅  Finished
  4. Deploy AWS resources - S3 Bucket and API Gateway

    $ /code/aws-resources (master) yarn deploy:dev
  5. Deploy AWS Lambda Layers

    $ /code/services/todo-api/layer (master)   yarn deploy:dev
    $ /code/services/greet-api/layer (master)  yarn deploy:dev
  6. Deploy AWS Lambda Functions

    $ /code/services/todo-api (master)  yarn deploy:dev
    $ /code/services/greet-api (master) yarn deploy:dev


Replace ENDPOINT with the API Gateway's endpoint that was generated by serverless-framework, and AWS_REGION with the relevant region.

$ /code (master) APIGATEWAY_ENDPOINT=



MY_CONTENT="some content"

curl --location --request POST ${APIGATEWAY_ENDPOINT}/dev/todo/create \
--header 'Content-Type: application/json' \
--data-raw '{ "content": "'"${MY_CONTENT}"'" }'

Get (Read)

Replace MY_UUID


curl --location --request GET ${APIGATEWAY_ENDPOINT}/dev/todo/get/${MY_UUID}



MY_CONTENT='wohoo new content!'

curl --location --request POST ${APIGATEWAY_ENDPOINT}/dev/todo/update \
--header 'Content-Type: application/json' \
--data-raw '  { "id": "'${MY_UUID}'", "content": "'"${MY_CONTENT}"'" }'


Replace MY_UUID


curl --location --request DELETE ${APIGATEWAY_ENDPOINT}/dev/todo/delete/${MY_UUID}


curl --location --request GET ${APIGATEWAY_ENDPOINT}/dev/todo/list


Replace MY_NAME


curl --location --request GET "${APIGATEWAY_ENDPOINT}/dev/greet/${MY_NAME}"




  1. Clone this repository

  2. Use this Docker image

  3. Install dependencies for each API

    $ /code/services/todo-api (master)  yarn install
    $ /code/services/greet-api (master) yarn install
  4. Modify code in src and then build

    $ /code/services/todo-api (master)  yarn build:dev
    $ /code/services/greet-api (master) yarn build:dev

Manage Dependencies

Adding a new dependency

NodeJS - yarn add package_name

$ /code/services/todo-api/layer/nodejs (master) yarn add uuid # or any other package

Python - update the requirements.txt file

$ /code (master) cat ./services/greet-api/layer/python/requirements.txt

Deploying a new Layer version

$ /code/services/todo-api/layer (master)  yarn deploy:dev
$ /code/services/greet-api/layer (master) yarn deploy:dev

Deploying and Redeploying the API

When updating a Lambda Layer, you must re-deploy the API for it to use the latest Lambda Layer version.

$ /code/services/todo-api (master)  yarn deploy:dev
$ /code/services/greet-api (master) yarn deploy:dev


  1. Destroy AWS Lambda Functions

    $ /code/services/todo-api (master)  yarn destroy:dev
    $ /code/services/greet-api (master) yarn destroy:dev
  2. Destroy AWS Lambda Layers

    $ /code/services/todo-api/layer (master)  yarn destroy:dev
    $ /code/services/greet-api/layer (master) yarn destroy:dev
  3. Destroy S3 Bucket and API Gateway

    IMPORTANT - remove all the objects from the todo S3 bucket before taking this action

    $ /code/aws-resources (master) yarn destroy:dev




Learn how to use the Serverless Framework, while taking advantage of AWS Lambda Function, Lambda Layer, and API Gateway.

AWS Lambda Function

"AWS Lambda lets you run code without provisioning or managing servers. You pay only for the compute time you consume..." [Source]

Pricing, Limits, CloudWatch Pricing and S3 Pricing

AWS Lambda Layer

"...A layer is a ZIP archive that contains libraries, a custom runtime, or other dependencies. With layers, you can use libraries in your function without needing to include them in your deployment package..." [Source]

S3 Pricing

AWS API Gateway

"...API Gateway handles all the tasks involved in accepting and processing up to hundreds of thousands of concurrent API calls, including traffic management, CORS support, authorization, and access control, throttling, monitoring, and API version management..." [Source]

Pricing and Limits

Serverless Framework

"The Serverless Framework helps you build serverless apps with radically less overhead and cost. It provides a powerful, unified experience to develop, deploy, test, secure and monitors your serverless applications..." [Source]


Eventually, the serverless framework produces CloudFormation templates, deploys stacks, and manages them.

Tip After deploying with the serverless framework, check the stacks' templates, they look like a total mess. If you want to 'prettify' those YAML templates, click on View in Designer > Move one of the components, and then look below, your template was automatically 'prettified'

Use Cases

Serverless backend and Cron jobs

Serverless backend and Cron jobs


Data processing

Data processing


Lambda@Edge Increase web application security



More use cases


Project Tree


  • Each API is an isolated service that contains multiple functions
  • All APIs share the same API Gateway - easier to manage
  • The file serverless.common.yml contains mappings that are relevant to all APIs, such as region, allow_origin, user_pool_id, and more

APIs Structure

  • serverless.yml - configuration for deployment - Using Layers
  • layer - deployed separately, these are the dependencies
  • src - source code of API that is deployed by serverless
  • package.json - contains the build, deploy and destroy scripts, and dev-dependencies
  • yarn.lock - contains the list of dev-dependencies and their versions


  • Never run yarn add some_package in an API folder
  • Always use yarn add --dev some_packagein an API folder; Lambda Layer supplies the "real" dependencies
  • There's no need to create a layer for AWS SDK (e.g., aws-sdk, boto3) - These libraries are provided by AWS automatically

Layer Structure

  • serverless.yml - configuration for deploying the layer - Deploying Layers
  • package.json - contains the scripts for building, deploying and destroying the layer
  • nodejs/package.json - contains the dependencies that are uploaded with this layer
  • nodejs/yarn.lock - contains the list of dependencies and their versions

Also Check


Report issues/questions/feature requests on in the Issues section.

Pull requests are welcome! Ideally, create a feature branch and issue for every single change you make. These are the steps:

  1. Fork this repo
  2. Create your feature branch from master (git checkout -b my-new-feature)
  3. Commit your remarkable changes (git commit -am 'Added some feature')
  4. Push to the branch (git push --set-up-stream origin my-new-feature)
  5. Create a new Pull Request and tell us about your changes



Created and maintained by Meir Gabay


This project is licensed under the MIT License - see the LICENSE file for details