Fondamenti di architetture event‑driven

Applicazioni serverless con AWS Lambda

Claudio Canales

Senior DevOps Engineer

Riepilogo: un mental model per Lambda

  • Sorgente evento: ciò che attiva Lambda.
  • Payload evento: JSON che descrive l'accaduto.
  • Handler: codice che lo elabora.
  • Esito: risposta o side effect.
  • Log: dove fai debug.

Flusso di esecuzione Lambda

Applicazioni serverless con AWS Lambda

Gli eventi sono messaggi

  • Un evento descrive qualcosa che è successo.
  • Di solito è un messaggio JSON con metadati.
  • L'handler estrae i campi e agisce.

Analogia del campanello per gli eventi

Applicazioni serverless con AWS Lambda

Sorgenti evento comuni in AWS

  • Amazon S3 genera eventi sugli upload.
  • Amazon SQS è una coda gestita che recapita messaggi.
  • DynamoDB Streams produce un log delle modifiche.
  • Ognuno produce un payload JSON diverso.

Sorgenti evento: S3 vs SQS vs Streams

Applicazioni serverless con AWS Lambda

Invocazione sincrona vs asincrona

  • Sincrono: il chiamante attende il risultato.
  • Asincrono: il chiamante riceve un ack; l'evento è elaborato dopo.

Analogia sync vs async

Applicazioni serverless con AWS Lambda

Fondamenti di architetture event‑driven

  • Gli eventi arrivano come JSON dai servizi AWS.
  • La modalità di invocazione cambia dove compaiono gli errori.
  • I payload variano: fai parsing e valida in modo difensivo.
  • Presumi retry e duplicati.

Punti chiave

Applicazioni serverless con AWS Lambda

I payload sono contratti

  • I payload sono contratti: il mittente decide la forma.
  • Il tuo handler deve sapere dove trovare i campi.
  • Estrai il necessario, valida, elabora e logga.

Contratto del payload e flusso di parsing

Applicazioni serverless con AWS Lambda

Esempio di payload: evento SQS

Payload SQS annotato

  • Records è il batch.
  • body è una stringa.
  • messageId aiuta a tracciare e deduplicare.
Applicazioni serverless con AWS Lambda

Walkthrough: iterare su Records

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Leggi Records con un default sicuro.
  • Cicla i record ed estrai il body.
  • Logga ciò che serve, poi ritorna.

Loop su Records

Applicazioni serverless con AWS Lambda

Walkthrough: parse sicuro del body JSON

import json
def lambda_handler(event, context):
    records = event.get("Records") or [{}]
    body = records[0].get("body", "{}")
    payload = json.loads(body)
    oid = payload.get("order_id")
    return json.dumps({"order_id": oid})
  • body è una stringa; parsala con json.loads.
  • Leggi con un default sicuro tipo "{}".
  • Estrai order_id e ritorna JSON con json.dumps.

Flusso di parsing del body

Applicazioni serverless con AWS Lambda

Checklist di parsing difensivo

Checklist per parsing difensivo

  • Logga una volta la forma dell'evento quando impari una nuova sorgente.
  • Usa .get() e default per i campi opzionali.
  • Valida i campi obbligatori e restituisci errori chiari.
  • Gestisci batch vuoti e chiavi mancanti.
Applicazioni serverless con AWS Lambda

Progetta per retry e duplicati

  • Molte sorgenti usano consegna at-least-once.
  • I duplicati possono capitare.
  • Progetta handler idempotenti: anche il doppio passaggio è corretto.

Retry e duplicati

Applicazioni serverless con AWS Lambda

Idempotenza in pratica

  • Scegli una chiave univoca, es. messageId o order_id.
  • Salva ogni chiave processata in DynamoDB.
  • Se la chiave esiste, salta il lavoro.

Flusso decisionale di idempotenza

Applicazioni serverless con AWS Lambda

Punti chiave

  • Gli eventi arrivano come JSON dai servizi AWS.
  • La modalità di invocazione cambia dove compaiono gli errori.
  • I payload variano: fai parsing e valida in modo difensivo.
  • Presumi retry e duplicati.

Punti chiave

Applicazioni serverless con AWS Lambda

Passiamo alla pratica!

Applicazioni serverless con AWS Lambda

Preparing Video For Download...