Serverless Parent Plugin
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 Serverlessserverless.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: DefaultRoleresources: 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: Service1plugins: - serverless-plugin-parentprovider: environment: HELLO_MESSAGE: Mholofunctions: Hello: handler: hello.handle events: - http: path: hello method: get cors: true
Effective serverless.yml
service: Service1provider: name: aws stage: ${opt:stage, "Test"} runtime: nodejs8.10 role: DefaultRoleplugins: - serverless-plugin-parentprovider: environment: HELLO_MESSAGE: Mholofunctions: Hello: handler: hello.handle events: - http: path: hello method: get cors: trueresources: 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.