Package Exports
- @govtechsg/serverless-selective-functions
- @govtechsg/serverless-selective-functions/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@govtechsg/serverless-selective-functions) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Serverless Selective Functions
A Serverless plugin that enables you to selectively deploy functions for specific stages.
Installation
npm i @govtechsg/serverless-selective-functions --save-dev
Add the plugin to your serverless.yml file:
plugins:
- "@govtechsg/serverless-selective-functions"Usage
# Everything included by default
addVote:
handler: src/functionHandlers/addVote/index.handler
events:
- http:
path: /v1/vote
method: post
cors: true
# Not specifying the `stages` property will include this function
# Exclude all prod-[0-9]*
deleteVote:
handler: src/functionHandlers/deleteVote/index.handler
events:
- http:
path: /v1/vote
method: delete
cors: true
stages:
exclude: # Specify stages that should exclude this function
- "prod-[0-9]*" # Regex
# Include all dev-.* except dev-123
# Note that checks will run through the inclusion list first, then the exclusion list
editVote:
handler: src/functionHandlers/editVote/index.handler
events:
- http:
path: /v1/vote
method: patch
cors: true
stages: # Stage will be tested with both the include and exclude properties
include:
- "dev-.*"
exclude:
- "dev-123"
# Include dev-123 and all prod-.*
summary:
handler: src/functionHandlers/summary/index.handler
events:
- http:
path: /v1/summary
method: get
cors: true
stages:
include:
- "dev-123"
- "prod-.*"Why?
You may want to deploy some functions as specified in your serverless.yml only for a specific stage. A simple approach would be the following:
functions:
- ${file(serverless/functions/base.yml)}
- ${file(serverless/functions/${self:provider.stage}.yml)}Then if you wanted to deploy functions only when the stage is set to offline, you can create a serverless/functions/offline.yml file and populate it with functions meant only for the offline stage.
The approach works for simple cases, but lets say you want to deploy the following functions for 3 stages:
prod: lambdaA, lambdaB
staging: lambdaB
offline: lambdaA, lambdaCGiven that there isn't a common subset of functions, you cannot create a base.yml. If you create a prod.yml with lambdaA + lambdaB, and staging.yml with lambdaB, you will then need to maintain 2 separate definitions of lambdaB which would be error prone. This restricts you to having mutually exclusive sets of functions defined in different yml files, otherwise we tradeoff maintainability.