Wprowadzenie
AWS Lambda to responsywna usługa w chmurze, która sprawdza działanie aplikacji i reaguje wdrażając kod zdefiniowany przez programistę – kod ten nazywamy funkcjami. Lambdy automatycznie zarządzają zasobami obliczeniowymi w wielu strefach dostępności i skalują się pod wpływem liczby żądań. Kod lambd może być napisany w wielu językach takich jak C#, Java, Python, Node.js, etc. W kolejnym cyklu skupimy się na bardziej technicznym podejściu do tematu wykorzystując oczywiście nasz ulubiony język programowania.
Zanim przejdziemy dalej warto zwrócić uwagę na kilka wytycznych przy pisaniu kodu dla AWS Lambda:
- kod funkcji piszemy w stylu stateless - kod jest bezstanowy, tj. na jego wynik nie mają wpływu wcześniejsze zdarzenia;
-
nigdy nie deklarujemy żadnej zmiennej poza zakresem handler’a;
-
musimy mieć pewność, że nasze paczki ZIP (wymagane przez AWS) są przygotowane w odpowiedni sposób. Więcej na ten temat powiem jak będziemy publikować naszą pierwszą lambdę napisaną w języku C#;
- musimy pamiętać o usunięciu starych funkcji, kiedy nie będą nam już potrzebne.
Korzyści płynące z wykorzystania AWS Lambda
Zanim przejdziemy do właściwej konfiguracji warto zagłębić się nieco mocniej w szczegóły dotyczące AWS Lambda i tego co odróżnia ją od konkurencji. Podstawowa różnica dotyczy modelu pay-only-for-what-you-use.
Usługa pobiera zerowe koszty bazowe hostowania kodu – rachunki wystawiane są jedynie na podstawie tego, kiedy kod ten jest wykonywany. Inne usługi chmurowe zazwyczaj wystawiają rachunki za podstawowy hosting niezależnie od wykorzystania mocy obliczeniowej. Korzyść z wykorzystania takiego modelu jest oczywista – minimalizujemy koszty operacyjne. Comiesięczny koszt wynika jednie z czasu wykorzystania zasobów przez naszą aplikację a nie czasu działania serwera. Dodatkowa zaleta wynika z polityki rozliczeniowej AWS, która zaokrągla czas działania serwera do (jedynie) 100 milisekund a nie jak ma to miejsce w przypadku innych dostawców – do najbliższej godziny.
Automatyczna skalowalność jest kolejną niebywałą zaletą lambdy. W tym przypadku nie ma znaczenia czy w danej minucie wystarcza 5 żądań a następnej 5000. Lambda dostosowuje się do każdego nagłego skoku użycia a wszystko dzieje się bez naszej interwencji. Proces ten wyglądałby całkowicie inaczej, gdybyśmy nie korzystali z tradycyjnych rozwiązań w chmurze.
Spójrzmy na kilka ciekawych przypadków użycia, które możemy zaimplementować z wykorzystaniem AWS Lambdy:
-
Codziennie zadania - tworzenie automatycznych kopii zapasowych, generowanie raportów, pobieranie danych o zaplanowanej godzinie, itd.
-
Powiadomienia - w tym przypadku zastosowanie znajdzie każdy rodzaj powiadomień ale najwięcej korzyści zobaczymy implementując powiadomienia w czasie rzeczywistym. Po utworzeniu kolejek (o nich więcej w jednym z kolejnych wpisów) możemy utworzyć wyzwalacze, które zostaną uruchomione pod wpływem określonych polityk. Dodatkową zaletą jest możliwość integracji z różnymi komunikatorami takim jak Slack.
-
Przetwarzanie obiektów S3 - pracując nad jedną z aplikacji zauważyłem pewien problem związany z przetwarzaniem obrazów oraz generowaniem miniaturek. Wraz ze zwiększającą się liczbą obrazów wydajność aplikacji znacznie spadała. W takich sytuacjach idealnie sprawdza się Lambda. Z uwagi na automatyczną skalowalność funkcji oraz możliwość zaimplementowania zmiany rozmiaru obrazów, dostarczaniu różnych formatów oraz przechowywaniu ich na S3 nie odczujemy spadków wydajności w działaniu naszej aplikacji.
-
Chatboty - z tej możliwości jeszcze nie korzystałem ale automatyczne czatboty stanowią idealny przykład dla wykorzystania Lambdy. Kod możemy napisać w taki sposób, aby uruchamiał się, gdy użytkownicy wysyłają zapytanie do bota – zapłacimy wówczas tylko za czas kiedy nasz bot jest używany a nie za cały czas działania serwera.
Sam proces deployowania jest również bardzo prosty ponieważ może odbywać się z poziomu terminala. Jako programiści możemy skupić się na ulepszaniu naszego kodu a nie martwić się całą infrastrukturą. Dodatkowo możemy wykorzystać narzędzia, pokroju Pulumi, które pozwalają ‘napisać’ całą infrastrukturę w kodzie (TypeScript, C#, etc.)
Lambda pozwala również na integrację z SES (Simple Email Service). Dzięki takiemu podejściu możemy zaoszczędzić niezwykle dużo czasu związanego z pisaniem własnych powiadomień e-mail. Możemy wykorzystać rozwiązanie out-of-the-box, dokonać integracji i zaimplementować całą strategię marketingową dużo szybciej niż zwykle.
Jak skonfigurować Lambdę?
Myślę, że rozjaśniliśmy sobie dużo rzeczy związanych z funkcją Lambda. Możemy teraz przejść do naszej pierwszej konfiguracji, żeby zobaczyć jak cały proces wygląda w praktyce. Spójrzcie na poniższą listę 6 kroków:
-
Przechodzimy pod wskazany adres: https://console.aws.amazon.com/lambda/ lub wykorzystujemy wyszukiwarkę dostępnych usług podobnie jak w poprzednich przypadkach.
-
Z poziomu kolejnego ekranu klikamy przycisk Create Function oraz wybieramy Use a blueprint, żeby bazować na istniejącym przykładzie i nieco szybciej zrozumieć całą ideę:
-
Klikamy przycisk Configure i przechodzimy do zdefiniowania niezbędnych szczegółów takich jak nazwa funkcji czy rola, która definiuje uprawienia dla naszych funkcji:
Klikamy przycisk Create Function - dojdzie do utworzenia naszej pierwszej funkcji:
-
W celu przetestowania naszego kodu klikamy przycisk Test oraz konfigurujemy zdarzenie testowe:
Następnie klikamy przycisk Save.
-
Samo zdarzenie możemy wywołać klikając w link Test dostępny z poziomu panelu nawigacyjnego znajdującego się poniżej szczegółów naszej funkcji:
-
Na powyższym ekranie możemy zobaczyć, że wszystko przebiegło pomyślnie. Jeżeli chcemy mieć potwierdzenie, że doszło do wywołania funkcji możemy przejść do zakładki Monitor w celu podejrzenia logów naszej funkcji:
W tym momencie ten ekran może być dla Was mało czytelny. Możecie na nim zobaczyć dwie małe kropeczki, pierwsza związana z liczbą wywołań na poziomie 1 a druga na wykresie dotyczącym czasu trwania samego wywołania na poziomie 18.5 milisekund. Metryki CloudWatch to niezwykle potężne narzędzie, które zapewnia nam podgląd do szczegółów działania naszej aplikacji, poszczególnych komponentów, ruchu, błędów, itd.
Podsumowanie
Powyższa konfiguracja Lambdy oraz samo jej wykorzystanie może nie być dla Was czytelne ponieważ nie mamy żadnych połączeń z innymi komponentami architektury AWS. Na ten moment przygotowaną funkcję możemy porównać do prostej aplikacji konsolowej, która reaguje na parametry wejściowe.
W tym cyklu omawiamy jedynie poszczególne komponenty, żeby rozeznać się nieco lepiej w możliwościach jakie daje nam platforma AWS. W kolejnym cyklu napisanym z perspektywy języka C# dokonamy integracji różnych komponentów dzięki czemu zobaczycie jak możemy wykorzystać poszczególne usługi. Jeden z takich przykładów będzie polegał na dodaniu danych do DynamoDB. Dodanie danych spowoduje wywołanie Lambdy, która wyśle wiadomość email wykorzystując Amazon SES (Simple Email Service).