Hur man ändrar timeout i AWS Lambda

By rik

För de som önskar konstruera en serverlös arkitektur i AWS, eller åtminstone delar av den, är AWS Lambda-tjänsten en central komponent.

Detta är en serverlös beräkningsfunktion, vanligtvis kodad i Node.JS eller Python, som du kan utveckla och köra utan att behöva konfigurera backend-kluster eller servrar. Flera AWS Lambda-funktioner kan sammankopplas för att hantera mer komplexa arbetsflöden.

En viktig aspekt av Lambda-funktioner är dock den begränsade behandlingstiden. Denna begränsning dikterar när det är lämpligt att använda AWS Lambda.

Källa: aws.amazon.com

Vad är timeout-intervallet?

Timeout-funktionen för en AWS Lambda-funktion är en parameter som bestämmer den maximala tid en funktion får köra innan den automatiskt avbryts.

Lambda-funktioner är utformade för att vara kortlivade och tillståndslösa, och det är så de bör användas. Det är inte ovanligt att se team som försöker använda Lambda för långvariga processer, ofta för att utnyttja fördelarna med den serverlösa aspekten. Att köra kod utan att behöva starta en server med specifik CPU- och minneskonfiguration är oftast mer kostnadseffektivt. Motivet är alltså begripligt.

Men om en funktion körs för länge kan det leda till resursöverbelastning och prestandaproblem. Risken finns att resurser låses, och med vetskapen om en långvarig process tenderar man inte att prioritera optimering av stegen. En väntetid på fem minuter kanske inte upplevs som ett problem, även om den i processen är onödig.

Som standard är timeouten för en Lambda-funktion inställd på endast 3 sekunder. Det betyder att all kod du kör inom en Lambda-funktion måste avslutas inom denna tid. Detta är idealiskt för arkitekturer som kräver snabb kommunikation och responstider, eventuellt med miljontals transaktioner på kort tid. Men det begränsar även användningsområdena för Lambda-funktioner. Därför finns möjligheten att öka denna gräns till max 900 sekunder (15 minuter). När timeout-gränsen nås avbryter Lambda funktionen och returnerar ett felmeddelande.

Hur ställer jag in timeout-funktionen?

Källa: aws.amazon.com

Timeout för en Lambda-funktion kan konfigureras via AWS Management Console, AWS CLI eller AWS SDK:er.

Följ dessa steg för att göra det:

  • Öppna AWS Management Console och navigera till Lambda-tjänsten.
  • Välj den Lambda-funktion du vill ändra.
  • Under fliken ”Konfiguration”, scrolla ner till ”Allmän konfiguration” och sök efter inställningen ”Timeout”.
  • Klicka på knappen ”Redigera” bredvid.
  • Ange det nya timeout-värdet i sekunder (mellan 1 och 900) och klicka på ”Spara”.
  • Klicka på ”Spara”-knappen högst upp på sidan för att bekräfta ändringarna i Lambda-funktionen.

Du kan även uppdatera timeout med AWS CLI. Här är ett exempel:

   aws lambda update-function-configuration --function-name [My_Lambda_Function_Name] --timeout 900
  

Detta kommando ställer in timeout för funktionen [My_Lambda_Function_Name] till 15 minuter. Ersätt med ditt faktiska funktionsnamn och önskat timeout-värde i sekunder.

Några överväganden

Timeout-inställningen gäller för hela funktionen, inte enskilda kodblock. Om din funktion utför en tidsödande operation, som att bearbeta en stor fil eller göra en nätverksförfrågan, måste du säkerställa att timeouten är tillräcklig för att slutföra operationen, även i värsta fall.

Det är viktigt att komma ihåg att Lambda-funktioner är designade för kortvariga och tillståndslösa uppgifter. De ska utföra mindre, avgränsade uppdrag. Om du märker att en Lambda-funktion tar lång tid att slutföra, kan det vara lämpligt att dela upp den i flera mindre funktioner. Dessa kan sedan triggas efter varandra, till exempel när resultatet av en tidigare funktion lagras i en S3-bucket.

Om du behöver genomföra en långvarig process som överskrider 15-minutersgränsen, överväg att använda AWS Step Functions för att samordna en sekvens av Lambda-funktioner eller andra AWS-tjänster.

Bästa metoder

Timeout-intervallet i sig kan verka otillräckligt för vissa omfattande operationer. Därför tenderar utvecklare ofta att sätta timeouten till 15 minuter för alla Lambda-funktioner. Även om funktionen avslutas mycket tidigare, upplevs det inte som ett negativt problem.

Ändå finns det några bästa metoder som är värda att notera.

#1. Definiera lämpligt värde

Du bör ange timeout-värdet baserat på den förväntade exekveringstiden för funktionen. Detta innebär att du ställer in ett värde som varken är för kort eller onödigt långt.

Det kan vara så att du av arkitektoniska eller prestandarelaterade skäl önskar att den totala körtiden för en enskild Lambda-funktion inte ska överstiga tre minuter.

På samma sätt kan du vilja se till att en Lambda-funktion inte avslutas tidigare än, säg, tre minuter. En anledning kan vara att du vill inkludera ett antal försök i Lambdakoden, exempelvis om resurserna som koden behöver är upptagna eller låsta.

Innan du direkt ställer in timeouten till 15 minuter, fundera på vad som kan vara den optimala exekveringstiden. Att specificera mer exakta värden ger utvecklingsteamet tydligare gränser.

#2. Övervakning över tid

När du väl har fastställt dina timeout-gränser, bör du övervaka körtiden för dina Lambda-funktioner. Detta ger viktig information om huruvida dina initiala beslut var korrekta, eller om de behöver justeras.

Använd CloudWatch-statistik och loggar för att följa upp exekveringstiderna. Identifiera funktioner som tar längre tid än väntat, och de som slutförs mycket snabbare.

#3. Asynkront anrop

Om din Lambda-funktion utlöses av en händelse som inte kräver ett omedelbart svar, som en filuppladdning eller ett meddelande från en kö, bör du använda asynkrona anrop för att minska risken för timeouts. Det gör att funktionen kan köras i bakgrunden utan att vänta på ett svar, vilket minskar antalet timeouts. Detta beror på att du inte behöver inkludera den tid funktionen väntar på en resurs i den totala körtiden.

#4. Använd stegfunktioner för komplexa processer

Om du behöver köra en långvarig process som överskrider gränsen på 15 minuter, använd AWS Step Functions för att samordna en serie Lambda-funktioner eller andra AWS-tjänster för att uppnå önskat resultat. Step Functions delar upp processen i mindre, mer hanterbara uppgifter som kan utföras inom tidsgränsen.

Du kan även köra flera Lambda-funktioner parallellt inom en Step Function. Därefter får Step Function vänta på alla parallella Lambda-funktioner innan den går vidare. Detta är en form av horisontell skalning där flera Lambda-funktioner delar upp ett problem och löser det tillsammans.

Slutligen behöver du bara samla in delresultaten och skapa den slutliga lösningen, vilket kan åstadkommas med en fristående Lambda-funktion.

#5. Optimera koden

Optimera koden för dina Lambda-funktioner för att minska körtiden och förbättra prestandan. Detta är användbart om timeout-intervallet bara ibland är otillräckligt. I sådana fall kan det vara värt att försöka optimera koden för att eliminera sådana fel.

Hur påverkar timeout faktureringen?

Källa: aws.amazon.com

Timeout-inställningen för en AWS Lambda-funktion påverkar inte direkt faktureringen. AWS Lambda debiterar baserat på antalet anrop och den faktiska körtiden.

Om du ökar timeout för en Lambda-funktion kan det leda till längre körtider, men endast om funktionen faktiskt behöver den extra tiden. Kombinerat med en högre frekvens av anrop av funktionen, ja, då kan du förvänta dig högre kostnader.

Men om funktionen inte anropas ofta, eller om den slutför processen tidigare än timeout-värdet nås, kan effekten på faktureringen vara minimal.

Det är därför som att ställa in alla Lambda-funktioner till en timeout på 15 minuter inte nödvändigtvis är den främsta orsaken till en ökning i kostnaderna för din totala bearbetning.

Men det kan leda till en indirekt ökning av de totala kostnaderna. Utvecklare kan känna att de har utrymme att använda, vilket kan leda till att de inte optimerar koden lika noggrant som de annars skulle göra om tidsgränserna var snävare, men realistiska.

AWS Lambda erbjuder en gratis nivå som inkluderar 1 miljon gratis anrop och 400 000 GB-sekunder beräkningstid per månad. Om din Lambda-användning faller inom dessa gränser, betalar du inte för körtiden oavsett timeout-inställningen.

Slutord

AWS Lambda-funktioner är kraftfulla verktyg, särskilt för serverlös bearbetning i AWS-molnet. De har ett tydligt användningsområde och begränsningar som vi bör vara medvetna om. Vi bör inte försöka använda dem för uppgifter som de inte är designade för.

De är idealiska för enkla, asynkrona och utlösta åtgärder som inte kräver en exekveringstid på mer än 15 minuter. Om du behöver något mer komplext, använd AWS Step Functions för att kombinera flera Lambda-funktioner till en orkestrerad process. Eller ge upp den billigare serverlösa bearbetningen och använd istället servrar med lämplig konfiguration och datorkraft för att utföra uppgiften.

Utforska sedan introduktionen till AWS Lambda för nybörjare.