Step Functions
step
with
UP
Overview
- Why would we use step functions?
- How does that look in practice?
- What mistakes I have made?
- Are there rules you should follow?
- What have I not tried yet?
About Me
- Thomas Ankcorn
- Senior Software Engineer at Baselime
- Working with serverless and AWS for 4 years
- @thomasankcorn on twitter
- Forged at BAE Systems
who has used step functions?
why step functions?
Supportability Maintainability
Extendability
Observability
Perato Principle
The last 20% of the
work takes as long
as the first 80%
Use Step Functions where you make the money
How
Step function studio
- Drag and drop is awesome
- It helps you discover new possibilities
- Exploring native integrations
DefinitionSubstitutions
SFN Workflow Sync
github.com/ljacobsson/sfn-workflow-studio-sync
Import into sls framework
functions:
one: ...
two: ...
resources:
Resources:
YourAwesomeStepFunction:
Type: AWS::StepFunctions::StateMachine
Properties:
Definition: ${file(./the-output-of-the-plugin.json)}
DefinitionSubstitutions:
One: !Ref OneLambdaFunction
Two: !Ref TwoLambdaFunction
RoleArn: !GetAtt SFNRole.Arn
SFNRole:
Type AWS::Iam::Role
Properties:
...YOU GOT THIS :D
Mistakes
Don't be a localhost hero
The mega lambda
Don't put all the code in one lambda
You don't need lambdas for everything
Rules
Start with a smoke test
test("Does my step function even work?", async () => {
const command = new StartExecutionCommand({
input: JSON.stringify({ ... }),
name: `test-invocation-${uuid()}`,
stateMachineArn: arn
});
const result = await sfn.send(command);
const execution = resolveWhenStatusComplete(response.executionArn);
await expect(execution).toResolve()
})
Design for retries
From most common states
design your workflow so you can re-run it and get a good outcome
Each step should do only 1 thing
When using lambdas decompose your logic
Using nested step functions when it makes sense
Things I want to try
Custom UI
Step function API makes it possible to integrate workflow into your product
How possible is this in practice?
Build it with the CDK
const chain = Chain.start(openCase)
.next(assignCase)
.next(workOnCase)
.next(
isComplete
.when(Condition.numberEquals('$.Status', 1), closeCase)
.when(
Condition.numberEquals('$.Status', 0),
escalateCase.next(jobFailed)
),
);
Thank you
deck
By Thomas Ankcorn
deck
- 381