This plugin allows you to write scripts to customize Serverless behavior for Serverless 1.x and upper
It also supports running node.js scripts in any build stage.
-
Customize package behavior
The following config is using babel for transcompilation and packaging only the required folders: dist and node_modules without aws-sdk
plugins:
- serverless-scriptable-plugin
custom:
scriptable:
hooks:
before:package:createDeploymentArtifacts: npm run build
package:
exclude:
- '**/**'
- '!dist/**'
- '!node_modules/**'
- node_modules/aws-sdk/**
-
Add a custom command
plugins:
- serverless-scriptable-plugin
custom:
scriptable:
hooks:
before:migrate:command: echo before migrating
after:migrate:command: echo after migrating
commands:
migrate: echo Running migration
Then you could run this command by:
$ npx serverless migrate
Running command: echo before migrating
before migrating
Running command: echo Running migrating
Running migrating
Running command: echo after migrating
after migrating
-
Deploy python function
plugins:
- serverless-scriptable-plugin
custom:
scriptable:
hooks:
before:package:createDeploymentArtifacts: ./package.sh
package:
artifact: .serverless/package.zip
and package.sh script file to package the zip file (https://docs.aws.amazon.com/lambda/latest/dg/python-package.html)
PACKAGE_FILE=.serverless/package.zip
rm -f $PACKAGE_FILE && rm -rf output && mkdir -p output
pip install -r requirements.txt --target output/libs
(cd output/libs && zip -r ../../$PACKAGE_FILE . -x '*__pycache__*')
(zip -r $PACKAGE_FILE your-src-folder -x '*__pycache__*')
Serverless would then deploy the zip file you built to aws lambda.
-
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:
scriptable:
hooks:
before:package:createDeploymentArtifacts: zip -q -r .serverless/package.zip src node_modules
service: service-name
package:
artifact: .serverless/package.zip
-
Dynamically change resources
Create CloudWatch Log subscription filter for all Lambda function Log groups, e.g. subscribe to a Kinesis stream
plugins:
- serverless-scriptable-plugin
custom:
scriptable:
hooks:
after:package: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
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:
scriptable:
hooks:
after:package:createDeploymentArtifacts:
- build/serverless/add-log-subscriptions.js
- build/serverless/add-dynamodb-auto-scaling.js
service: service-name
package:
artifact: .serverless/package.zip
-
Suppress console output
You could control what to show during running commands, in case there are sensitive info in command or console output.
custom:
scriptable:
showStdoutOutput: false
showStderrOutput: false
showCommands: false
hooks:
...
commands:
...