{"id":8376,"date":"2026-02-11T15:34:07","date_gmt":"2026-02-11T14:34:07","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=8376"},"modified":"2026-02-11T16:32:06","modified_gmt":"2026-02-11T15:32:06","slug":"architetture-event-driven-a-km0-dal-producer-al-consumer-parte-2","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/architetture-event-driven-a-km0-dal-producer-al-consumer-parte-2\/","title":{"rendered":"Architetture Event-Driven a KM0: dal producer al consumer – Parte 2"},"content":{"rendered":"\n
Nell\u2019articolo precedente: “Architetture Event-Driven a KM0: dal producer al consumer<\/a>” abbiamo esplorato le basi concettuali delle architetture Event-Driven, analizzando gli attori coinvolti, le tipologie di messaggi, i canali di messaging e i pattern di coupling che regolano l\u2019interazione tra producer e consumer.<\/p>\n\n\n\n In questo secondo articolo ci concentreremo su come realizzare un\u2019Event-Driven Architecture su AWS, con Amazon EventBridge come servizio centrale. EventBridge va oltre il semplice trasferimento dei dati: funge da event router, orchestrando il flusso tra producer e consumer e gestendo filtraggio, trasformazione e instradamento degli eventi. Il servizio fornisce inoltre l\u2019infrastruttura necessaria per instradare eventi sia tecnici sia di dominio, provenienti da servizi AWS nativi, applicazioni SaaS o soluzioni custom.<\/p>\n\n\n\n In base al tipo di eventi che gestiamo, dobbiamo scegliere la tipologia di event bus pi\u00f9 adatta. Ogni account AWS dispone di un default event bus per regione, dove vengono automaticamente instradati gli eventi emessi dai servizi AWS integrati con EventBridge. Quando si tratta di eventi di dominio, potremmo tecnicamente usare il default event bus come destinazione, ma suggerisco di utilizzare un nuovo custom event bus dedicato alla nostra applicazione, per garantire isolamento, governance pi\u00f9 chiara e separazione tra eventi infrastrutturali e logica di business.<\/p>\n\n\n\n Ora che abbiamo un’idea pi\u00f9 chiara di dove, concentriamoci su cosa fluisce nell’event bus.<\/p>\n\n\n\n Per inviare un evento a un custom event bus, dobbiamo invocare l’API PutEvents. Quello che segue \u00e8 un esempio di come possiamo invocarla usando AWS CLI.<\/p>\n\n\n\n DetailType si riferisce al “tipo di evento”; suggerisce i campi che faranno parte dell’envelope.<\/p>\n\n\n\n L’event envelope \u00e8 rappresentato dal campo Detail. Il valore associato a tale campo deve corrispondere ad un JSON valido. \u00c8 pratica comune utilizzare una struttura standard, come “Metadata \/ Data”. I campi Metadata sono pensati per essere applicati a tutti gli eventi, mentre Data contiene campi specifici per tipo di evento (DetailType).<\/p>\n\n\n\n “Metadata \/ Data” non \u00e8 l’unico approccio standard esistente: quest<\/a>a<\/a> \u00e8 una valida alternativa. \u00c8 comunque possibile definire la propria struttura, purch\u00e9 fornisca informazioni consistenti e significative ai consumer.<\/p>\n\n\n\n Una volta preparato l’evento, possiamo inviarlo al custom event bus. La prima barriera che l’evento incontra \u00e8 la Resource Policy \u2014 ma diventa obbligatoria solo se stai inviando eventi a un bus in un account AWS diverso.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\nSe producer ed event bus sono all’interno dello stesso account, i permessi IAM sono sufficienti per l’autorizzazione: l\u2019access policy legata al producer necessita solo del permesso \u00c8 possibile aggiungere una resource policy per un controllo aggiuntivo (come limitare quali principal possono pubblicare in base a condizioni specifiche), ma non \u00e8 obbligatorio, finch\u00e9 producer ed event bus sono all\u2019interno dello stesso account. Lo stesso vale per il default bus che riceve eventi dai servizi AWS; nessuna resource policy \u00e8 necessaria.<\/p>\n\n\n\n Immaginiamo di avere una Custom App nell’Account A che deve inviare eventi a un Custom Event Bus nell’Account B.<\/p>\n\n\n\n Configuriamo il nostro producer – una Lambda Function – con un\u2019access policy che punta al bus dell’Account B; effettuiamo il deploy; proviamo a pubblicare un evento ma… EventBridge blocca la richiesta perch\u00e9 l’accesso cross-account richiede che entrambe le parti siano d’accordo.<\/p>\n\n\n\n In particolare:<\/p>\n\n\n\n Per far passare gli eventi dall’Account A all’Account B, questa resource policy deve essere agganciata all’event bus nell’Account B:<\/p>\n\n\n\n Questa policy dice: “Mi fido dell’Account A. Lascia che i suoi principal pubblichino eventi.” Ora entrambi i controlli di autorizzazione passano e gli eventi possono essere trasmessi all\u2019event bus senza intoppi autorizzativi.<\/p>\n\n\n\n Una volta che l\u2019evento raggiunge l’event bus, EventBridge deve applicare eventuali logiche di trasformazione e capire a chi \u00e8 destinato l\u2019evento. \u00c8 qui che entrano in gioco le EventBridge Rule.<\/p>\n\n\n\n Ad ogni regola di routing, collegata a un event bus, corrisponde un filtro chiamato event pattern. Tale filtro consente di intercettare solo gli eventi che corrispondono all\u2019event pattern. Se il pattern corrisponde, l’evento viene inoltrato ai target associati alla regola di routing, previa eventuale trasformazione dell\u2019input. Un singolo evento pu\u00f2 attivare diverse regole di routing.<\/p>\n\n\n\n Prendiamo in considerazione il seguente evento:<\/p>\n\n\n\n <\/p>\n\n\n\n I seguenti sono esempi di operatori comunemente utilizzati nella definizione di un event pattern.<\/p>\n\n\n\n Exact match (uguaglianza)<\/strong><\/p>\n\n\n\n Match su valori specifici:<\/p>\n\n\n\n Logica OR<\/strong><\/p>\n\n\n\n Usa array per fare match su uno qualsiasi di diversi valori:<\/p>\n\n\n\n Logica AND<\/strong><\/p>\n\n\n\n L\u2019evento corrisponde all\u2019event pattern solo se tutte le condizioni definite sono soddisfatte.<\/p>\n\n\n\n Prefix matching<\/strong><\/p>\n\n\n\n Match su campi che iniziano con uno specifico prefisso:<\/p>\n\n\n\n Suffix matching<\/strong><\/p>\n\n\n\n Match su campi che terminano con uno specifico suffisso:<\/p>\n\n\n\n Wildcard matching<\/strong><\/p>\n\n\n\n \u00c8 possibile utilizzare questa strategia per intercettare dei pattern pi\u00f9 complessi:<\/p>\n\n\n\n <\/p>\n\n\n\n Esclusione con anything-but<\/strong><\/p>\n\n\n\nPuoi escludere valori specifici usando <\/p>\n\n\n\n Combinare operatori di matching<\/strong><\/p>\n\n\n\n In fase di definizione dell\u2019event pattern, \u00e8 possibile combinare diversi operatori per creare filtri complessi. Ecco un esempio che intercetta ordini enterprise ad alta priorit\u00e0:<\/p>\n\n\n\n Questo pattern fa match su eventi che soddisfano tutti i seguenti criteri:<\/p>\n\n\n\n <\/p>\n\n\n\n Oltre ad intercettare gli eventi sulla base di un event pattern (filtering), le regole di routing possono modificarne il contenuto (dispatching).<\/p>\n\n\n\n EventBridge offre quattro strategie di dispatching, pensate per scenari diversi.<\/p>\n\n\n\n Questo \u00e8 l’approccio pi\u00f9 semplice: l’evento viene inoltrato senza essere modificato.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n A volte il target ha bisogno solo di una sezione dell\u2019evento intercettato.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\nUsando Input Path, \u00e8 possibile indirizzare uno specifico campo, eventualmente annidato. Per esempio, \u00e8 possibile inoltrare solo il campo <\/p>\n\n\n\n Cosa riceve il target<\/strong> Nel caso in cui il target dovesse aspettarsi una struttura completamente diversa o un contesto aggiuntivo che non \u00e8 contenuto nell\u2019evento, \u00e8 possibile rimodellare l\u2019evento utilizzando un Input Trasformer.<\/p>\n\n\n\n L\u2019Input Transformer si aspetta un input path e un template.<\/p>\n\n\n\n Input path<\/strong>: definizione di variabili i cui valori vengono estratti dall’evento tramite un\u2019espressione JSONPath.<\/p>\n\n\n\n Template<\/strong>: stringa o JSON contenente placeholder per le variabili definite all\u2019interno dell\u2019input path.<\/p>\n\n\n\n Esempio:<\/strong> trasforma un evento di ordine in un payload di notifica.<\/p>\n\n\n\n Input path<\/strong><\/p>\n\n\n\n Input template<\/strong><\/p>\n\n\n\n Cosa riceve il target<\/strong><\/p>\n\n\n\n In questo caso, ai target viene inoltrato un payload costante e predefinito. Il contenuto dell\u2019evento in input viene ignorato.<\/p>\n\n\n\n Una volta intercettato e modellato dalla regola di routing, l\u2019evento va consegnato al target.<\/p>\n\n\n\n EventBridge supporta diversi tipi di target: funzioni Lambda, Step Function, code SQS, topic SNS e tanti altri. Inoltre, \u00e8 possibile destinare l\u2019evento ad altri event bus. Per ogni regola di routing, \u00e8 possibile definire fino a 5 target che possono risiedere in un account diverso da quello in cui si trova l\u2019event bus sorgente.<\/p>\n\n\n\n \u00c8 possibile configurare una regola di routing per inoltrare eventi a un altro event bus, sia nello stesso account che in un account diverso da quello dell\u2019event bus sorgente.<\/p>\n\n\n\n \u00c8 possibile centralizzare eventi provenienti da diversi account in un singolo account (di monitoring, ad esempio), favorendo la separazione delle responsabilit\u00e0 e una corretta ownership dei team che operano sui vari workload.<\/p>\n\n\n\n Se il target di una regola di routing corrisponde a un altro event bus nello stesso account, EventBridge pu\u00f2 invocare direttamente il target event bus, senza dover specificare un execution role.<\/p>\n\n\n\n Se il target della regola di routing \u00e8 un event bus che si trova in un account diverso da quello del custom event bus sorgente, \u00e8 necessario configurare:<\/p>\n\n\n\n Esempio: Forwarding dall’Account A (111111111111) all’Account B (222222222222)<\/strong><\/p>\n\n\n\n Step 1:<\/strong> creazione di un ruolo IAM nell’Account A che EventBridge pu\u00f2 assumere.<\/p>\n\n\n\n Trust policy<\/strong><\/p>\n\n\n\n Permissions policy<\/strong><\/p>\n\n\n\n Step 2:<\/strong> creazione di una resource policy da associare all\u2019event bus target nell’Account B.<\/p>\n\n\n\n Step 3:<\/strong> configurazione del target della regola di routing, specificando l\u2019ARN del ruolo creato nello step 1.<\/p>\n\n\n\n Come dicevamo in precedenza, a una regola di routing \u00e8 possibile associare fino a un massimo di 5 target. Tuttavia, \u00e8 possibile superare questo limite utilizzando un topic SNS come target della regola di routing.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Questa architettura permette di sottoscrivere nuovi consumer al topic SNS, senza modificare la configurazione della regola di routing.<\/p>\n\n\n\n Tieni a mente…<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Questa citazione famosa di Werner Vogels (CTO di Amazon) \u00e8 un invito a progettare le nostre architetture in modo resiliente, pensando a tutti i possibili scenari di malfunzionamento di uno o pi\u00f9 componenti della nostra soluzione. Problemi di rete, throttling e sistemi target temporaneamente non disponibili sono solo alcuni esempi di problematiche che \u2014 nella fattispecie \u2014 possono impedire il corretto inoltro dell\u2019evento ai consumer.<\/p>\n\n\n\n Quando, lato client, utilizziamo l\u2019API PutEvents per pubblicare un evento sul bus, l’operazione potrebbe fallire.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n\u00c8 importante notare che <\/p>\n\n\n\n Per gestire questi errori, il team responsabile dello sviluppo della Custom App pu\u00f2 introdurre una logica di retry lato client. Ad esempio, \u00e8 possibile implementare un exponential backoff con jitter. Invece di riprovare immediatamente una richiesta fallita, il client aspetta un tempo che aumenta esponenzialmente dopo ogni fallimento. Il jitter, inoltre, introduce una componente casuale nel tempo di attesa, sparpagliando le richieste nel tempo e riducendo le collisioni.<\/p>\n\n\n\n Anche in fase di inoltro dell\u2019evento a uno specifico target di una regola di routing, qualcosa pu\u00f2 andare storto.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Quando un evento non viene recapitato al target per via di errori recuperabili, EventBridge attiva una logica di retry dell\u2019invio sulla base di due soglie: Maximum event age<\/strong> e Maximum retry attempts<\/strong>. I valori predefiniti sono, relativamente, 24 ore e 185 tentativi. EventBridge tenta nuovamente la consegna dell\u2019evento, applicando un backoff esponenziale con jitter. EventBridge ritenta l\u2019inoltro finch\u00e9 una delle due soglie impostate non viene raggiunta o l\u2019evento non viene consegnato con successo. Per evitare che l\u2019evento vada perso nel caso di raggiungimento di una delle due soglie, \u00e8 sempre possibile appellarsi, previa configurazione, a un ulteriore strumento: la Dead Letter Queue.<\/p>\n\n\n\n \u00c8 possibile configurare una coda SQS come DLQ per ciascun target all\u2019interno di una regola di routing. Ogni regola pu\u00f2 avere fino a 5 target e ciascun target pu\u00f2 avere la propria DLQ configurata. Quando EventBridge raggiunge una delle due soglie citate in precedenza, invia l\u2019evento alla DLQ del target invece di scartarlo. In questo modo, l\u2019evento non viene perso e pu\u00f2 essere processato da una logica dedicata.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n L\u2019architettura illustrata nelle ultime immagini serve a dare un\u2019idea delle tecniche che si possono utilizzare per rendere resiliente il flusso di trasmissione dell\u2019evento. Chiaramente, \u00e8 possibile evolvere la soluzione in base ai requisiti del proprio workload. A prescindere dalla dimensione e dalla complessit\u00e0 della nostra architettura, le scelte progettuali vanno fatte tenendo sempre in considerazione la possibilit\u00e0 di malfunzionamenti provocati da uno o pi\u00f9 componenti.<\/p>\n\n\n\n \u00c8 opportuno anticipare possibili malfunzionamenti in produzione attraverso simulazioni eseguite in ambienti di sviluppo e collaudo. Durante i test, ad esempio, \u00e8 possibile far fallire deliberatamente i target, cos\u00ec da verificare che l\u2019evento non vada perduto e che, nel caso peggiore, venga inoltrato alla DLQ. In questo modo, possiamo accertarci che un\u2019architettura resiliente sulla carta lo sia anche in pratica.<\/p>\n\n\n\n Nel primo articolo, abbiamo esplorato le fondamenta concettuali delle Architetture Event-Driven: comprendere gli attori in gioco, gli eventi, i canali di messaging e i pattern di coupling che influenzano l\u2019interazione tra producer e consumer, non solo nel tempo e nella topologia, ma anche nel formato e nella semantica. Questi principi aiutano a comprendere come strutturare sistemi poco accoppiati, che possano crescere e adattarsi facilmente, e come i diversi pattern di messaggistica contribuiscano a raggiungere questi obiettivi.<\/p>\n\n\n\n In questo articolo, siamo passati dalla teoria all’implementazione con Amazon EventBridge<\/strong> come orchestratore del flusso di eventi. Abbiamo ripercorso l\u2019intero ciclo di vita di un evento, partendo dalla pubblicazione di eventi ben strutturati su custom event bus e dalla gestione delle autorizzazioni cross-account tramite resource policy. Abbiamo poi visto come utilizzare event pattern per intercettare e instradare gli eventi, trasformando i payload secondo le esigenze dei target.<\/p>\n\n\n\n Infine, ci siamo concentrati sulla consegna verso target eterogenei \u2014 inclusi event bus cross-account \u2014 e sulla gestione di eventuali malfunzionamenti attraverso meccanismi di retry integrati e Dead Letter Queue.<\/p>\n\n\n\n Spero che questa serie di articoli ti abbia dato gli strumenti necessari per cominciare a progettare e, successivamente, implementare Architetture Event-Driven utilizzando Amazon EventBridge.<\/p>\n\n\n\n Ti invito ad approfondire i temi che abbiamo trattato e di non limitarti ad essi. I servizi evolvono, si aggiungono integrazioni e, molto spesso, i requisiti ci spingono oltre quello che ci offrono le funzionalit\u00e0 di base del servizio core – in questo caso EventBridge – della nostra soluzione.<\/p>\n\n\n\n Le scelte architetturali, soprattutto quelle fatte nelle fasi iniziali di progettazione, possono influire pesantemente sugli sviluppi futuri! Per questo motivo, \u00e8 importante esplorare e studiare tecnologie alternative a quella che abbiamo intenzione di utilizzare.<\/p>\n\n\n\n Come sempre, sentiti libero di condividere feedback o contattarci se vuoi discutere casi d\u2019uso specifici.<\/p>\n\n\n\n Resta sintonizzato per nuovi articoli!<\/p>\n\n\n\nL’event bus<\/h2>\n\n\n\n
L’event envelope<\/h2>\n\n\n\n
aws events put-events --entries '[{\n \"Source\": \"it.besharp.service\",\n \"DetailType\": \"customEvent\",\n \"Detail\": \"{\n \\\\\\\\\"metadata\\\\\\\\\": {\n \\\\\\\\\"event-name\\\\\\\\\": \\\\\\\\\"custom-event-name\\\\\\\\\",\n \u2026\n },\n \\\\\\\\\"data\\\\\\\\\": {\n \\\\\\\\\"key\\\\\\\\\": \\\\\\\\\"value\\\\\\\\\",\n \u2026\n }\n }\",\n \"EventBusName\": \"custom-event-bus\"\n}]'\n<\/code><\/pre>\n\n\n\nLa resource policy<\/h2>\n\n\n\n
<\/figure>\n<\/div>\n\n\nevents:PutEvents<\/strong><\/code> per inviare l\u2019evento all\u2019event bus. \n\n\n\n\n
{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowAccountAToPublishEvents\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::<ACCOUNT-A-ID>:root\"\n },\n \"Action\": \"events:PutEvents\",\n \"Resource\": \"arn:aws:events:us-east-1:<ACCOUNT-B-ID>:event-bus\/custom-event-bus-name\"\n }\n ]\n}\n<\/code><\/pre>\n\n\n\nEvent routing<\/h2>\n\n\n\n
{\n \"version\": \"0\",\n \"id\": \"unique-event-id\",\n \"detail-type\": \"order.created\",\n \"source\": \"com.mycompany.orders\",\n \"account\": \"123456789012\",\n \"time\": \"2026-01-21T10:30:00Z\",\n \"region\": \"us-east-1\",\n \"resources\": [],\n \"detail\": {\n \"metadata\": {\n \"correlationId\": \"corr-123\",\n \"userId\": \"user-789\"\n },\n \"data\": {\n \"orderId\": \"ORD-12345\",\n \"customerId\": \"CUST-789\",\n \"amount\": 99.99,\n \"status\": \"pending\"\n }\n }\n}\n<\/code><\/pre>\n\n\n\nAll\u2019interno dell\u2019event pattern \u00e8 possibile specificare anche i campi nidificati, ad esempio detail.data<\/strong><\/code>.\n\n\n\nPrerequisiti per il matching<\/h4>\n\n\n\n
\n
\"order.created\"<\/strong><\/code> non è \"Order.Created\"<\/strong><\/code>.<\/li>\ndetail.data.orderId<\/strong><\/code> o detail.metadata.userId<\/strong><\/code><\/li>\n\"source\": [\"com.mycompany.orders\"]<\/strong><\/code><\/li>\n<\/ul>\n\n\n\nOperatori di matching<\/h4>\n\n\n\n
{\n \"source\": [\"com.mycompany.orders\"],\n \"detail-type\": [\"order.created\"]\n}\n<\/code><\/pre>\n\n\n\n{\n \"source\": [\"com.mycompany.orders\"],\n \"detail-type\": [\"order.created\", \"order.updated\", \"order.cancelled\"]\n}\n<\/code><\/pre>\n\n\n\nQuesto pattern consente di intercettare eventi con source com.mycompany.orders<\/strong><\/code> e (detail-type order.created<\/strong><\/code> , order.updated<\/strong><\/code> o order.cancelled<\/strong><\/code>).\n\n\n\n{\n \"source\": [\"com.mycompany.orders\"],\n \"detail-type\": [\"order.created\"],\n \"detail\": {\n \"data\": {\n \"status\": [\"pending\"]\n }\n }\n}\n<\/code><\/pre>\n\n\n\n{\n \"source\": [\"com.mycompany.orders\"],\n \"detail\": {\n \"data\": {\n \"orderId\": [{\"prefix\": \"ORD-\"}]\n }\n }\n}\n<\/code><\/pre>\n\n\n\n{\n \"source\": [\"com.mycompany.users\"],\n \"detail\": {\n \"data\": {\n \"email\": [{\"suffix\": \"@mycompany.com\"}]\n }\n }\n}\n<\/code><\/pre>\n\n\n\n{\n \"detail\": {\n \"data\": {\n \"transactionId\": [{\"wildcard\": \"TXN-*-US-*\"}]\n }\n }\n}\n<\/code><\/pre>\n\n\n\n\"TXN-12345-US-VISA\"<\/strong><\/code>, \"TXN-67890-US-AMEX\"<\/strong><\/code> soddisfano il criterio di matching; lo stesso non vale per \"TXN-12345-EU-VISA\"<\/strong><\/code>.\n\n\n\n\nanything-but<\/strong><\/code>:\n\n\n\n{\n \"detail\": {\n \"data\": {\n \"status\": [{ \"anything-but\": [\"cancelled\", \"refunded\"] }]\n }\n }\n}\n<\/code><\/pre>\n\n\n\nQuesto operatore seleziona gli eventi in cui status<\/strong><\/code> non \u00e8 n\u00e9 cancelled<\/strong><\/code> n\u00e9 refunded<\/strong><\/code>.\n\n\n\n{\n \"source\": [\"com.mycompany.orders\"],\n \"detail-type\": [\"order.created\", \"order.updated\"],\n \"detail\": {\n \"metadata\": {\n \"priority\": [\"high\", \"urgent\"]\n },\n \"data\": {\n \"customer\": {\n \"country\": [\"US\", \"CA\", \"GB\"],\n \"email\": [{\"suffix\": \"@enterprise.com\"}]\n },\n \"orderId\": [{\"prefix\": \"ORD-2026-\"}]\n }\n }\n}\n<\/code><\/pre>\n\n\n\n\n
com.mycompany.orders<\/strong><\/code>;<\/li>\norder.created<\/strong><\/code> o order.updated<\/strong><\/code>;<\/li>\nhigh<\/strong><\/code> o urgent<\/strong><\/code>;<\/li>\nUS<\/strong><\/code>, CA<\/strong><\/code>, o GB<\/strong><\/code>;<\/li>\n@enterprise.com<\/strong><\/code>;<\/li>\nORD-2026-<\/strong><\/code>.<\/li>\n<\/ul>\n\n\n\nEvent dispatching<\/h2>\n\n\n
<\/figure>\n<\/div>\n\n\nEvent dispatching – Pass through<\/h4>\n\n\n\n
<\/figure>\n<\/div>\n\n\nEvent dispatching – Filtered: estrarre solo ci\u00f2 che conta<\/h4>\n\n\n\n
<\/figure>\n<\/div>\n\n\ndetail.data<\/strong><\/code>.\n
Input Path:<\/strong> $.detail.data<\/strong><\/code>\n\n\n\n
<\/p>\n\n\n\n{\n \"orderId\": \"ORD-12345\",\n \"customerId\": \"CUST-789\",\n \"amount\": 99.99,\n \"status\": \"pending\"\n}\n<\/code><\/pre>\n\n\n\nEvent dispatching – Transformed<\/h4>\n\n\n\n
{\n \"orderId\": \"$.detail.data.orderId\",\n \"customerEmail\": \"$.detail.data.customer.email\",\n \"amount\": \"$.detail.data.amount\",\n \"eventTime\": \"$.time\"\n}\n<\/code><\/pre>\n\n\n\n{\n \"notificationType\": \"ORDER_CONFIRMATION\",\n \"recipient\": \"<customerEmail>\",\n \"message\": \"Your order <orderId> for $<amount> has been confirmed.\",\n \"timestamp\": \"<eventTime>\"\n}\n<\/code><\/pre>\n\n\n\n{\n \"notificationType\": \"ORDER_CONFIRMATION\",\n \"recipient\": \"customer@example.com\",\n \"message\": \"Your order ORD-12345 for $99.99 has been confirmed.\",\n \"timestamp\": \"2026-01-21T10:30:00Z\"\n}\n<\/code><\/pre>\n\n\n\nEvent dispatching – Static<\/h4>\n\n\n\n
<\/figure>\n\n\n\nI target<\/h2>\n\n\n\n
Event Bus come target: costruire reti di eventi<\/h4>\n\n\n\n
Target Event Bus nello stesso account<\/h4>\n\n\n\n
aws events put-targets \\\\\\\\\\\\\\\\\n --rule MyForwardingRule \\\\\\\\\\\\\\\\\n --targets \"Id\"=\"SameAccountTarget\",\"Arn\"=\"arn:aws:events:us-east-1:111111111111:event-bus\/target-bus\"<\/code><\/pre>\n\n\n\nTarget Event Bus cross-account<\/h4>\n\n\n\n
\n
{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"Service\": \"events.amazonaws.com\"\n },\n \"Action\": \"sts:AssumeRole\"\n }\n ]\n}\n<\/code><\/pre>\n\n\n\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": \"events:PutEvents\",\n \"Resource\": \"arn:aws:events:us-east-1:222222222222:event-bus\/target-bus\"\n }\n ]\n}\n<\/code><\/pre>\n\n\n\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowAccountAToForwardEvents\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111111111111:root\"\n },\n \"Action\": \"events:PutEvents\",\n \"Resource\": \"arn:aws:events:us-east-1:222222222222:event-bus\/target-bus\"\n }\n ]\n}\n<\/code><\/pre>\n\n\n\naws events put-targets \\\\\\\\\\\\\\\\\n --rule MyForwardingRule \\\\\\\\\\\\\\\\\n --targets \"Id\"=\"CrossAccountTarget\",\"Arn\"=\"arn:aws:events:us-east-1:222222222222:event-bus\/target-bus\",\"RoleArn\"=\"arn:aws:iam::111111111111:role\/PutEventsToTargetBusRole\"<\/code><\/pre>\n\n\n\nFan-out attraverso SNS<\/h4>\n\n\n\n
<\/figure>\n<\/div>\n\n\n
<\/figure>\n<\/div>\n\n\nMalfunzionamento lato client<\/h4>\n\n\n\n
<\/figure>\n<\/div>\n\n\nPutEvents<\/strong><\/code> \u00e8 un\u2019API batch (fino a 10 eventi per chiamata) e pu\u00f2 restituire fallimenti parziali: alcuni eventi possono avere successo mentre altri falliscono nella stessa richiesta. La risposta include FailedEntryCount<\/strong><\/code> e l\u2019array Entries<\/strong><\/code> con i dettagli per ciascun evento (ad esempio ErrorCode<\/strong><\/code> e ErrorMessage<\/strong><\/code> per quelli falliti). I client dovrebbero ispezionare la risposta e ritentare l\u2019inoltro degli eventi associati ad un messaggio di errore, non l\u2019intero batch.\n\n\n\nMalfunzionamento in fase di consegna al target<\/h4>\n\n\n\n
<\/figure>\n<\/div>\n\n\nUtilizzo di una Dead Letter Queue<\/h4>\n\n\n\n
<\/figure>\n<\/div>\n\n\nConclusioni: dalla teoria alla pratica<\/h2>\n\n\n\n
That\u2019s all, Folks!<\/h2>\n\n\n\n
\n\n\n\nAbout Proud2beCloud<\/h4>\n\n\n\n