What's the plugins for?
This plugin allows you to write scripts to customize Serverless behavior for Serverless 3.x
Features:
- Run any command in any stage of serverless lifecycle
- Add custom commands to serverless, e.g.
npx serverless YOUR-COMMAND
Example
Quick Start
- Install
npm install --save-dev serverless-scripts-plugin
- Add to Serverless config
plugins: - serverless-scripts-plugin custom: scripts: # set env vars for all hooks and commands env: EXTRA_VAR: VAR_VALUE # add custom hooks hooks: before:package:createDeploymentArtifacts: npm run build # or custom commands commands: migrate: echo Running migration
Examples
1. Customize package behavior
The following config is using babel for transcompilation and packaging only the required folders: dist and node_modules without aws-sdk
```yml
plugins:
- serverless-scripts-plugin
custom:
scripts:
hooks:
before:package:createDeploymentArtifacts: npm run build
package:
patterns:
- '**/**'
- '!dist/**'
- '!node_modules/**'
- node_modules/aws-sdk/**
```
2. Add a custom command
```yaml
plugins:
- serverless-scripts-plugin
custom:
scripts:
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:
```bash
$ npx serverless migrate
Running command: echo before migrating
before migrating
Running command: echo Running migrating
Running migrating
Running command: echo after migrating
after migrating
```
3. Deploy python function
```yml
plugins:
- serverless-scripts-plugin
custom:
scripts:
hooks:
before:package:createDeploymentArtifacts: ./package.sh
# serverless will use the specified package that generated by `./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)
```bash
PACKAGE_FILE=.serverless/package.zip
rm -f $PACKAGE_FILE && rm -rf output && mkdir -p output
pip install -r requirements.txt --target output/libs
# You can use the following command to install if you are using pipenv
# pipenv requirements > output/requirements.txt && pip install -r output/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.
4. 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
```yml
plugins:
- serverless-scripts-plugin
custom:
scripts:
hooks:
before:package:createDeploymentArtifacts: zip -q -r .serverless/package.zip src node_modules
service: service-name
package:
artifact: .serverless/package.zip
```
5. Suppress console output
You could control what to show during running commands, in case there are sensitive info in command or console output.
```yml
custom:
scripts:
showStdoutOutput: false # Default true. true: output stderr to console, false: output nothing
showStderrOutput: false # Default true. true: output stderr to console, false: output nothing
showCommands: false # Default true. true: show the command before execute, false: do not show commands
outputStream: stderr # Default combined. combined: forwards commands and scripts stderr and stdout to parent process stderr and stdout, stderr: forwards all logs to stderr, stdout: forwards all logs to stdout
hooks:
...
commands:
...
```
6. Add extra env vars for command / script
You can pass extra env variables for each command / script
custom:
scripts:
hooks:
before:package:createDeploymentArtifacts:
env:
LOCATION: .serverless
scripts:
- zip -q -r $LOCATION/package.zip src node_modules
7. Set current working directory for a command / script
It's possible to set current working directory for script execution
custom:
scripts:
hooks:
before:package:createDeploymentArtifacts:
cwd: very/very/very/very/very/long/path
scripts:
- zip -q -r package.zip src node_modules