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, lambdaC
Given 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.