serverless-config-builder
v1.0.5
Published
๐ Split your serverless.yml config into separate files
Downloads
2
Readme
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 placemethod
andpath
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.