Serverless Development

Serverless Orchestration Workflows with AWS Step Functions

(Utilizing Serverless Framework)

Serverless Orchestration Workflows with AWS Step Functions

By
Jaymit Bhoraniya
January 21, 2022

Introduction

In this article, we will take a look at a use-case that represents Serverless Orchestration workflow with AWS Step Functions using Serverless Framework.

The entire PoC (proof-of-concept) uses IaC written with Serverless Framework. You can download the template from our website, HERE.

AWS Architecture

Above is an AWS Serverless architecture diagram showing Step Functions orchestrating different Lambda functions through multiple task steps. Later on in the article, we will talk in more detail about how this architecture’s workflow steps work which includes a Serverless Framework IaC template.

What is AWS Step Function?

"AWS Step Functions is a serverless orchestration service that lets you combine AWS Lambda functions and other AWS services to build business-critical applications. Through Step Functions' graphical console, you see your application’s workflow as a series of event-driven steps." - Source

  • AWS Step Functions lets you coordinate individual tasks into a visual workflow, so you can build and update apps quickly.
  • The workflows you build with Step Functions are called state machines, and each step of your workflow is called a state.
  • Tasks perform work, either by coordinating another AWS service or an application that you can host basically anywhere.

How do Step Functions work?

Define your visual workflow in Workflow Studio and the console will auto-generate the code for you. You can also code it yourself using code snippets in the console or locally with VS Code.

Specify the resources, such as Lambda functions and SNS topics, that you want to trigger in your workflow.

Start an execution to visualize and verify that the steps of your workflow are operating as intended. Inspect and debug your execution history from the console directly.

Step Function States

  • Task - A single unit of work using different AWS services
  • Choice - adds branching logic to a state machine
  • Parallel - Fork and join data across tasks
  • Wait - delays the state machine from continuing for a specified time
  • Fail - stops the execution of the state machine and marks it as a failure
  • Succeed - Stops an execution successfully
  • Pass - Passes its input to its output
  • Map - used to run a set of steps for each element of an input array

Step Function Workflow Types

Standard

Durable, checkpointed workflows for machine learning, order fulfillment, IT/DevOps automation, ETL jobs, and other long-duration workloads.

Express

Event-driven workflows for streaming data processing, microservices orchestration, IoT data ingestion, mobile backends, and other short duration, high-event-rate workloads.

Source

Why use Step Functions?

  • Different way to trigger workflow steps
  • Workflow progress visualization
  • Built-in error handling and retry
  • Handles complex workflows with lots of steps
  • Allows manual steps
  • Handles long-lived workflows up to 1 year
  • Manage the state between executions of stateless functions
  • Decouples the multiple microservices steps
  • Scales & perform parallel executions
  • Execution event history
  • Function orchestration
  • Branching / Parallel processing
  • Many AWS Services Support

Provisioning AWS Steps Function Workflow Using Serverless Framework

Serverless Framework plugin serverless-step-functions will help you define a step function state machine definition directly within the serverless.yml.

Step Functions visual workflow generated JSON is in the form of Amazon State Languages and that same spec is able to be used with the serverless-step-functions plugin after translating to YAML.

All JSON is valid YAML. We are able to translate JSON snippets to YAML using an online tool Code Beatify and CLI tool yq.

Below mentioned Serverless Framework IaC code snippet will create these resources:

  • 1 State Machine with Standard type Workflow with different states e.g Choice, Task, etc.
  • 4 Lambda Functions (add, subtract, multiply, validateResult)
  
service: sls-step-functions
frameworkVersion: '2'

plugins:
  - serverless-step-functions

provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221
  stage: dev
  region: ap-south-1

functions:
  add:
    handler: functions/add.handler
    timeout: 3

  subtract:
    handler: functions/subtract.handler
    timeout: 3

  multiply:
      handler: functions/multiply.handler
      timeout: 3

  validateResult:
    handler: functions/validateResult.handler
    timeout: 3

stepFunctions:
  stateMachines:
    LambdaStepFuncDemo:    
      name: StepFunctionLambdaOrchestrationPOCDemo
      definition:
        Comment: "Step Function Lambda Orchestration POC Demo"
        StartAt: choose
        States:
          choose:
            Type: Choice            
            Choices:
              - And:
                  - Variable: $.operation
                    StringEquals: "add"
                  - Variable: $.number1
                    NumericGreaterThanEquals: 1
                  - Variable: $.number2
                    NumericLessThan: 100
                Next: add
              - And:
                  - Variable: $.operation
                    StringEquals: "subtract"
                  - Variable: $.number1
                    NumericGreaterThanEquals: 1
                  - Variable: $.number2
                    NumericLessThan: 100
                Next: subtract              
              - And:
                  - Variable: $.operation
                    StringEquals: "multiply"
                  - Variable: $.number1
                    NumericGreaterThanEquals: 1
                  - Variable: $.number2
                    NumericLessThan: 100
                Next: multiply      
          add:
            Type: Task
            Resource: 
              Fn::GetAtt: [add, Arn]
            Next: validateResult
            ResultPath: $.resultNumber
          subtract:
            Type: Task
            Resource: 
              Fn::GetAtt: [subtract, Arn]
            Next: validateResult
            ResultPath: $.resultNumber
          multiply:
            Type: Task
            Resource: 
              Fn::GetAtt: [multiply, Arn]
            Next: validateResult
            ResultPath: $.resultNumber
          validateResult:
            Type: Task
            Resource: 
              Fn::GetAtt: [validateResult, Arn]              
            InputPath: $.resultNumber
            TimeoutSeconds: 1
            Retry: 
              - ErrorEquals:
                  - States.Timeout
                IntervalSeconds: 1
                BackoffRate: 2.0
                MaxAttempts: 2
            Catch: 
              - ErrorEquals:
                  - NumberIsBig
                ResultPath: $.error
                Next: numberIsBig
            End: true
          numberIsBig:
            Type: Fail
  

This POC Demo Step Function Standard Workflow Works Like This

Step Function workflow starts with choice state. Based on choice states and operation input, different steps of lambda tasks (e.g add/ subtract/multiply) will trigger. Add/subtract/multiply tasks lambda steps will then call validateResult Lambda task.

The validateResult lambda task checks the following:

  • From add/subtract/multiply steps if resultNumber > 100 then raise exception NumberIsBig which will be caught by the NumberIsBig fail step
  • Incase resultNumber is not valid then return InvalidNumberError exception
  • resultNumber < 0 will raise exception with timeout
  • For other success scenarios it will return success resultNumber

Steps Functions State Machine Execution Cases

Below we will look at a couple of different scenarios that can take place using an input JSON value, result, and the visual AWS Step Functions view from the console.

Case: add, succeeded

Input JSON Value

  
{
  "number1": 5,
  "number2": 2,
  "operation": "add"
}
  

Result Success

  
["output": 7]
  

Case: add, failed

Input JSON Value

  
{
  "number1": 99,
  "number2": 2,
  "operation": "add"
}
  

Result Failed

  
[output resultNumber > 100]
  

Case: subtract, succeeded

Input JSON Value

  
{
  "number1": 5,
  "number2": 2,
  "operation": "subtract"
}
  

Result Success

  
["output": 3]
  

Case: multiply, succeeded

Input JSON Value

  
{
  "number1": 5,
  "number2": 2,
  "operation": "multiply"
}
  

Result Success

  
["output": 10]
  

Case: multiply, failed

Input JSON Value

  
{
  "number1": 15,
  "number2": 7,
  "operation": "multiply"
}
  

Result Failed

  
[output resultNumber > 100]
  

Steps Function State Machines and Lambda Console Screenshots

Step Functions State Machines

Below you can see the AWS Step Function console including the state machine we made which has all the steps mentioned earlier in the article.

Steps Function Orchestration Tasks Relevant Lambda Functions

Below you can see the AWS Lambda console showing the list of Lambda used as Task states within Step Function State Machine.

State Machine Task Lambda: Validate Result

Below you can see the code of Validate Result Lambda Function.

Conclusion

AWS Step Functions is a low-code, visual workflow service that developers use to build distributed applications, Serverless Orchestration workflows, automate IT business processes, and build data or machine learning pipelines using different AWS services.

Workflows manage failures, retries, parallelization, service integrations, and observability so developers can focus on higher-value business logic.

Serverless Framework is easily able to provision a Step Functions State Machine workflow using the Serverless Step Functions plugin through infrastructure as code.