Introduction
AWS Step Functions permet d'orchestrer des workflows distribués complexes sans serveur. En 2026, les architectures event-driven exigent une gestion fine des états, des retries et du parallélisme. Ce tutoriel expert vous guide de la définition ASL jusqu'au déploiement avec CDK, en intégrant des patterns avancés comme les callbacks et la compensation. Chaque étape inclut du code fonctionnel prêt pour la production.
Prérequis
- Compte AWS avec permissions IAM avancées
- Node.js 20+ et AWS CDK v2
- Connaissances solides de TypeScript et Python
- AWS CLI configuré (v2)
Créer les fonctions Lambda
import json
def lambda_handler(event, context):
order = event.get('order', {})
if not order.get('id'):
raise Exception('InvalidOrder')
return {'status': 'validated', 'order': order}Cette Lambda valide une commande et lance une exception nommée pour déclencher les états de retry et de catch dans Step Functions.
Définir la machine à états ASL
{
"Comment": "Workflow e-commerce expert 2026",
"StartAt": "ValidateOrder",
"States": {
"ValidateOrder": {
"Type": "Task",
"Resource": "${ValidateOrderLambdaArn}",
"Catch": [{
"ErrorEquals": ["InvalidOrder"],
"Next": "NotifyFailure"
}],
"Next": "ProcessPayment"
},
"ProcessPayment": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "${PaymentLambdaArn}"
},
"End": true
},
"NotifyFailure": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "${FailureTopicArn}",
"Message": "Order failed"
},
"End": true
}
}
}Définition ASL complète avec gestion d'erreurs nommées, intégration directe SNS et variables CDK pour l'injection des ARNs.
Stack CDK TypeScript
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
export class StepFunctionsStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const validateFn = new lambda.Function(this, 'ValidateOrder', {
runtime: lambda.Runtime.PYTHON_3_12,
handler: 'validate_order.lambda_handler',
code: lambda.Code.fromAsset('lambdas'),
});
const definition = sfn.DefinitionBody.fromFile('statemachine/workflow.asl.json');
new sfn.StateMachine(this, 'OrderWorkflow', {
definitionBody: definition,
definitionSubstitutions: { ValidateOrderLambdaArn: validateFn.functionArn },
stateMachineType: sfn.StateMachineType.STANDARD,
});
}
}Stack CDK qui déploie la Lambda et la State Machine en remplaçant dynamiquement les ARNs dans le fichier ASL.
Déploiement via CDK
cdk bootstrap
cdk deploy StepFunctionsStack --require-approval neverCommandes de déploiement qui initialisent l'environnement et déploient la stack sans confirmation interactive.
Pattern Callback Token avancé
{
"StartAt": "WaitForApproval",
"States": {
"WaitForApproval": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters": {
"FunctionName": "${ApprovalLambdaArn}",
"Payload": {
"taskToken.$": "$$.Task.Token"
}
},
"TimeoutSeconds": 3600,
"End": true
}
}
}Implémentation du pattern callback avec token pour les approbations humaines, incluant un timeout explicite.
Bonnes pratiques
- Utilisez toujours des noms d'erreurs personnalisés pour un debugging précis
- Préférez les StateMachineType EXPRESS pour les workloads à fort débit
- Activez le logging complet en mode DEBUG pendant le développement
- Externalisez les configurations via Parameter Store
- Testez systématiquement les états avec Step Functions Local
Erreurs courantes à éviter
- Oublier les permissions IAM entre Step Functions et les services intégrés
- Utiliser des timeouts trop courts sur les tâches de longue durée
- Ne pas versionner les définitions ASL en production
- Ignorer les limites de 25 000 événements par exécution
Pour aller plus loin
Approfondissez ces concepts avec nos formations avancées sur l'architecture serverless : https://learni-group.com/formations