Meer doen met AWS Step Functions!

Met AWS Step Functions bouw je state machines in AWS. Dat is nu een stuk makkelijker dan enkele jaren geleden. Want ondertussen is AWS Step Functions sterk verbeterd, zodat je ook ingewikkelde constructies op een inzichtelijke manier ontwikkelt. In deze blog beschrijft Frederique Retsema van Conclusion Xforce een aantal handige verbeteringen van AWS Step Functions.

3 augustus 2022   |   Blog   |   Door: Frederique Retsema

Deel

AWS Step functions

Grafische wizard

Stel, je wilt een aantal serverless Lambda-functies in Python schrijven, waarbij een deel van de taken parallel mag draaien en een deel niet. Deze functies definieer je in JSON (JavaScript Object Notation). In het verleden moest je JSON-code met de hand schrijven, nu is er de grafische wizard van AWS Step Functions. Daarin geef je aan welke AWS-service je wilt gebruiken. Vervolgens vul je alle parameters in die bij deze service horen. De JSON-code die dit oplevert, kun je in je Infrastructure as Code verwerken, bijvoorbeeld in je CloudFormation- of CDK-template. De JSON is daarbij leidend. Pas je die aan, dan verandert het plaatje van AWS Step Functions.

Eenvoudige error handling

Ook in de cloud gaat niet altijd alles goed. Misschien zit er nog een foutje in de code van je Lambda-functie of start AWS deze functie niet goed op. Gelukkig kun je tegenwoordig in AWS Step Functions eenvoudig reageren op dit soort fouten. Afhankelijk van het soort fout dat optreedt, kies je een verschillende vervolgstap.

Parameters van de state machine

Via JSON is het ook mogelijk om parameters in te stellen voor het uitvoeren van een taak binnen Step Functions. Je kunt in één set meerdere parameters meegeven of zelfs een lijst met meerdere parametersets. Zo’n parameterset heet een ‘map state’. In een map state worden een of meer taken van AWS Step Functions parallel gestart.

Loops gebruiken in AWS Step Functions

In AWS Step Functions kun je loops gebruiken. Voor een loop die een vast aantal keren draait, gebruik je een Lambda-functie als iterator. Het resultaat van de iterator is een nieuwe tellerwaarde en een boolean voor het al dan niet opnieuw doorlopen van de loop. Deze gegevens gaan door naar de volgende stap in AWS Step Functions. In die stap kijkt de software of de loop nog eens moet worden doorlopen. Nadat de taak het aantal ingestelde keren is herhaald, volgt een nieuwe aanroep van de iterator.

AWS Step functions #1

Ook variabele loops

Wil je loops met een variabel aantal doorloopkeren? Dat kan eveneens in AWS Step Functions. Bijvoorbeeld om per record in een DynamoDB-tabel een actie uit te voeren. De eerste stap van AWS Step Functions leest de ID’s van de te verwerken records uit. Deze ID’s worden teruggegeven als een lijst met strings. Een vooraf afgesproken string (bijvoorbeeld ‘DONE’) sluit de lijst af. Binnen de loop wordt de eerste string in de lijst gebruikt om een specifiek record uit DynamoDB op te vragen. Na het verwerken van dit record verdwijnt de eerste string van de lijst. De loop vergelijkt dan de nieuwe eerste string in de lijst opnieuw met de string die de lijst afsluit.

AWS Step functions #2

Integratie AWS Step Functions en andere AWS-services

In de afgelopen jaren is de integratie van AWS Step Functions met andere AWS-services uitgebreid. Zo hoef je voor het eerder genoemde uitlezen van een DynamoDB tabel niet langer een Lambda-functie te gebruiken. In plaats daarvan haalt AWS Step Functions het record rechtstreeks op uit DynamoDB. Dit soort integraties heb je ook voor SNS topics en SQS queues. Daarnaast zijn er service-integraties voor ECS, waarmee je containers serverless in Fargate draait. Zo start je ook taken die langer dan 15 minuten duren.

Asynchroon taken draaien

Meestal draaien taken in AWS Step Functions synchroon. Het voordeel is dat Step Functions wacht totdat een taak is afgerond. Maar je kunt een taak ook a-synchroon uitvoeren. Met AWS Batch geef je bijvoorbeeld met een parameter door aan AWS Step Functions hoelang de tool moet wachten tussen de controles of een bepaalde taak al is afgerond. Ook is het mogelijk aanvullende taken te laten uitvoeren tijdens het wachten.

AWS Step functions #3

Aanroepen AWS Step Functions

Je start AWS Step Functions vanuit de grafische userinterface of via de commandline. Maar dit kan ook geavanceerder, bijvoorbeeld door Event Bridge te laten reageren op events van andere AWS Services. Neem een voorbeeld waarbij Event Bridge AWS Step Functions aanroept nadat een virtuele machine net is gestart. AWS Step Functions controleert dan of er twee of meer virtuele machines actief zijn. Als dat zo is, gaat er een bericht naar een SNS topic. Een makkelijke uitbreiding is mogelijk door bijvoorbeeld bij een goedkoper instance type, zoals t2.micro, meer virtuele machines toe te staan dan bij duurdere types, zoals een m4.large.

In hybride omgevingen kan het handig zijn om een taak in AWS Step Functions direct achter een API Gateway te hangen. Via een POST request geef je naast de parameters voor de taak ook de (unieke) ‘Execution Name’ en ‘Amazon Resource Name’ van de taak mee. De POST is asynchroon: om het resultaat van de aangeroepen taak terug te krijgen, is een nieuwe aanroep naar AWS nodig.

Meer geavanceerde voorbeelden

Een mooi voorbeeld is ook een AWS Step Functions-taak die een Lambda-functie aanroept. Daarbij verstuurt de Lambda-functie een e-mail via een SNS topic. In het e-mailbericht wordt gevraagd of een bepaalde actie akkoord is of niet. De Step Function wacht tot iemand op een van beide links klikt. Zo’n link verwijst naar een API Gateway die een Lambda-functie aanroept. Deze Lambda-functie geeft een bericht door aan Step Functions. Doordat Step Functions na de eerste stap wacht tot het via de AWS API een bericht terugkrijgt, kan de wachttijd op een antwoord ook langer duren dan de 15 minuten die een Lambda-functie normaal gesproken maximaal draait.

AWS Step functions #4

Wil je meer weten? Neem contact op met Frederique Retsema.

Meer weten?

AWS Advanced Consulting PartnerOver onsOnze expertisesCloud Solutions

Wil je aansluiten bij ons expert team Cloud?