Paweł Łukasiewicz
2022-02-25
Paweł Łukasiewicz
2022-02-25
Udostępnij Udostępnij Kontakt
Wprowadzenie

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: AWS: przykładowy diagram wykonania usługi

  1. Dostarczenie kodu w jednym z języków obsługiwanych przez funkcję Lambda.
  2. Wybór usług, które będą ’triggerować’ Lambdę, np. dodanie nowego pliku do S3.
  3. Zdarzenie, które wyzwala usługę.
  4. 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.
  5. 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.

Podsumowanie

Jeżeli jeszcze nie macie konta odsyłam do wpisu:

Jeżeli jeszcze nie korzystaliście z konsoli AWS odsyłam do wpisu

Po wykonaniu powyższych kroków możemy przejść do kolejnego punktu jakim jest konfiguracja naszego środowiska.