Jeśli planujesz wdrożyć architekturę serwerless w środowisku AWS, lub choćby jej fragment, kluczowym elementem stanie się usługa AWS Lambda.
Jest to usługa obliczeniowa typu serverless, umożliwiająca uruchamianie kodu (najczęściej pisanego w Node.JS lub Pythonie) bez konieczności zarządzania infrastrukturą serwerową. Poprzez łączenie wielu funkcji AWS Lambda, możesz kreować złożone procedury i procesy.
Istotnym aspektem funkcjonowania Lambda jest jednak ograniczenie czasu realizacji. To właśnie ten limit determinuje, w jakich scenariuszach AWS Lambda znajdzie swoje optymalne zastosowanie.
Źródło: aws.amazon.com
Czym jest limit czasu?
Limit czasu dla funkcji AWS Lambda to parametr określający maksymalny czas, przez jaki funkcja może działać, zanim zostanie automatycznie zatrzymana.
Funkcje Lambda zostały zaprojektowane z myślą o krótkotrwałych i bezstanowych operacjach – i w takim charakterze powinny być wykorzystywane. Często zdarza się jednak, że zespoły próbują używać Lambdy do obsługi długotrwałych procesów, chcąc skorzystać z zalet serwerless. Uruchomienie kodu w ten sposób jest zazwyczaj znacznie tańsze, gdyż nie wymaga utrzymywania serwera z określoną konfiguracją zasobów. Intencja jest więc zrozumiała.
Niemniej jednak, zbyt długie działanie funkcji może generować problemy związane z obciążeniem zasobów i wydajnością. Istnieje ryzyko zablokowania zasobów. Ponadto, przy długotrwałych procesach łatwo zaniedbać optymalizację kodu, a czas oczekiwania na poziomie kilku minut przestaje być postrzegany jako problem. Pozostawienie go w obecnym stanie może jednak być niekorzystne dla efektywności.
Domyślny limit czasu dla funkcji Lambda wynosi zaledwie 3 sekundy. W takim scenariuszu kod wykonywany w Lambda musi zakończyć się w tak krótkim czasie. Jest to idealne rozwiązanie, gdy budujemy architekturę o wysokiej szybkości reakcji i obsłudze dużej liczby transakcji w krótkim czasie. Ogranicza to jednak możliwości wykorzystania Lambda, dlatego limit można zwiększyć do 900 sekund (15 minut). Po przekroczeniu limitu funkcja Lambda zostaje zakończona i zwraca kod błędu.
Jak skonfigurować limit czasu?
Źródło: aws.amazon.com
Limit czasu dla funkcji Lambda można ustawić za pomocą konsoli AWS Management Console, interfejsu CLI AWS lub zestawów SDK AWS.
Oto szczegółowe kroki:
Możesz również użyć wiersza poleceń AWS CLI, aby zaktualizować limit czasu funkcji. Przykładowe polecenie wygląda następująco:
aws lambda update-function-configuration --function-name [Nazwa_Funkcji_Lambda] --timeout 900
Powyższe polecenie ustawia limit czasu dla funkcji o nazwie [Nazwa_Funkcji_Lambda] na 15 minut. Wystarczy zastąpić [Nazwa_Funkcji_Lambda] prawdziwą nazwą swojej funkcji oraz podać pożądaną wartość limitu czasu w sekundach.
Istotne aspekty
Limit czasu dotyczy całej funkcji, a nie tylko jej fragmentów. Jeśli funkcja wykonuje długotrwałe operacje, takie jak przetwarzanie dużego pliku lub wysyłanie zapytań sieciowych, upewnij się, że limit czasu jest wystarczający do zakończenia operacji, nawet w najgorszym przypadku.
Pamiętaj, że funkcje Lambda są przeznaczone do krótkotrwałych i bezstanowych zadań. Jeśli funkcja działa zbyt długo, warto rozważyć podział na mniejsze jednostki. Możesz je wywoływać sekwencyjnie, np. wykorzystując wyzwalacz. Przykładowo, dane wyjściowe jednej funkcji Lambda mogą być zapisywane w zasobniku S3 i służyć jako dane wejściowe dla kolejnej.
W przypadku długotrwałych procesów, przekraczających 15 minut, warto użyć AWS Step Functions, aby zarządzać sekwencją funkcji Lambda lub innych usług AWS i uzyskać pożądany rezultat.
Dobre praktyki
Sama kwestia limitu czasu nie wydaje się zbyt skomplikowana, by prowadzić obszerne dyskusje. W praktyce, programiści często ustawiają limit na 15 minut dla każdej funkcji Lambda. Nawet jeśli funkcja kończy działanie wcześniej, nie generuje to negatywnych konsekwencji.
Niemniej jednak, warto wziąć pod uwagę kilka dobrych praktyk.
#1. Dobierz odpowiednią wartość
Wartość limitu czasu należy określić na podstawie przewidywanego czasu wykonania funkcji. Oznacza to, że limit nie powinien być zbyt krótki, ale również niepotrzebnie długi.
Możesz założyć, że pojedyncza funkcja Lambda nie powinna przekraczać na przykład trzech minut, ze względu na architekturę aplikacji lub jej ogólną wydajność.
Możesz też chcieć mieć pewność, że funkcja Lambda nie zakończy się wcześniej niż, powiedzmy, trzy minuty. Powodem może być chęć przeprowadzenia określonej liczby ponownych prób w kodzie Lambda, np. gdy zasoby potrzebne do ukończenia zadania są tymczasowo niedostępne.
Przed ustawieniem limitu na 15 minut, zastanów się, jaka byłaby optymalna wartość czasu wykonania. Definiowanie bardziej precyzyjnych wartości to po prostu kolejne narzędzie, pozwalające na wyznaczanie granic całemu zespołowi programistów.
#2. Monitorowanie w czasie
Po ustawieniu limitu czasu, monitoruj czas wykonania funkcji Lambda. Pozwoli to zweryfikować, czy przyjęte założenia były słuszne i czy wymagają korekty.
Użyj metryk i dzienników CloudWatch, aby śledzić czasy wykonania. Zidentyfikuj funkcje, których wykonanie zajmuje więcej czasu niż oczekiwano, oraz te, które działają szybciej niż zakładałeś.
#3. Wywołanie asynchroniczne
Jeśli funkcja Lambda jest wyzwalana przez zdarzenie, które nie wymaga natychmiastowej odpowiedzi (np. przesłanie pliku, wiadomość z kolejki), użyj wywołania asynchronicznego. Funkcja będzie wtedy działać w tle, bez konieczności oczekiwania na odpowiedź. Zmniejsza to ryzyko przekroczenia limitu czasu, ponieważ do całkowitego czasu wykonania Lambda nie wlicza się czasu oczekiwania na zasób.
#4. Użyj funkcji kroku dla złożonych procesów
Jeśli chcesz uruchomić proces, który przekracza limit 15 minut, użyj AWS Step Functions, aby zarządzać sekwencją funkcji Lambda lub innych usług AWS. Funkcja kroku podzieli proces na mniejsze, łatwiejsze do zarządzania zadania, które mieszczą się w ramach limitu czasu.
W ramach funkcji krokowej można nawet uruchomić kilka funkcji Lambda równolegle. Następnie funkcja kroku czeka na zakończenie wszystkich równoległych funkcji, zanim przejdzie dalej. Jest to forma skalowania poziomego, gdzie kilka funkcji Lambda może podzielić zadanie i wspólnie je rozwiązać.
Na koniec wystarczy zebrać cząstkowe wyniki i wygenerować ostateczne rozwiązanie, do czego można użyć kolejnej, samodzielnej funkcji Lambda.
#5. Zoptymalizuj kod
Zoptymalizuj kod funkcji Lambda, aby skrócić czas wykonania i poprawić wydajność. Jest to szczególnie przydatne, gdy limit czasu jest przekraczany tylko sporadycznie. W takim przypadku warto poszukać optymalizacji w kodzie, aby wyeliminować przypadki awarii.
Jak przekroczenie limitu czasu wpływa na rozliczenia?
Źródło: aws.amazon.com
Ustawienie limitu czasu dla funkcji AWS Lambda nie ma bezpośredniego wpływu na koszt jej użytkowania. AWS Lambda nalicza opłaty na podstawie liczby żądań oraz czasu wykonania funkcji.
Zwiększenie limitu czasu może spowodować wydłużenie czasu wykonania funkcji, ale tylko wtedy, gdy funkcja rzeczywiście potrzebuje tego dodatkowego czasu. W połączeniu z większą częstotliwością wykonywania, funkcja która potrzebuje więcej czasu, może generować większe koszty.
Jeśli jednak funkcja nie jest często wywoływana lub kończy działanie przed upływem limitu czasu, wpływ na koszty może być minimalny.
Zatem ustawienie domyślnego limitu czasu dla wszystkich funkcji Lambda na 15 minut nie musi być główną przyczyną wzrostu kosztów.
Niemniej jednak, może to pośrednio prowadzić do wzrostu kosztów. Programiści mogą czuć, że mają pewien zapas czasu i nie będą optymalizować kodu tak intensywnie, jak w przypadku bardziej restrykcyjnych limitów, które nadal pozostają realistyczne.
Dodatkowo, AWS Lambda oferuje warstwę bezpłatną, która obejmuje 1 milion bezpłatnych żądań i 400 000 GB-sekund czasu obliczeniowego miesięcznie. Jeśli korzystanie z funkcji Lambda mieści się w granicach warstwy bezpłatnej, nie zapłacisz za czas wykonania funkcji, niezależnie od ustawionego limitu czasu.
Podsumowanie
AWS Lambda to bardzo przydatne narzędzie, zwłaszcza w kontekście przetwarzania bezserwerowego w chmurze AWS. Ma swoje zastosowania i ograniczenia, które należy wziąć pod uwagę. Nie należy używać go do celów, do których nie został stworzony.
Jest idealny do prostych, asynchronicznych i wyzwalanych zdarzeniami akcji, które nie wymagają czasu wykonania dłuższego niż 15 minut. W przypadku bardziej złożonych zadań, wykorzystaj funkcje krokowe AWS, aby połączyć kilka funkcji Lambda w jeden zorganizowany proces. Alternatywnie, zrezygnuj z przetwarzania bezserwerowego i użyj serwerów z odpowiednią konfiguracją i mocą obliczeniową, aby zrealizować zadanie.
Na zakończenie, zachęcamy do zapoznania się z wprowadzeniem do AWS Lambda dla początkujących.