Lambda jest usługą chmurową, która wszelkie obliczenia wykonuje bez użycia serwera. Kod jest wykonywany na podstawie odpowiedzi na zdarzenia z usług AWS takich jak: dodawawanie/usuwanie plików z S3, aktualizacja danych w tabeli DynamoDB czy otrzymanie żądania HTTP z bramki API.
Rozpoczęcie pracy z usługą polega na napisaniu kodu a następnie dodaniu go do danej usługi. Wszystkie inne zadania i zasoby takie jak infrastruktura, system operacyjny, utrzymanie serwera, monitorowanie kodu, logi czy ustawienia bezpieczeństwa są obsługiwane przez AWS.
Lambda obsłguje takie języki jak Java, NodeJS, Python, Go czy C#.
Jak działa Lambda?
Spójrzcie na poniższy schemat blokowy, który w kilku krokach opisuje działanie Lambdy:
Dostarczenie kodu w jednym z języków obsługiwanych przez funkcję Lambda.
Wybór usług, które będą ’triggerować’Lambdę, np. dodanie nowego pliku do S3.
Zdarzenie, które wyzwala usługę.
Wykonanie kodu Lambda na skutek jednego z poniższych scenariuszy:
dodanie nowego pliku do S3;
wykonanie żądania get/post
do punktu końcowego HTTP;
dodanie/aktualizacja/usunięcie danych z tabeli DynamoDB;
powiadomienia push z SNS (Simple Notification Service);
zebranie strumienia danych;
wysyłanie wiadomości e-mail;
zdarzenie nadchodzące z aplikacji mobilnej, itd.
Pobranie opłaty za wykonany kod.
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.
Zdarzenia na które reaguje Lambda:
dodanie obiektu na S3;
dodanie/aktualizacja/usunięcie danych z DynamoDB;
powiadomienia push z SNS (Simple Notification Service);
wywołanie żądania GET/POST do API Gateway;
modyfikacja nagłówków w przeglądarce lub origin request/reponse w CloudFront;
wpisy do dziennika logów w strumieniu AWS Kinesis;
historia logów w CloudTrial.
Przykładowe przypadki użycia
Lambda i S3 S3 przekazuje szczegóły zdarzenia do Lambdy, gdy dochodzi do załadowania pliku w S3. Szczegóły dotyczące przesłania/usunięcia/przeniesienia pliku przekazywane są do funkcji. Przygotowany kod może podjąć kroki związane z obsługą danego zdarzenia, np. utworzenie miniaturki dla obrazu dodanego do S3.
Lambda i DynamoDB: DynamoDB może wywołać Lambdę w momencie, gdy dochodzi do dodania, zaktualizowania czy usunięcia danych w tabeli. Funkcja otrzyma wszystkie szczegóły dotyczące operacji wykonanej na tabeli DynamoDB.
API Gateway i Lambda: API Gateway może wyzwolić funkcję na metodach GET/POST. Prostym przykładem może być utworzenie formularza, który udostępnia szczegóły punktu końcowego dla API Gateway. Wraz z momentem zapisania zmian dojdzie do wykonania żądania, żądanie spowoduje wywołanie funkcji Lambda, funkcja dokona dodania danych do tabeli w bazie danych DynamoDB.
SNS i Lambda:
Usługa wysyłania powiadomień pozwala na wysłanie wiadomości SMS, e-mail czy powiadomień push. Każde z tych zdarzeń może wyzwolić funkcję Lambda.
Zaplanowane zdarzenia i Lambda:
Zaplanowane zdarzenia mogą zostać użyte dla tzw. cron jobs w celu uruchomienia Lambdy i wykonania zadania w określonym czasie.
CloudTrail i Lambda: CloudTrail może być wykorzystany do monitorowania logów na naszym koncie dla różnych usług, których używamy. Lambda może zostać wykorzystana do dalszego przetwarzania wszelkich zdarzeń.
Kinesis i Lambda: Kinesis jest używany do przechwytywania/przechowywania danych śledzenia w czasie rzeczywistym pochodzących np. z kliknięć na stronie internetowej, logów, kanałów mediów społecznościowych, itd. Wraz z pojawieniem się nowych danych Lambda może wykonać dodatkowe działania na otrzymanych informacjach.
CloudFront i Lambda: CloudFront pozwala na dostarczanie treści na stronę internetową z najbliższej lokalizacja w celu zmniejszenia czasu ładowania witryny. Z kolei Lambda może być używana do przetwarzania nagłówków pochodzących z żądania przeglądarki w celu przepisania adresów URL używnych do testowania AB.