Paweł Łukasiewicz
2022-03-15
Paweł Łukasiewicz
2022-03-15
Udostępnij Udostępnij Kontakt
Wprowadzenie

Funkcja Lambda wykona zdefiniowany kod jeżeli zostanie wywołana pod wpływem różnych akcji, które omówiliśmy dwa wpisy temu. W tym rozdziale (zanim przygotujemy swoją pierwszą funkcję) omówimy cykl życia Lambdy. Składa się on z 4 kroków:

  • Tworzenie;
  • Wdrażanie;
  • Monitorowanie;
  • Rozwiązywanie problemów.

Tworzenie

Kod Lambdy może być napisany w jednym z wielu języków. W tym przypadku wykorzystamy język node.js, aby nadmiernie nie komplikować jednego z pierwszych wpisów (chodzi o brak wsparcia dla języka C# z poziomu edytora kodu konsoli AWS).

Jednocześnie, kod funkcji możemy pisać wykorzystując konsolę AWS, AWS CLI, Eclipse czy Visual Studio. W kolejnych wpisach będziemy posługiwać się głównie ostatnim środowiskiem.

Wdrażanie

Po napisaniu kodu naszej funkcji musimy dokonać jej wdrożenia. Istnieje kilka sposób na przejście przez ten krok:

  • kod dla naszej funkcji możemy napisać bezpośrednio w konsoli AWS - tworzymy najpierw funkcję a następnie korzystając z kreatora dokonujemy wszelkich zmian;
  • wykorzystujemy plik *.zip, który zawiera w sobie wszystkie pliki naszego projektu z zależnościami;
  • korzystamy ze specjalistycznego oprogramowania, które pozwala nam przygotować infrastrukturę przy wykorzystaniu kodu - infrastructure-as-code, np. wspominane wcześniej oprogramowanie Pulumi.

Testowanie i monitrowanie

Kod funkcji Lambda może zostać przetestowany wewnątrz konsoli AWS. Możliwe jest również testowanie z poziomu AWS CLI. Konsola AWS posiada również zdefiniowane zdarzenia, które możemy wykorzystać podczas testowania naszych funkcji.

Monitrowanie funkcji może odbywać się przy wykorzystaniu AWS CloudWatch.

Lambda: główne koncepcje

Przystępując do pisania funkcji Lambda należy poznać główne koncepcje, których musimy przestrzegać.

Handler
Handler to nazwa funkcji Lambda, od której rozpoczyna się wykonywanie. Nazwa ta pojawia się w konsoli AWS: Lambda: nazwa funkcji Handler jest naszym entry-pointem - jeżeli zmienicie nazwę pamiętajcie, żeby tą samą zmianę dokonać w kodzie i kliknąć przycisk Deploy. W przeciwnym razie zobaczycie poniższy komunikat: Lambda: niepoprawna nazwa handlera

Parametry przekazywane do handler’a
W przypadku kodu udostępnionego przez AWS możecie zobaczyć, że do metody zostało przekazane zdarzenie (event) oraz kontekst (context): Lambda: parametry Event zawiera wszystkie szczegóły dotyczące użytego wyzwalacza. Context przenosi informacje związane ze środowiskiem uruchomieniowym dla funkcji Lambda. Zaliczamy do nich parametry takie jak nazwa funkcji, nazwy grup CloudWatch (do monitrowania funkcji), szczegóły arn (Amazon Resource Names) czy timeout określający maksymalny czas wykonywania funkcji.

Spójrzmy jednak jak wygląda analiza kodu w praktyce. Dokonamy drobnych zmian w celu podejrzenia log’a:

console.log('Loading function');

exports.handler_check = async (event, context) => {
    console.log('Zdarzenie:', JSON.stringify(event, null, 2));
    console.log('Kontekst:', JSON.stringify(context, null, 2));
    
    return event.key1;  // Echo back the first key value
    // throw new Error('Something went wrong');
};

Po wykonaniu powyższego kodu możemy podejrzeć efekt jego działania: Lambda: test funkcji Na ten moment dla nas najważniejsze są parametry o których wspomniałem powyżej, tj. nazwa funkcji, nazwa dziennika zdarzeń czy awsRequestId - z tych parametrów będziemy korzystali niejednokrotnie na kolejnych etapach.

Logi
Logi dodane wewnątrz funkcji Lambda wyświetlane są w AWS CloudWatch, gdy dana funkcja jest wykonywana. Składnia logów będzie się różnić w zależności od wybranego języka. Dla node.js używanego w ramach przykładu będzie to console.log. Przejdźmy zatem do danej grupy logów w CloudWatch w celu podejrzenia dziennika zdarzeń: Lambda: podgląd dziennika zdarzeń

Obsługa błędów
Funkcja Lambda używa funkcji wywołania zwrotnego (callback), która jest używana do powiadomienia funkcji Lambda o wystąpieniu błędu lub pomyślnym wykonaniu kodu. Podobnie jak w przypadku logowania, obsługa błędów, będzie się różniła w zależności od wybranego języka. Spójrzmy na poniższy przykład w celu lepszego zrozumienia mechanizmu:

console.log('Loading function');

exports.handler_check = async (event, context, callback) => {
    // console.log('Zdarzenie:', JSON.stringify(event, null, 2));
    // console.log('Kontekst:', JSON.stringify(context, null, 2));
    
    var error = new Error("Cos poszlo nie tak");
    callback(error);
    
    return event.key1;  // Echo back the first key value
    // throw new Error('Something went wrong');
};
Wynikiem wykonania powyższego kodu będzie poniższy log: Lambda: błąd funkcji

Jesteśmy gotowi na kolejne kroki. Tym razem utworzymy swoją pierwszą funkcję Lambda wykorzystując język C#.