Architettura Serverless: AWS Lambda, Vercel e Cloud Functions
L'architettura serverless vi permette di eseguire codice senza gestire server. Questa guida copre i concetti serverless, AWS Lambda, Vercel e l'uso di Cloud Functions.
Ultimo aggiornamento:Cos'è Serverless?
Serverless è un modello di cloud computing che vi permette di eseguire codice senza gestire server. I server esistono ancora ma non li gestite voi.
FaaS (Function as a Service): Distribuite il vostro codice come una funzione. Il provider cloud esegue la funzione quando arriva una richiesta e restituisce il risultato.
BaaS (Backend as a Service): Usate servizi backend come database, autenticazione, storage come managed. Come Firebase, Supabase.
Vantaggi: Nessuna gestione server, scalabilità automatica, pagamento a consumo, costo zero in idle.
AWS Lambda
AWS Lambda è il servizio di compute serverless di AWS. Supporta i runtime Node.js, Python, Java, Go, .NET, Ruby.
Handler: Punto di ingresso della funzione. Definito come exports.handler = async (event, context) => { ... }.
Trigger: Eventi che attivano la funzione Lambda. API Gateway (HTTP), S3 (upload di file), DynamoDB (cambiamento di dati), SQS (coda di messaggi).
Cold start: La funzione deve essere inizializzata alla prima chiamata. Questo crea una latenza di 100ms-1s. Può essere ridotto con provisioned concurrency.
Limiti: Massimo 15 minuti di tempo di esecuzione, 10 GB di memoria, 10 GB di storage effimero. Ottimizzate le impostazioni timeout e memory.
Vercel e Netlify
Vercel: Piattaforma serverless ottimizzata per framework come Next.js, Nuxt, SvelteKit. Supporto Edge Functions e Serverless Functions.
Netlify: Hosting di sito statico + funzioni serverless. Aggiungete la logica backend con Netlify Functions (basato su AWS Lambda).
Edge Functions: Funzioni che vengono eseguite all'edge con Cloudflare Workers o Vercel Edge Runtime. Latenza ultra bassa.
Vantaggi: Deploy automatico su git push, preview deployments, CDN globale, HTTPS automatico. Eccellente esperienza sviluppatore.
Uso: Applicazioni JAMstack, endpoint API, gestione form, ottimizzazione immagini, autenticazione.
Cold Start e Prestazioni
Cold start: Il container deve essere avviato quando la funzione viene chiamata per la prima volta. Questo aggiunge latenza. Le funzioni warm sono più veloci.
Strategie di riduzione: Provisioned concurrency (AWS Lambda), keep-alive (ping periodico), bundle più piccolo, runtime più veloce (Node.js > Java).
Ottimizzazione della memoria: Più memoria = più CPU. Si può ridurre il tempo di cold start aumentando la memoria.
Connection pooling: Create le connessioni al database fuori dalla funzione (global scope). Non aprite una nuova connessione ad ogni chiamata.
Monitoraggio: Monitorate il tempo di cold start e il tasso di errore con CloudWatch (AWS), Vercel Analytics.
Migliori Pratiche Serverless
Stateless: Le funzioni devono essere stateless. Memorizzate lo stato in storage esterno (DynamoDB, Redis).
Idempotenza: Eseguire la funzione più volte deve produrre lo stesso risultato. Deve essere sicuro per i retry e gli eventi duplicati.
Gestione degli errori: Catturate gli errori e inviateli alla dead letter queue (DLQ). Definite un meccanismo di retry.
Sicurezza: Ruoli IAM least privilege. Gestione dei segreti con variabili d'ambiente. Validazione dell'input.
Ottimizzazione dei costi: Ottimizzate memory e timeout. Riducete le invocazioni inutili. Usate provisioned concurrency con cautela.
Serverless vs Container vs VM
Serverless: Zero gestione, scalabilità automatica, pagamento a consumo. Ideale per operazioni di breve durata e basate su eventi.
Container (Docker/K8s): Più controllo, operazioni di lunga durata, applicazioni stateful. Richiede orchestrazione.
VM: Controllo totale, applicazioni legacy, requisiti hardware speciali. Costo di gestione più alto.
Selezione: Operazioni brevi e basate su eventi → Serverless. Applicazioni di lunga durata e stateful → Container. Legacy e requisiti speciali → VM.