AWS Lambda SnapStart

Squeeds Julkalender | 2022-12-05 | Andreas Wester
Att använda Java i sin AWS Lambda har länge varit förknippade med långa så kallade kallstarter. I dagarna lanserade AWS den nya funktionen SnapStart, ett sätt att få ner tiden på Javas kallstarter. Häng med så visar jag hur man lätt och smidigt aktiverar det och vad man behöver tänka på.
network-2402637_1280.jpg

Som de flesta är medvetna om så flyttar vi allt fler av våra tjänster ut i molnet. Ibland sätter vi upp egna Kubernetes-kluster och ibland använder vi oss av tjänster så som AWS Lambda för att köra våra mikrotjänster. En av de stora problemen de som jobbar med Java fått erfara gällande det senare är att man då och då råkar ut för en så kallad "kallstart".

Vad som menas med en kallstart är helt enkelt att den tjänst du försöker nå inte körs för tillfället och att AWS därför behöver snurra upp en instans av din service. Tyvärr kan detta ta väldigt lång tid med Java, speciellt eftersom man oftast kombinerar det med exempelvis SpringBoot där, om man inte ser upp kan få kallstartstider på upp upp mot 5-10 sekunder. Tänk då om din tjänst ska anropa en annan tjänst som den också behöver kallstartas, då blir det ytterligare 5-10 sekunder osv.

För att stoppa detta problem släppte AWS i dagarna en funktion de kallar för SnapStart. Det den här funktionen gör är att den tar ett snapshot precis efter den passerat Init-fasen av din tjänsts uppstart och lagrar den för att kunna använda den istället för att starta upp allt från början. Just nu stödjs alla tjänster som använder sig av AWS Coretto(Java 11) och man garanterar upp till 10 gånger snabbare uppstartstider om man använder sig av ramverk så som SpringBoot, Quarkus eller Micronaut. Att använda SnapStart gör man också helt utan extra kostnad. Ett sparat snapshot tas bort om Lambdan har varit inaktiv i 14 dagar. 

Hur gör man då för att aktivera SnapStart? Antingen går man in i AWS-konsolen och navigerar till sin lambda. Där gör man sedan följande:

  • Välj Configuration, välj sedan General configuration.

  • General configuration sidan, välj Edit.

  •  Edit basic settings sidan, välj Published versions för SnapStart.

  • Välj Save

Om man istället använder sig utav template filer för att distribuera sin tjänst så kan man lägga till de två markerade raderna:

Sedan när man distribuerat sin tjänst är SnapStart aktivt och kallstarter är historia.

Men

Det finns några saker man behöver tänka på.

  • Unikhet – All typ av unikhet som man eventuellt skapade i Init-fasen måste nu göras efter. Exempelvis om du (eller ett bibliotek du använder) använder en pseudo-slumptalsgenerator så får den inte vara baserad på ett frö som hämtas under Init-fasen.
  • Nätverksuppkopplingar - Om din kod använder långsiktiga uppkopplingar mot andra tjänster som skapas under Init-fasen så är det bra om dessa kan återskapas senare om det skulle behövas (något som AWS SDK redan uppdaterats med)
  • Beräknad data -  All data som beräknas eller hämtas under Init-fasen måste kunna hämtas om ifall den data som beräknats blivit gammal.

Så med det sagt finns det alltså nu ytterligare ett sätt att minska Javas kallstarter när det gäller AWS Lambda.

Vill du läsa mer om detta kan du göra det här: AWS Lambda SnapStart