AWS Step Functions

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.

Comments are closed.