Tłumaczenie artykułu przygotowano specjalnie dla studentów kursu . Zastanawiasz się nad rozwojem w tym kierunku? Zobacz warsztat Egora Zuewa (TeamLeada w firmie InBit) i dołącz do najbliższej grupy kursu: start 26 września.

Coraz więcej osób przechodzi na AWS Lambda ze względu na skalowalność, wydajność, oszczędności oraz możliwość przetwarzania milionów, a nawet bilionów zapytań miesięcznie. Nie ma potrzeby zarządzania infrastrukturą, na której działa usługa. Automatyczne skalowanie pozwala obsługiwać tysiące równoczesnych zapytań na sekundę. Uważam, że AWS Lambda można z powodzeniem nazwać jedną z najpopularniejszych usług AWS.
AWS Lambda
AWS Lambda to wydarzeniowo-zorientowana usługa bezserwerowych obliczeń, która umożliwia uruchamianie kodu bez konieczności przydzielania i zarządzania serwerami oraz uzupełnia inne usługi AWS w oparciu o logikę użytkownika. Lambda automatycznie reaguje na różne wydarzenia (tzw. wyzwalacze), na przykład na żądania HTTP przez Amazon API Gateway, zmiany danych w koszach Amazon S3 lub tabelach Amazon DynamoDB; można również uruchomić swój kod przez wywołania API, używając AWS SDK i przejść między stanami w AWS Step Functions.
Lambda uruchamia kod na wysoko dostępnej infrastrukturze obliczeniowej i w pełni odpowiada za administrację poniższej platformy, w tym za konserwację serwerów i systemu operacyjnego, przydzielanie zasobów, automatyczne skalowanie, monitorowanie kodu i prowadzenie dzienników. Oznacza to, że wystarczy załadować swój kod i skonfigurować, jak i kiedy ma być uruchamiany. Usługa zatroszczy się o jego uruchomienie i zapewni wysoką dostępność twojej aplikacji.
Kiedy przejść na Lambda?
AWS Lambda to wygodna platforma obliczeniowa, odpowiednia do wielu scenariuszy zastosowań, oczywiście pod warunkiem, że język i środowisko uruchomieniowe twojego kodu są wspierane przez usługę. Jeśli chcesz skupić się na kodzie i logice biznesowej, powierzając administrację serwerami, przydzielanie zasobów i skalowanie zewnętrznemu dostawcy za rozsądne pieniądze, zdecydowanie warto przejść na AWS Lambda.
Lambda doskonale nadaje się do tworzenia interfejsów programistycznych, a jeśli korzystać z usługi razem z API Gateway, można znacznie obniżyć koszty i szybciej wprowadzić na rynek. Są różne sposoby wykorzystania funkcji Lambda i warianty organizacji architektury bezserwerowej — każdy może wybrać coś odpowiedniego w zależności od postawionego celu.
Lambda umożliwia wykonywanie szerokiego wachlarza zadań. Dzięki wsparciu CloudWatch można tworzyć zadania zaplanowane oraz automatyzować poszczególne procesy. Nie ma żadnych ograniczeń co do charakteru i intensywności korzystania z usługi (brane pod uwagę są zużycie pamięci i czas), i nic nie stoi na przeszkodzie, by systematycznie pracować nad pełnoprawnym mikroserwisem opartym na Lambda.
Można tutaj tworzyć działania zorientowane na usługi, które nie są wykonywane przez cały czas. Typowym przykładem jest skalowanie obrazów. Nawet w przypadku systemów rozproszonych funkcje Lambda nie tracą na znaczeniu.
Zatem, jeśli nie chcesz zajmować się alokacją i administracją zasobów obliczeniowych — wypróbuj AWS Lambda; jeśli nie potrzebujesz ciężkich, zasobożernych obliczeń — również wypróbuj AWS Lambda; jeśli twój kod jest wykonywany okresowo — dokładnie, warto spróbować AWS Lambda.
Bezpieczeństwo
Jak dotąd nie ma zastrzeżeń co do bezpieczeństwa. Z drugiej strony, ponieważ wiele wewnętrznych procesów i aspektów realizacji tego modelu jest ukrytych przed użytkownikiem zarządzanego środowiska uruchomieniowego AWS Lambda, niektóre ogólnie przyjęte zasady bezpieczeństwa w chmurze tracą swoją aktualność.
Jak większość usług AWS, Lambda jest świadczona na zasadzie wspólnej odpowiedzialności AWS i klienta w zakresie bezpieczeństwa oraz zgodności z przepisami. Ta zasada redukuje obciążenie operacyjne dla klienta, ponieważ AWS przejmuje zadania obsługi, administracji i monitorowania komponentów usługi — od systemu operacyjnego hosta i poziomu wirtualizacji po fizyczne bezpieczeństwo obiektów infrastruktury.
Mówiąc konkretnie o AWS Lambda, AWS odpowiada za zarządzanie infrastrukturą, powiązanymi podstawowymi usługami, systemem operacyjnym i platformą aplikacyjną. Podczas gdy klient ponosi odpowiedzialność za bezpieczeństwo swojego kodu, przechowywanie danych wrażliwych, kontrolę dostępu do nich oraz do usługi i zasobów Lambda (Identity and Access Management, IAM), w tym w ramach używanych funkcji.
Na poniższym schemacie przedstawiona jest model wspólnej odpowiedzialności, stosowany do AWS Lambda. Sfera odpowiedzialności AWS jest zaznaczona na pomarańczowo, a odpowiedzialność klienta - na niebiesko. Jak widać, AWS przejmuje większą odpowiedzialność za aplikacje wdrażane na tej usłudze.

Model wspólnej odpowiedzialności, stosowany do AWS Lambda
Środowisko uruchomieniowe Lambda
Główną zaletą Lambda jest to, że realizując funkcję w twoim imieniu, usługa sama przydziela niezbędne zasoby. Nie musisz tracić czasu i wysiłku na zarządzanie systemami i możesz skupić się na logice biznesowej oraz pisaniu kodu.
Usługa Lambda dzieli się na dwie płaszczyzny. Pierwsza to płaszczyzna zarządzania. Zgodnie z definicją na Wikipedii, płaszczyzna zarządzania (control plane) jest częścią sieci odpowiedzialną za transport sygnałów i routowanie. Jest to główny komponent podejmujący globalne decyzje o alokacji, utrzymaniu i rozdzielaniu obciążeń. Ponadto, płaszczyzna zarządzania pełni rolę topologii sieciowej dostawcy rozwiązania, odpowiadającej za routowanie i zarządzanie ruchem.
Druga płaszczyzna to płaszczyzna danych. Podobnie jak płaszczyzna zarządzania, ma swoje zadania. Płaszczyzna zarządzania udostępnia API do zarządzania funkcjami (CreateFunction, UpdateFunctionCode) oraz kontroluje interakcję Lambda z innymi usługami AWS. Płaszczyzna danych zarządza API wywołań (Invoke API), które uruchamia funkcje Lambda. Po wywołaniu funkcji płaszczyzna zarządzania przydziela lub wybiera istniejące, wcześniej przygotowane dla tej funkcji środowisko uruchomieniowe, a następnie wykonuje kod.
AWS Lambda obsługuje wiele języków programowania, w tym Java 8, Python 3.7, Go, NodeJS 8, .NET Core 2 i inne, poprzez odpowiednie środowiska wykonawcze. AWS regularnie je aktualizuje, wydaje poprawki zabezpieczeń i realizuje inne operacje konserwacyjne tych środowisk. Lambda pozwala na używanie innych języków, pod warunkiem, że samodzielnie wdrożysz odpowiednie środowisko wykonawcze. W takim przypadku będziesz odpowiedzialny za jego konserwację, w tym za monitorowanie bezpieczeństwa.
Jak to wszystko działa i jak usługa będzie wykonywać Twoje funkcje?
Każda funkcja działa w jednym lub kilku dedykowanych środowiskach, które istnieją jedynie w czasie życia tej funkcji, a następnie są niszczone. W każdym środowisku jednocześnie wykonywane jest tylko jedno wywołanie, ale jest ono wielokrotnie wykorzystywane, gdy występuje wiele sekwencyjnych wywołań tej samej funkcji. Wszystkie środowiska wykonawcze działają na wirtualnych maszynach z wirtualizacją sprzętową — tzw. microVM. Każda microVM jest przypisywana do konkretnego konta AWS i może być wielokrotnie używana przez środowiska do wykonywania różnych funkcji w tym koncie. MicroVM są pakowane w moduły sprzętowe platformy Lambda Worker, która jest własnością i jest zarządzana przez AWS. To samo środowisko wykonawcze nie może być używane przez różne funkcje, tak jak microVM są unikalne dla różnych kont AWS.

Model izolacji w AWS Lambda
Izolacja środowisk wykonawczych realizowana jest za pomocą kilku mechanizmów. Na najwyższym poziomie każda ze środowisk posiada oddzielne kopie następujących komponentów:
- Kod funkcji
- Wszystkie warstwy Lambda wybrane dla funkcji
- Środowisko wykonawcze funkcji
- Minimalna przestrzeń użytkownika oparta na Amazon Linux
Do izolacji różnych środowisk wykonawczych stosowane są następujące mechanizmy:
- cgroups — ograniczenie dostępu do zasobów CPU, pamięci, przepustowości pamięci masowej i sieci dla każdej ze środowisk wykonawczych;
- namespaces — grupowanie ID procesów, ID użytkowników, interfejsów sieciowych i innych zasobów, którymi zarządza jądro Linux. Każde środowisko wykonawcze działa w swoim własnym przestrzeni nazw;
- seccomp-bpf — ograniczenie wywołań systemowych, które można używać w środowisku wykonawczym;
- iptables i tabele routingu — izolacja środowisk wykonawczych między sobą;
- chroot — zapewnienie ograniczonego dostępu do niższego systemu plików.
W połączeniu z własnościowymi technologiami izolacji AWS, wymienione mechanizmy gwarantują solidny podział środowisk uruchomieniowych. Izolowane w ten sposób środowiska nie mogą uzyskiwać dostępu do danych innych środowisk ani ich zmieniać.
Chociaż kilka środowisk uruchomieniowych jednego konta AWS może działać na jednej microVM, w żadnym wypadku microVM nie mogą być współdzielone przez różne konta AWS. Do izolacji microVM w AWS Lambda wykorzystywane są tylko dwa mechanizmy: instancje EC2 i Firecracker. Izolacja gości (guest isolation) w Lambda na podstawie instancji EC2 stosowana jest od 2015 roku. Firecracker to nowy hipernadzorca o otwartym kodzie źródłowym, zaprojektowany specjalnie przez AWS do bezserwerowych obciążeń, wprowadzony w 2018 roku. Fizyczny sprzęt, na którym działają microVM, jest współdzielony między obciążenia różnych kont.
Zachowywanie środowisk i stanów procesów
Chociaż środowiska uruchomieniowe Lambda są unikalne dla różnych funkcji, można w nich ponownie wywołać tę samą funkcję, co oznacza, że środowisko uruchomieniowe może istnieć przez kilka godzin, zanim zostanie zniszczone.
W każdej środowisku uruchomieniowym Lambda znajduje się także system plików z zezwoleniem na zapis, dostępny przez katalog /tmp. Nie można uzyskiwać dostępu do jego zawartości z innych środowisk uruchomieniowych. Jeśli chodzi o zachowanie stanów procesów, pliki zapisane w /tmp istnieją przez cały cykl życia środowiska uruchomieniowego. Dzięki temu możliwe jest akumulowanie wyników kilku wywołań, co jest szczególnie przydatne w przypadku kosztownych operacji, takich jak ładowanie modeli uczenia maszynowego.
Przesyłanie danych wywołań
Interfejs Invoke API można wykorzystać w dwóch trybach: trybie zdarzeń i trybie 'żądanie — odpowiedź'. W trybie zdarzeń wywołanie jest dodawane do kolejki do późniejszego wykonania. W trybie 'żądanie — odpowiedź' funkcja jest wywoływana natychmiast z dostarczonym ładunkiem użytecznym, po czym zwracana jest odpowiedź. W obu przypadkach funkcja jest wykonywana w środowisku Lambda, ale z różnymi ścieżkami ładunku użytecznego.
Podczas wywołań typu „żądanie — odpowiedź” ładunek trafia od API przetwarzania żądań (API Caller), takiego jak AWS API Gateway lub AWS SDK, do load balancera, a następnie do usługi wywoływania funkcji Lambda (Invoke Service). Ta ostatnia określa odpowiednie środowisko do wykonania funkcji i przekazuje tam ładunek, aby zakończyć wywołanie. Load balancer otrzymuje ruch z zabezpieczeniem TLS przez Internet. Ruch wewnątrz usługi Lambda — po load balancerze — przechodzi przez wewnętrzny VPC w danym regionie AWS.

Model przetwarzania wywołań AWS Lambda: tryb „żądanie — odpowiedź”
Wywołania oparte na zdarzeniach mogą być wykonywane natychmiastowo lub dodawane do kolejki. W niektórych przypadkach kolejka jest realizowana za pomocą usługi Amazon SQS (Amazon Simple Queue Service), która przekazuje wywołania do usługi wywoływania funkcji Lambda za pomocą wewnętrznego procesu pollingowego (poller). Przekazywany ruch jest zabezpieczony TLS, przy czym niewielkie dodatkowe szyfrowanie danych przechowywanych w Amazon SQS nie jest przewidziane.
Wywołania oparte na zdarzeniach nie zwracają odpowiedzi — wszelkie informacje zwrotne Lambda Worker są po prostu ignorowane. Wywołania oparte na zdarzeniach z Amazon S3, Amazon SNS, CloudWatch i innych źródeł są przetwarzane przez usługę Lambda w trybie zdarzeń. Wywołania z potoków Amazon Kinesis i DynamoDB, wywołania kolejek SQS, load balancera aplikacji oraz API Gateway są przetwarzane w trybie „żądanie — odpowiedź”.
Monitoring
Możesz monitorować i audytować funkcje Lambda za pomocą różnych mechanizmów i usług AWS, w tym następujących.
Amazon CloudWatch
Zbiera różne dane statystyczne, takie jak liczba żądań, czas trwania realizacji żądań oraz liczba żądań zakończonych błędem.
Amazon CloudTrail
Umożliwia prowadzenie dzienników, ciągły monitoring oraz tymczasowe gromadzenie informacji o aktywności w koncie związanej z Twoją infrastrukturą AWS. Będziesz miał pełną chronologię działań dokonanych za pomocą konsoli AWS Management Console, AWS SDK, narzędzi wiersza poleceń i innych usług AWS.
AWS X-Ray
Zapewnia pełną widoczność wszystkich etapów przetwarzania żądań w Twojej aplikacji na podstawie mapy jej wewnętrznych komponentów. Umożliwia analizowanie aplikacji w trakcie rozwoju oraz w środowisku produkcyjnym.
AWS Config
Będziesz mógł śledzić zmiany konfiguracji funkcji Lambda (w tym ich usunięcie) oraz środowiska uruchomieniowego, tagi, nazwy handlerów, rozmiar kodu, przydział pamięci, ustawienia czasu oczekiwania i parametry równoległości, a także rolę wykonawczą Lambda IAM, podsieci i przypisanie grup zabezpieczeń.
Podsumowanie
AWS Lambda oferuje potężny zestaw narzędzi do tworzenia bezpiecznych i skalowalnych aplikacji. Wiele metod zapewniania bezpieczeństwa i zgodności w AWS Lambda jest podobnych do tych stosowanych w innych usługach AWS, chociaż są wyjątki. Na marzec 2019 roku Lambda spełnia wymagania SOC 1, SOC 2, SOC 3, PCI DSS, ustawy USA o zgodności i odpowiedzialności w zakresie ochrony zdrowia (HIPAA) oraz innych przepisów. Dlatego, gdy myślisz o wdrożeniu nowej aplikacji, rozważ usługę AWS Lambda — być może jest idealna dla Twojego zadania.
Źródło: habr.com
