Jak przekazać dane z funkcji Lambda do… funkcji Lambda
W czasach gdy zewsząd dociera do nas słowo serverless, w końcu zdamy sobie sprawę co tak naprawdę ono znaczy i ile może nam oszczędzić pieniędzy (nie tylko w tzw. compute, ale także w tworzeniu naszych rozwiązań). Sercem serverless w AWS jest Lambda. W żywych organizmach nie występują dwa serca, ale w naszej programistycznej praktyce szybko spotkamy się z tym problemem. Będziemy mieli dwa lub więcej serc i będziemy chcieli je połączyć. Staniemy wtedy przed kilkoma problememi, między innymi tym, jak przekazać dane z jednej funkcji Lambda do innej funkcji Lambda.
Pisałem już kilka razy o AWS Step Functions. Zarówno o podstawach jak i trochę głębiej. W skrócie, pozwala ona na łączenie różnych usług AWS w jedną całość. I przesyłanie danych pomiędzy nimi. Także w zasobach samego AWS możecie znaleźć fajny tutorial, jak taką maszynę stanów stworzyć. StepFunctions przydadzą nam się w naszym „problemie”.
Scenariusz
Nie będziemy tworzyli żadnego rozwiązania rocket science. Wrzucimy po prostu jakiś ciąg znaków do funckji Lambda. Następnie go zmienimy i przekażemy do innej Lambdy. Tam ponownie go zmienimy.
Można to zrobić na przykład poprzez wywołanie jednej funkcji Lambda z drugiej. Można także posłużyć się usługą SNS lub SQS. My zrobimy to jednak za pomocą AWS StepFunctions.
Lambdy
Obie funkcje będą do siebie bardzo podobne. Do każdej z nich przekażemy ciąg znaków, do którego dodamy Lambda 1 lub Lambda 2. Jak tworzyć funkcje Lambda pokazywałem już kilka razy. Nie będę więc przechodził po kolei przez wszystkie opcje.
Obie funkcje utworzone w Pythonie.
Kod pierwszej Lambdy to
def lambda_handler(event, context):
print(event['text'])
data = {"text" : event['text'] + ' Lambda 1'}
return data
a drugiej
def lambda_handler(event, context):
print(event['text'])
data = {"text" : event['text'] + ' Lambda 2'}
return data
Założenie jest takie, że wywołujemy Lambdę 1 i przekazujemy do niej
{
"text": "jakis tekst"
}
zwracamy z niej
{
"text": "jakis tekst Lambda 1"
}
a wynik idzie do Lambdy nr 2, z której powinniśmy otrzymać
{
"text": "jakis tekst Lambda 1 Lambda 2"
}
Macie utworzone obie funkcje? Jeżeli tak to przechodzimy do
StepFunction
StepFunctions pozwalają na bardzo proste połączenie naszych funckji Lambda w całość i przekazanie danych pomiędzy nimi.
Twrzymy więc nową StepFunction. Jako *State machine definition* wklejamy poniższy kod. Pamiętać tylko trzeba o poprawieniu ARN na prawidłowe.
{
"Comment": "Passing data",
"StartAt": "Step1",
"States": {
"Step1": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-2:xxxxxxxxxxxx:function:Lambda1",
"Next": "Step2"
},
"Step2": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-west-2: xxxxxxxxxxxx:function:Lambda2",
"End": true
}
}
}
Powinniśmy otrzymać workflow jak na obrazku poniżej.
Klikamy w button Start execution. W polu input – Optional wpisujemy nasze dane, które chcemy przekazać do funkcji Lambda. W naszym przypadku może to być np.:
{
"text": "Jakieś znaki"
}
Klikamy jeszcze raz Start execution i po chwili, jeżeli nie mieliśmy nigdzie błędu, nasza StepFunction zakończy działanie.
Jeżeli klikniemy w Step1 to po prawej stronie wyświetlą się szczegóły tego kroku.
Widać do zostało przekazane jako Input i co do nas wróciło. To samo dla kroku drugiego.
Koniec?
Tak. Przekazanie danych pomiędzy dwiema funkcjami Lambda jest naprawdę bardzo proste. Zobaczyliśmy jak można wykorzystać do tego StepFunctions.