serverless-config-builder

1.0.5Β β€’Β PublicΒ β€’Β Published

serverless-config-builder

πŸ— Split your serverless.yml config into separate files

It's currently not possible to share a single API Gateway instance across serverless stacks (serverless/serverless#3078), so we're left with a serverless config file that can be thousands of lines long.

Even if this issue is fixed, this plugin may still be useful for generating a serverless.yml file from shorter files, separating the concerns of lambda functions, dev environment and resources, and writing config in JSON.

The config for our serverless stack went from 641 lines to just 329, split over function categories, custom, plugins, provider and DynamoDB tables.

Install

npm i serverless-config-builder --save-dev

Usage

1 - Create a .serverless-config folder.

2 - Create a new js file like .serverless-config/build_yml.js.

const slsConfigBuilder = require('serverless-config-builder');

slsConfigBuilder({
  initial: {
    service: 'example'
  },
  sections: ['custom'],
  plugins: ['http', 'cors']
});

3 - Add the build file to the scripts in package.json.

"scripts": {
  "sls_yml": "node .serverless-config/build_yml.js"
}

4 - Split your serverless.yml into files in .serverless-config.

Functions are split up into named files containing groups of definitions within a functions directory. You can define functions in JSON or YML.

{
  "users_all": {
    "description": "Get all users",
    "method": "get",
    "path": "/users",
    "handler": "users.all"
  }
}

Note: Using the http plugin, we can place method and path on the top level.

5 - Run the script

npm run sls_yml

Plugins

To lower the lines of code in the config, you can use plugins to generate repetitive parts of your serverless config.

To run an inbuilt plugin, add the name into a plugins array in the config.

http

Most functions handle one HTTP event, so this plugin allows you to define method and path at the top level of the definition.

cors

Add CORS headers to every event. Specify custom headers in a cors object in the config. Defaults to true which sends the default configuration shown below.

slsConfigBuilder({
  plugins: ['cors'],
  cors: {
    origin: '*'
    headers: [
      'Content-Type',
      'X-Amz-Date',
      'Authorization',
      'X-Api-Key',
      'X-Amz-Security-Token',
      'X-Amz-User-Agent'
    ],
    allowCredentials: false
  }
});

dynamodb-tables

Generate DynamoDB table resources based off a shorter config file.

{
  "usersTable": {
    "name": "users",
    "key_schema": [
      {
        "name": "id",
        "key_type": "HASH",
        "attribute_type": "S"
      }
    ]
  }
}

Make your own plugins

plugins: [
  'http',
  (options, sls) => {
    const artifactName = options.myArtifactName;
    Object.keys(sls.functions).forEach(name => {
      const func = sls.functions[name];

      func.package.artifact = `${myArtifactName}.zip`;
    });

    // Return the full sls config object
    return sls;
  }
]

TODO/Future Ideas

  • [ ] Make this an actual Serverless Plugin that gets run before any deployment sls config build
  • [ ] Generate DynamoDB table resources based on live data.

Readme

Keywords

Package Sidebar

Install

npm i serverless-config-builder

Weekly Downloads

1

Version

1.0.5

License

MIT

Last publish

Collaborators

  • danbovey