AWS Step Functions
Wszyscy uwielbiamy funkcje Lambda. Prawda? Wszyscy? No… W tyle głowy tli mi się jednak myśl, że czasem potrzeba czegoś więcej. Czegoś, co pozwoli na zarządzanie i koordynację wielu funkcji Lambda w oparciu o jakiś workflow na przykład. Potrzebujemy użyć warunków, funkcji pracujących równolegle? Możemy jako takiego orkiestratora wykorzystać kolejną Lambdę. Możemy użyć, pojawiającego się jeszcze na egzaminach associate, SWF – Simple Workflow Service. W 2016 roku podczas re:Invent ukazały się jednak światu AWS Step Functions. Na co nam pozwalają? Na zarządzanie wywołaniami funkcji Lambda. A każda Lambda jest odpowiedzialna za konkretną czynność i skaluje się niezależenie od pozostałych.
Czym jest taka Step Function? Składa się z dwóch elementów. Z tasków (czynności) i maszyny stanów. Dziś, w pierwszej części serii o AWS Step Functions, prosty przykład.
Jak?
Przykład, którym się zajmiemy, to prosta funkcja wywołująca Lambdę. Jej zadaniem będzie połączenie stringów zawartych w tablicy, w jeden łańcuch znaków, który zwrócimy z naszej step function. Kod naszej Lambdy w Pythonie jest banalny:
def lambda_handler(event, context): strings = ' '.join(event['strings']) return strings
Nazwijmy naszą Lambdę np. CombineStrings, utwórzmy ją i zapamiętajmy jej arn.
W konsoli AWS wchodzimy do Step Functions, tworzymy nową fukncję wybierając Templates i Hello world.
Naszym oczom powinny ukazać sie dwa okna. Po lewej stronie kod napisany w Amazon States Language, a po prawej diagram przedstawiający działanie funkcji. Zajmijmy się kodem, który definiuje tak naprawdę maszynę stanów.
Stany mogą przyjmowac różne wartości. W przykładzie widzimy Pass, który po prostu przekazuje dane z jednego miejsca w drugie, ale możliwe są inne wartości:
- Task – umozliwia wykonanie czynności,
- Choice – decyzja pomiędzy wieloma czynnościami,
- Wait – zapewnia opóźnienie pomiędzy wykonaniami,
- Parallel – uruchamia równolegle kilka czynności,
- Succeed / Fail – zatrzymuje wykonanie ze statusem Fail lub Success.
My użyjemy stanu Task. Jako czynnośc możemy wykorzystać funkcje Lambda lub activities. My użyjemy naszej Lambdy, zamieniamy więc kod na poniższ
{ "Comment": "Step function joining strings using a space", "StartAt": "JoinStrings", "States": { "JoinStrings": { "Type": "Task", "Resource": "arn:naszej:funkcji:lambda", "ResultPath" : "$.CombinedStrings", "End": true } } }
Przeanalizujmy. Na początku mamy komentarz. Dobrze jest opisać co dana funkcji robi. W linii 3 określamy stan, od którego funkcja zaczyna działanie. W naszym przypadku jest to stan z etykietą JoinStrings. W linii 4 zaczynają się stany. W naszym przypadku mamy tylko jeden stan, którego zadaniem jest wywołanie naszej Lambdy. Za pomocą ResultPath ustawiamy „ścieżkę”, która zwróci nam dane.
W tym momencie nasza „maszyna stanów” powinna się utworzyć.
Wybieramy naszą maszynę
wpisujemy dane do przetworzenia i uruchamiamy ją.
Jeżeli wszystko poszło dobrze, naszym oczom powinien ukazać się raport o powodzeniu operacji.
W raporcie dostępne są także dane wejściowe do naszej funkcji (Input), jak i dane zwracane (Output).
Działa? Działa. Przykład bardzo prosty i mało życiowy. Na początek jednak wystarczy. Pokazuje jak zacząć korzystać z AWS Step Functions.
Kiedy?
Na przykład wtedy, kiedy mamy rozstrzygnąć czy wywołujemy Lambdę A czy Lambdę B. Także gdy chcemy wykonać jakąś akcję po jakimś czasie lub o określonym czasie. Możemy także na przykład wywołać równolegle dwie funkcjie Lambda lub przekazać dane z jednej Lambdy do drugiej.
Co dalej?
Step functions są jednym z ciekawszych klocków z kompletu serverless. W jednym z kolejnych wpisów postaram się pokazać coś bardziej skomplikowanego. Warto jednak już teraz zapoznać się chociaż z dostępnymi w konsoli AWS szablonami.
i zerknąć na opis Amazon States Language.