Pokud se chystáte vytvářet bezserverovou architekturu v rámci AWS, nebo její část, služba AWS Lambda bude klíčovým prvkem.
Jedná se o bezserverovou výpočetní jednotku, kterou obvykle programujete v jazycích jako Node.js nebo Python. Můžete ji vyvíjet a spouštět, aniž byste se museli starat o backendové clustery nebo servery. Propojením více těchto funkcí můžete vytvořit komplexnější procesy.
Důležitým aspektem funkce Lambda je omezení délky jejího běhu. Tato omezená doba trvání určuje, kdy je vhodné funkci AWS Lambda použít.
Zdroj: aws.amazon.com
Jaký je časový limit?
Časový limit u funkce AWS Lambda představuje maximální dobu, po kterou může tato funkce běžet, než je automaticky ukončena.
Funkce Lambda jsou navrženy pro krátkodobé a bezstavové operace, a tak by se s nimi mělo zacházet. Často se stává, že týmy se snaží použít Lambda pro dlouhotrvající procesy, a to hlavně proto, že chtějí využít její bezserverovou podstatu. Spuštění kódu bez nutnosti správy serverů s konkrétní konfigurací procesoru a paměti bývá ekonomičtější. Cíl je tedy snadno pochopitelný.
Příliš dlouhý běh funkce však může vést k problémům s využitím zdrojů a celkovým výkonem. Existuje riziko zablokování prostředků, a navíc se s prodloužením doby běhu často vytrácí snaha o optimalizaci kroků uvnitř procesu. Najednou i pětiminutové čekání není problém, ačkoli by pro samotný proces mohlo být zbytečné.
Ve výchozím nastavení je časový limit funkce Lambda nastaven na pouhé 3 sekundy. To znamená, že veškerý kód, který v rámci této funkce spouštíte, musí skončit do tří sekund. To je ideální pro architektury s rychlou komunikací a odezvou, potenciálně s miliony transakcí v krátkém čase. Nicméně, protože by to značně omezilo možnosti využití funkce Lambda, je možné tento limit navýšit až na 900 sekund (15 minut). Po dosažení tohoto limitu Lambda automaticky ukončí funkci a vrátí chybový kód.
Jak nastavit funkci časového limitu?
Zdroj: aws.amazon.com
Časový limit funkce Lambda lze nastavit pomocí AWS Management Console, AWS CLI, nebo AWS SDK.
Zde jsou konkrétní kroky, jak toho dosáhnout:
K aktualizaci časového limitu funkce Lambda můžete také použít příkazový řádek AWS CLI. Zde je příklad příkazu:
aws lambda update-function-configuration --function-name [Nazev_Moje_Lambda_Funkce] --timeout 900
Tento příkaz nastaví časový limit pro [Nazev_Moje_Lambda_Funkce] na 15 minut. Stačí zadat skutečný název vaší funkce a požadovanou hodnotu časového limitu v sekundách.
Některé úvahy
Nastavení časového limitu platí pro celou funkci, a ne pouze pro jednotlivé části kódu nebo operace v rámci funkce. Pokud tedy funkce provádí dlouhotrvající operaci, jako je zpracování velkého souboru nebo odesílání síťového požadavku, je nutné zajistit, aby časový limit byl dostatečný pro dokončení operace, a to i v nejhorším možném scénáři.
Je důležité mít na paměti, že funkce Lambda jsou navrženy pro krátkodobé a bezstavové operace, a měly by plnit malé, diskrétní úkoly. Pokud se ukáže, že dokončení vaší funkce Lambda trvá dlouho, možná byste měli zvážit její rozdělení na několik menších funkcí. Ty pak můžete volat postupně, například s pomocí triggerů. Například pokud je výstup předchozí funkce Lambda uložen v S3 bucketu.
Pokud potřebujete spustit dlouhotrvající proces, který přesahuje 15minutový limit, můžete použít AWS Step Functions pro organizaci řady funkcí Lambda nebo jiných služeb AWS, abyste dosáhli požadovaného výsledku.
Osvědčené postupy
Rozsah časového limitu se nemusí zdát dostatečně široký pro složitější situace. Ve většině případů vývojáři nakonec nastaví 15 minut pro všechny Lambda funkce, i když skončí mnohem dříve, což obvykle nemá negativní vliv.
Přesto je užitečné mít na paměti některé osvědčené postupy.
#1. Definujte vhodnou hodnotu
Hodnotu časového limitu byste měli nastavit na základě očekávané doby trvání funkce. To znamená stanovit hodnotu, která není příliš krátká, ale ani zbytečně dlouhá.
Může být například vhodné zajistit, aby celková doba trvání jedné funkce Lambda nepřesáhla tři minuty, a to z architektonických důvodů nebo z důvodu celkového výkonu vaší aplikace.
Stejně tak se můžete ujistit, že funkce Lambda nebude ukončena dříve než, dejme tomu, za tři minuty. Jedním z důvodů může být, že chcete v rámci kódu Lambda provést určitý počet opakování. Například v situaci, kdy jsou některé zdroje potřebné pro dokončení kódu zaneprázdněné nebo uzamčené.
Než tedy bez rozmyslu nastavíte časový limit na 15 minut, promyslete si, jaká by mohla být optimální doba trvání funkce. Stanovení přesnějších hodnot je dalším nástrojem, jak stanovit určité hranice pro celý vývojový tým.
#2. Sledování v průběhu času
Jakmile nastavíte limity časového limitu, sledujte dobu trvání funkcí Lambda. Získáte tak cenné informace o tom, zda bylo původní rozhodnutí správné a zda nepotřebuje úpravy.
Pro sledování doby trvání funkcí můžete použít metriky a logy CloudWatch. Poté identifikujte ty, které trvají déle, než jste očekávali, a také ty, jejichž dokončení je mnohem rychlejší, než se předpokládalo.
#3. Asynchronní spouštění
Pokud je vaše funkce Lambda spuštěna událostí, která nevyžaduje okamžitou odezvu, jako je odeslání souboru nebo zpráva z fronty, použijte asynchronní spouštění, abyste snížili riziko vypršení časového limitu. Funkce poběží na pozadí, aniž by čekala na odpověď. Tím se samozřejmě může snížit počet vypršení časového limitu. Je to prostě proto, že do celkové doby běhu Lambda nemusíte započítávat čekací dobu, kterou funkce potřebuje na daný zdroj.
#4. Používejte Step Functions pro složité procesy
Pokud potřebujete spustit dlouhotrvající proces, který přesahuje 15minutový limit, můžete k dosažení tohoto cíle použít AWS Step Functions pro organizaci řady funkcí Lambda nebo jiných služeb AWS. Funkce Step rozdělí proces na menší a lépe ovladatelné úlohy, které se vejdou do časového limitu.
V rámci krokové funkce můžete dokonce paralelně spouštět několik funkcí Lambda. Funkce Step pak počká na dokončení všech paralelních funkcí Lambda, než bude pokračovat. Jedná se o formu horizontálního škálování, kdy několik funkcí Lambda může rozdělit jeden problém a společně ho částečně vyřešit.
Nakonec stačí shromáždit dílčí výsledky a sestavit konečné řešení, což může zvládnout i samostatná funkce Lambda.
#5. Optimalizujte kód
Kód funkce Lambda můžete optimalizovat, abyste zkrátili dobu trvání a zlepšili výkon. To je užitečné, pokud interval timeoutu občas nestačí. V takovém případě by mohlo být vhodné se zaměřit na optimalizaci kódu pro eliminaci těchto ojedinělých selhání.
Jak časový limit ovlivňuje fakturaci?
Zdroj: aws.amazon.com
Nastavení časového limitu pro funkci AWS Lambda nemá přímý vliv na fakturaci. AWS Lambda účtuje na základě počtu požadavků a doby trvání funkce.
Pokud prodloužíte časový limit pro funkci Lambda, může to vést k delší době trvání, ale pouze v případě, že funkce skutečně potřebuje tento dodatečný čas. Pokud to zkombinujete s vyšší frekvencí funkce, jejíž provedení trvá déle, pak ano, můžete očekávat zvýšené náklady.
Nicméně, pokud se funkce nevyvolává často, nebo pokud dokončí proces dříve, než je dosaženo časového limitu, dopad na fakturaci může být minimální.
To je důvod, proč nastavení všech funkcí Lambda na 15 minut jako výchozí hodnotu nemusí být hlavním důvodem zvýšení nákladů na celkové zpracování.
Rozhodně to ale vede k nepřímému navýšení celkových nákladů. Vývojáři mohou získat pocit, že mají určitou rezervu, a nemusí optimalizovat kód tak důkladně, jak by to udělali, kdyby byly časové limity striktnější, ale stále realistické.
Kromě toho, AWS Lambda nabízí bezplatný tarif, který zahrnuje 1 milion bezplatných požadavků a 400 000 GB sekund výpočetního času měsíčně. Pokud vaše využití funkce Lambda spadá do limitů bezplatného tarifu, nebudete platit za dobu trvání funkce bez ohledu na nastavení časového limitu.
Závěrem
Funkce AWS Lambda je výkonný nástroj, zejména pro bezserverové zpracování v cloudu AWS. Má své opodstatnění a limity, kterých bychom si měli být vědomi. Nesnažme se ji používat pro případy, pro které nebyla navržena.
Je ideální pro jednoduché, asynchronní a ideálně triggerované akce, které nevyžadují dobu trvání delší než 15 minut. Pokud potřebujete něco složitějšího, použijte AWS Step Functions pro spojení několika funkcí Lambda do jediného organizovaného procesu. Nebo se vzdejte levnějšího bezserverového zpracování a použijte servery s vhodnou konfigurací a výpočetním výkonem pro splnění svého úkolu.
Doporučujeme vám podívat se na úvod do AWS Lambda pro začátečníky.