Le funzioni AWS Lambda sono una soluzione serverless per l’esecuzione di codice nel cloud senza configurare i propri server. Lo svantaggio principale è che i tempi di inizializzazione possono essere elevati, con conseguente aumento della latenza. Con Provisioned Concurrency, puoi risolvere questo problema.
Le funzioni Lambda vengono eseguite nei propri “ambienti di esecuzione”, che di solito vengono avviati automaticamente quando viene effettuata una richiesta. Dopo l’invocazione di una funzione, l’ambiente verrà mantenuto “caldo” per circa 5-15 minuti e il codice di inizializzazione non dovrà essere eseguito di nuovo.
Tuttavia, dopo tale periodo, o se è necessario servire più richieste contemporaneamente, è necessario avviare un nuovo ambiente di esecuzione, portando a un aumento dei tempi di avvio chiamato “avvio a freddo”. Questo può essere particolarmente pronunciato con linguaggi che devono eseguire grandi quantità di compilazione JIT all’avvio, come Java e .NET.
Per risolvere questo problema, AWS ha una funzionalità chiamata Provisioned Concurrency, in cui puoi essenzialmente prenotare un certo numero di ambienti di esecuzione affinché siano permanentemente caldi durante il giorno. Ciò significa che tutto il codice di inizializzazione viene eseguito in anticipo e non è necessario eseguire avvii a freddo.
Se ti affidi a Lambda per servire le richieste rivolte agli utenti, potresti prendere in considerazione la concorrenza con provisioning anche se finisce per costare un po’ di più. Anche se gli avviamenti a freddo di solito rappresentano solo l’1% delle richieste, quell’1% può essere secondi in più trascorsi in attesa del caricamento di un’applicazione, anche se ciò dipenderà dal tempo di esecuzione e dalle dimensioni del codice.
Quanto costa la concorrenza fornita? A differenza delle istanze EC2 riservate, la concorrenza con provisioning è ancora per lo più basata sul prezzo “paga per quello che usi”, come il resto di Lambda. Paghi una piccola tariffa per ogni ora in cui effettui il provisioning di ogni ambiente, quindi paghi per le richieste Lambda come di consueto.
Tuttavia, poiché il traffico è più prevedibile da parte di AWS ed è più economico non dover eseguire continuamente il codice di inizializzazione, il costo di calcolo per funzione per le richieste effettuate con la simultaneità del provisioning è in realtà inferiore. Non ci sono svantaggi nemmeno per il superamento del limite: ti verranno addebitati solo i prezzi di concorrenza standard.
Nel complesso, la concorrenza con provisioning può essere leggermente più economica (circa il 5-10%) se si dispone di un traffico molto prevedibile e si riserva esattamente quella capacità. Tuttavia, in alcuni casi può anche essere un po’ più costoso. Ti consigliamo di controllare le tue analisi e collegali al calcolatore dei prezzi Lambda di AWS per saperne di più.
Abilitazione della concorrenza fornita L’attivazione della concorrenza con provisioning è piuttosto semplice, ma presenta uno svantaggio: non può puntare alla versione $LATEST predefinita. Questo tag è un alias che può cambiare e non punta a una versione specifica e la concorrenza con provisioning deve riservare una versione specifica. Quindi, dovrai pubblicare una nuova versione da Lambda, se non ne hai già una:
Quindi, configura un alias per puntare a quella versione. Questo alias può essere aggiornato, il che attiverà un aggiornamento per gli ambienti di cui è stato eseguito il provisioning.
Una volta impostato il tuo alias, puoi aggiungere una nuova configurazione di concorrenza dalle impostazioni di Lambda, in Configurazione > Concorrenza. Puoi anche configurarlo direttamente dalle impostazioni dell’alias.
Le impostazioni per la simultaneità del provisioning sono semplici: seleziona un alias e inserisci un importo per il provisioning.
Puoi anche impostare e aggiornare questo valore utilizzando l’API o l’interfaccia a riga di comando di AWS, che può essere utilizzata per automatizzarlo durante il giorno:
aws lambda put-provisioned-concurrency-config –function-name MyFunction –qualifier LatestProvisioned –provisioned-concurrent-executions 10 Scalabilità automatica con concorrenza fornita Poiché la concorrenza con provisioning può essere regolata durante il giorno, può anche essere collegata Auto Scaling dell’applicazione di AWS per regolarlo in base all’utilizzo. Collegarlo è semplice e richiede solo a pochi comandi dall’AWS CLI o dall’API, poiché non esiste ancora una console di gestione per questo.
Innanzitutto, dovrai registrare la funzione Lambda come obiettivo di dimensionamento. Qui dovrai modificare il nome della funzione (MyFunction) e l’alias (LatestProvisioned) e regolare anche gli intervalli di capacità minima e massima.
aws application-autoscaling register-scalable-target –service-namespace lambda –resource-id function:MyFunction:LatestProvisioned –min-capacity 2 –max-capacity 10 –scalable-dimension lambda:function:ProvisionedConcurrency Quindi, puoi abilitare un criterio di ridimensionamento automatico, utilizzando il nome della funzione e l’alias come ID risorsa e configurandolo con un criterio di ridimensionamento JSON. Questo esempio lo imposta per aumentare e diminuire quando LambdaProvisionedConcurrencyUtilization va sopra o sotto il 70%.
aws application-autoscaling put-scaling-policy –service-namespace lambda –scalable-dimension lambda:function:ProvisionedConcurrency –resource-id function:MyFunction:LatestProvisioned –policy-name my-policy –policy-type TargetTrackingScaling –target-tracking-scaling-policy-configuration ‘{ “TargetValue”: 0.7, “PredefinedMetricSpecification”: { “PredefinedMetricType”: “LambdaProvisionedConcurrencyUtilization” }}’ Questo non rileva tutti i casi, come rapidi picchi di utilizzo che non durano a lungo, ma funziona bene per il traffico costante e ti farà risparmiare denaro la sera quando il traffico è basso.