Serverless Parent Plugin

serverless npm version npm downloads license

Share common configuration between services

Requirements:

  • Serverless v1.12.x or higher.
  • AWS provider

How it works

Serverless Plugin that allows you to keep common configuration in a parent serverless.yml

Setup

Install via npm in the root of your Serverless service:

npm install serverless-plugin-parent --save-dev
  • Add the plugin to the plugins array in your Serverless serverless.yml:
plugins:
- serverless-plugin-parent

Default Usage - Discover Serverless.yml

The plugin will recursively search all parent directories for a serverless.yml file until it reaches the user's home direcory or has gone x number of directories up. The default value is 3 but this can be configured using

custom:
parent:
maxLevels: 2 # Optional (Default 3)

Per default the parent file will overwrite settings in the service files. If you want the service file to have a higher priority you can change that using

custom:
parent:
overwriteServiceConfig: false # Optional (Default true)
Project Structure
<project_root>
- service1
- hello.js
- serverless.yml
- service2
- goodbye.js
- serverless.yml
- serverless.yml
serverless.yml
provider:
name: aws
stage: ${opt:stage, "Test"}
runtime: nodejs8.10
role: DefaultRole
resources:
Resources:
DefaultRole:
Type: AWS::IAM::Role
Properties:
Path: /
RoleName: ${self:service}-${self:provider.stage}
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: ${self:service}-${self:provider.stage}
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: arn:aws:logs:${self:provider.region}:*:log-group:/aws/lambda/*:*:*
service1/serverless.yml
service: Service1
plugins:
- serverless-plugin-parent
provider:
environment:
HELLO_MESSAGE: Mholo
functions:
Hello:
handler: hello.handle
events:
- http:
path: hello
method: get
cors: true
Effective serverless.yml
service: Service1
provider:
name: aws
stage: ${opt:stage, "Test"}
runtime: nodejs8.10
role: DefaultRole
plugins:
- serverless-plugin-parent
provider:
environment:
HELLO_MESSAGE: Mholo
functions:
Hello:
handler: hello.handle
events:
- http:
path: hello
method: get
cors: true
resources:
Resources:
DefaultRole:
Type: AWS::IAM::Role
Properties:
Path: /
RoleName: ${self:service}-${self:provider.stage}
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: ${self:service}-${self:provider.stage}
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: arn:aws:logs:${self:provider.region}:*:log-group:/aws/lambda/*:*:*

Alternate Usage - Defined parent configuration path

Project Structure
<project_root>
- parent
- serverless.yml
- service1
- hello.js
- serverless.yml
- service2
- goodbye.js
- serverless.yml
service1/serverless.yml
custom:
parent:
path: ../parent
# or
path: ../parent/serverless.yml

Contribute

Help us making this plugin better and future proof.

  • Clone the code
  • Install the dependencies with npm install
  • Create a feature branch git checkout -b new_feature
  • Lint with standard npm run lint

License

This software is released under the MIT license. See the license file for more details.