Serverless Plugin Parent

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

user  

aronim

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: "2017"
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
              Action: sts:AssumeRole
        Policies:
          - PolicyName: ${self:service}-${self:provider.stage}
            PolicyDocument:
              Version: "2017"
              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: "2017"
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
              Action: sts:AssumeRole
        Policies:
          - PolicyName: ${self:service}-${self:provider.stage}
            PolicyDocument:
              Version: "2017"
              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.

view on Github

Latest commit b2f54ec on Sep 24, 2017

New to serverless?

To get started, pop open your terminal & run:

npm install serverless -g