This plugin add script support to Serverless 1.0 which enables you to customize Serverless behavior without writing a plugin.
It allows you to run nodejs script in any build stage.
-
Install
npm install --save-dev serverless-scriptable-plugin -
Add to Serverless config
plugins: - serverless-scriptable-plugin custom: scriptHooks: before:deploy:createDeploymentArtifacts: build/package.jsExample File Structure
Project Root |___serverless.yml |___serverless.env.yml |___build |___package.js
-
Customized package behavior
Currently, Serverless 1.0 package everything under service folder without any extra process. There are serveral problems:
- Not easy for transcompiling, e.g. using Babel/Typescript to transcompile code
- The default package is big because it packaged dev dependencies
In babel-then-package-to-zip example, serverless will run customized package process: transcompile and package to zip
exec("Clean Up Environment", "rm -rf ._target lib *.zip && mkdir -p lib"); exec("Compiling", "node_modules/.bin/babel --presets es2015,react --plugins transform-async-to-generator,transform-runtime,transform-class-properties,transform-flow-strip-types -d lib/ src/"); const packageBuilder = new PackageBuilder(servicePath); packageBuilder.addFolder("lib"); //I only tested npm 3, not sure if npm 2 works or not. packageBuilder.addDependenciesExclude(["node_modules/aws-sdk"]); packageBuilder.writeToFileSync(artifactFilePath);
-
Run any command as a hook script
It's possible to run any command as the hook script, e.g. use the following command to zip the required folders
plugins: - serverless-scriptable-plugin custom: scriptHooks: after:package:createDeploymentArtifacts: zip -q -r .serverless/package.zip src node_modules service: service-name package: artifact: .serverless/package.zip
-
Create CloudWatch Log subscription filter for all Lambda function Log groups, e.g. subscribe to a Kinesis stream
plugins: - serverless-scriptable-plugin custom: scriptHooks: after:deploy:compileEvents: build/serverless/add-log-subscriptions.js provider: logSubscriptionDestinationArn: 'arn:aws:logs:ap-southeast-2:{account-id}:destination:'
and in build/serverless/add-log-subscriptions.js file:
const resources = serverless.service.provider.compiledCloudFormationTemplate.Resources; const logSubscriptionDestinationArn = serverless.service.provider.logSubscriptionDestinationArn; Object.keys(resources) .filter(name => resources[name].Type === 'AWS::Logs::LogGroup') .forEach(logGroupName => resources[`${logGroupName}Subscription`] = { Type: "AWS::Logs::SubscriptionFilter", Properties: { DestinationArn: logSubscriptionDestinationArn, FilterPattern: ".", LogGroupName: { "Ref": logGroupName } } } );
-
Run multiple commands for the serverless event
It's possible to run multiple commands for the same serverless event, e.g. Add CloudWatch log subscription and dynamodb auto scaling support
plugins: - serverless-scriptable-plugin custom: scriptHooks: after:package:createDeploymentArtifacts: - build/serverless/add-log-subscriptions.js - build/serverless/add-dynamodb-auto-scaling.js service: service-name package: artifact: .serverless/package.zip
- Version 0.7.0
- [Feature] Return promise object to let serverless to wait until script is finished
- Version 0.6.0
- [Feature] Supported execute multiple script/command for the same serverless event
- Version 0.5.0
- [Feature] Supported serverless variables in script/command
- [Improvement] Integrated with codeclimate for code analysis and test coverage
- Version 0.4.0
- [Feature] Supported colored output in script/command
- [Improvement] Integrated with travis for CI
- Version 0.3.0
- [Feature] Supported to execute any command for serverless event
- Version 0.2.0
- [Feature] Supported to execute javascript file for serverless event