Skip to content

Commit

Permalink
sls-step-functions template: Serverless multiple Lambda orchestration…
Browse files Browse the repository at this point in the history
… workflow Using AWS Step Functions
  • Loading branch information
jaymit-sg committed Jan 18, 2022
1 parent 346c98b commit e1796e7
Show file tree
Hide file tree
Showing 9 changed files with 2,090 additions and 0 deletions.
6 changes: 6 additions & 0 deletions sls-step-functions/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# package directories
node_modules
jspm_packages

# Serverless directories
.serverless
48 changes: 48 additions & 0 deletions sls-step-functions/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
### Serverless Orchestration Workflows with AWS Step Functions using Serverless Framework

In this template, we demonstrate below AWS services:
- AWS Step Functions
- AWS Lambda

Use Cases Covered:
- Serverless multiple Lambda orchestration workflow with AWS Step Functions

### This Serverless Framework template IaC will create
- 1 State Machine with Standard type Workflow with different states e.g Choice, Task, etc.
- 4 Lambda Functions (add, subtract, multiply, validateResult)

### This POC Demo Step Function standard workflow works like this
1. Step Function workflow Start with Choice state

2. Based on choice states 'operation' input, do call different steps of lambda tasks e.g add, subtract, multiply

3. add, subtract, multiply tasks lambda step will call 'validateResult' lambda task

4. 'validateResult' lambda task checks this

- 4.1. From add, subtract, multiply step 'resultNumber' > 100 then raise exception 'NumberIsBig' which will catch by 'NumberIsBig' fail step
- 4.2. Incase 'resultNumber' not valid then return 'InvalidNumberError' exception
- 4.3. resultNumber < 0 will raise exception with timeout
- 4.4. For other success scenario it will return success 'resultNumber'

### Steps Functions State Machine Execution Cases

1. Case - add - Succeeded
1. Input JSON Value: { "number1": 5, "number2": 2, "operation": "add" }
2. Result Success ["output": 7]

2. Case - add - Failed
1. Input JSON Value: { "number1": 99, "number2": 2, "operation": "add" }
2. Result Failed [output resultNumber > 100]

3. Case - subtract - Succeeded
1. Input JSON Value: { "number1": 5, "number2": 2, "operation": "subtract" }
2. Result Success ["output": 3]

4. Case - multiply - Succeeded
1. Input JSON Value: { "number1": 5, "number2": 2, "operation": "multiply" }
2. Result Success ["output": 10]

5. Case - multiply - Failed
1. Input JSON Value: { "number1": 15, "number2": 7, "operation": "multiply" }
2. Result Failed [output resultNumber > 100]
3 changes: 3 additions & 0 deletions sls-step-functions/functions/add.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports.handler = async (event, context) => {
return event.number1 + event.number2;
};
3 changes: 3 additions & 0 deletions sls-step-functions/functions/multiply.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports.handler = async (event, context) => {
return event.number1 * event.number2;
};
3 changes: 3 additions & 0 deletions sls-step-functions/functions/subtract.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports.handler = async (event, context) => {
return event.number1 - event.number2;
};
28 changes: 28 additions & 0 deletions sls-step-functions/functions/validateResult.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
function InvalidNumberError(resultVar) {
this.name = 'InvalidNumberError';
this.message = `${resultVar} is not a number!`;
}
InvalidNumberError.prototype = new Error();

function NumberIsBig(resultVar, max) {
this.name = 'NumberIsBig';
this.message = `${resultVar} is bigger than ${max}!`;
}
NumberIsBig.prototype = new Error();

module.exports.handler = async (resultNumber, context) => {
if (!resultNumber) {
//Just for Proof of concept demo throw 'InvalidNumberError' exception when result number in invalid
throw new InvalidNumberError("resultNumber");
} else if (resultNumber > 100) {
//Just for Proof of concept demo throw 'NumberIsBig' exception when result number is greater then 100
throw new NumberIsBig("resultNumber", 100);
} else if (resultNumber < 0) {
//Just for Proof of concept demo represent timeout step
while (true) {
// let it timeout
}
} else {
return resultNumber;
}
};
Loading

0 comments on commit e1796e7

Please sign in to comment.