Sviluppo remoto su AWS: da Cloud9 a VS Code
20 Novembre 2024 - 2 min. read
Alessio Gandini
Cloud-native Development Line Manager
Negli ultimi anni abbiamo assistito a una crescita costante della popolarità di dispositivi connessi ad internet, portando alla nascita di ecosistemi IoT (Internet of Things). Tra le applicazioni IoT nel settore industriale o retail troviamo la telemetria, il controllo remoto, l'inventario, i sistemi di monitoraggio biomedico, i dispositivi indossabili per il fitness, i gadget connessi per gli assistenti vocali e molto altro. Tutti questi oggetti devono essere accessibili da Internet per permetterci di monitorarne costantemente lo stato, ricevere notifiche o controllarli a distanza.
In questo articolo tratteremo l'argomento in modo piuttosto informativo e discorsivo, partendo dalle aree più generiche fino ai classici problemi che ci si trova ad affrontare sviluppando questo tipo di applicazioni, alla descrizione dei protocolli e, infine, una panoramica dei servizi che AWS offre per la realizzazione di soluzioni IoT.
Nei capitoli seguenti esamineremo la creazione di un ecosistema IoT, i punti chiave da considerare e quali strumenti possono aiutarci.
Supponiamo di voler realizzare una produzione di massa di dispositivi connessi. Dobbiamo considerare che gli utenti potrebbero posizionarli ovunque, la quantità di dati trasferiti potrebbe variare e la comunicazione potrebbe dover essere bidirezionale. Potremmo avere dispositivi collocati in una stanza con accesso a una connessione Internet stabile senza vincoli di larghezza di banda e altri che operano all'aperto collegati tramite una rete mobile. Queste limitazioni ci costringono a scegliere un protocollo leggero ed elastico adatto a varie condizioni di rete e posizionamento dei dispositivi.
La sicurezza della nostra infrastruttura è da considerarsi cruciale: ogni dato inviato dai nostri dispositivi deve essere crittografato sia in transito che a riposo. Anche se il traffico non contiene informazioni sensibili secondo le leggi applicabili, non vogliamo che persone o sistemi non autorizzati scoprano cosa viene inviato o ottengano l'accesso alle informazioni sull'infrastruttura sottostante. Inoltre, i dati a volte possono essere difficili da classificare e le informazioni sensibili potrebbero non essere evidenti all'inizio, pertanto l'approccio più sicuro consiste nel considerare tutto il traffico e i dati archiviati come delicati, applicando quindi un livello di sicurezza ragionevole a tutti i livelli. Dobbiamo proteggere il tunnel di connessione perché la situazione peggiore che potrebbe verificarsi è l’esposizione di backdoor che potrebbero potenzialmente consentire a chiunque l’accesso ai nostri dispositivi.
La tipica applicazione IoT consiste in un insieme di azioni che vengono eseguite lato server quando i client inviano messaggi, inclusa l'elaborazione e l'invio di risposte o comandi/notifiche ai dispositivi. La frequenza dei messaggi può variare a seconda dell'applicazione, con picchi di lavoro alternati a periodi di inattività, quindi la nostra architettura deve essere scalabile ed elastica. Nella maggior parte dei casi, il software deve reagire agli eventi. Quando un client notifica un cambio di stato al server, viene creato un nuovo evento e diverse aree dell'applicazione back-end possono agire di conseguenza. Vogliamo inoltre che la nostra architettura si adatti al numero di dispositivi connessi in modo da essere sufficientemente elastica per far fronte a un carico di lavoro crescente.
MQTT sta per Message Queuing Telemetry Transport ed è un protocollo di messaggistica creato per soddisfare gli scopi sopra citati. Di solito si appoggia al protocollo TCP/IP e definisce due tipi di entità di rete:
Il broker di messaggi offre diversi topic, che consistono in spazi utili per organizzare le informazioni pubblicate dai client, e tiene traccia degli stati di connessione, delle credenziali di sicurezza e dei certificati di tutti i dispositivi. Se la comunicazione deve essere bidirezionale, i client possono anche sottoscriversi a un topic specifico (o più di uno se necessario) per ricevere i messaggi pubblicati dal broker di messaggi.
Esistono tre tipi di messaggi che i client possono inviare al broker di messaggi:
È possibile inoltre configurare la qualità del servizio, che indica i parametri usati per caratterizzare la qualità del servizio offerto dal broker. Questi sono i possibili valori che puoi configurare:
Poiché la sicurezza è un punto cruciale delle infrastrutture IoT, il protocollo MQTT può proteggere le informazioni trasferite utilizzando TLS e autenticare i client utilizzando protocolli di autenticazione moderni, come OAuth.
Come promesso all'inizio dell'articolo, analizzeremo i servizi di AWS che possono essere utilizzati per sviluppare applicazioni IoT nel cloud. Ma niente paura, seguiranno altri articoli in cui esploreremo nel dettaglio i servizi e i principali pattern architettonici che possiamo utilizzare!
AWS offre un'ampia varietà di servizi che possono aiutarci a costruire una solida soluzione IoT e il più famoso è IoT Core.
IoT Core ti consente di gestire le connessioni MQTT tra i tuoi dispositivi e il cloud in un ambiente completamente serverless. Pagherai solo per le risorse che utilizzerai e si scalerà automaticamente in base alle tue esigenze.
Per creare una nuova connessione è necessario prima configurare un dispositivo su IoT Core. La creazione del dispositivo è semplice. Tutto ciò di cui hai bisogno è un nome per la tua risorsa e configurare i certificati utilizzati per creare una connessione crittografata. Puoi anche organizzare il dispositivo IoT in gruppi distinti, assegnare tag per facilitare il filtraggio e inserirli nel proprio gruppo di fatturazione per allocare i costi.
I certificati sono facili da creare: IoT Core fornirà le chiavi private e pubbliche con pochi click (è vivamente consigliato archiviarle in un bucket S3 crittografato poiché non saranno accessibili dopo il processo di creazione dell'oggetto). Se desideri fornire i tuoi certificati, IoT Core ti consente di caricarli ed associarli al dispositivo.
L'ultima cosa da fare prima di iniziare ad utilizzare il tuo nuovo dispositivo è applicare una policy.
Le policy definiscono cosa può fare il tuo dispositivo. Ad esempio, potresti avere oggetti che possono pubblicare e sottoscriversi ad un sottoinsieme specifico di topic, altri che possono solo ricevere notifiche senza poter inviare messaggi, ecc. Queste policy di sicurezza possono essere modificate in seguito e la modifica avrà effetto immediato.
IoT Core fornisce inoltre una funzionalità chiamata shadow. Lo shadow è un documento JSON che contiene lo stato corrente di uno specifico dispositivo. I tuoi dispositivi possono aggiornarlo semplicemente pubblicando un messaggio sull’endpoint del proprio topic. Un oggetto IoT può avere più shadow con nome e solo una senza nome. Il contenuto degli shadow è accessibile dall'applicazione anche quando il relativo dispositivo è offline e viene inoltrato al dispositivo quando questo si riconnette.
Gli oggetti IoT possono trarre vantaggio dallo shadow poiché è un modo per archiviare lo stato e la configurazione in uno spazio cloud centralizzato accessibile solo da esso e dalla tua applicazione.
A fronte degli aggiornamenti sui topic, potresti voler scatenare eventi che li gestiscano. Questo può essere fatto con le IoT Rules. Ogni regola ha un nome, un'istruzione simile a SQL che consente di filtrare i messaggi e selezionare un sottoinsieme di campi e un elenco di azioni da intraprendere. È possibile associare diversi servizi AWS alle tue regole IoT; Ecco alcuni esempi:
Quest'ultimo servizio è utile anche quando vuoi ridurre il numero di chiamate ed i costi di S3: è consigliato evitare l’esecuzione di una chiamata PutObject verso S3 per ogni aggiornamento inviato dai tuoi dispositivi perché si rischia di incorrere in un aumento inaspettato dei costi del servizio. Con Kinesis Firehose è possibile archiviare più messaggi in un singolo oggetto S3 con una singola chiamata API.
La console IoT Core offre un modo semplice e rapido per monitorare lo stato generale dei tuoi dispositivi. È possibile consultare direttamente dalla homepage del servizio il numero di dispositivi attualmente connessi, il numero di messaggi pubblicati e le regole eseguite. Inoltre IoT Core può essere configurato per pubblicare i log delle attività e metriche su Amazon CloudWatch.
Supponiamo di voler costruire un ecosistema IoT con diversi sensori che raccolgono informazioni meteorologiche. Ogni sensore è un dispositivo IoT Core con i propri certificati e invia periodicamente un aggiornamento in formato JSON contenente le informazioni di campionamento a uno o più topic MQTT. Ecco cosa vogliamo fare:
Questa possibile architettura soddisfa tutte le nostre esigenze: è interamente serverless, il che significa che può scalare in base alle nostre esigenze; è conveniente perché paghiamo solo per le risorse che stiamo utilizzando; è elastica poiché può crescere in termini di funzionalità in quanto ogni aspetto della nostra applicazione è disaccoppiato dagli altri; le connessioni tra client e IoT Core sono crittografate, quindi la nostra infrastruttura è sicura.
Abbiamo esplorato le principali aree di interesse relative al mondo IoT; abbiamo introdotto il protocollo MQTT ed il servizio AWS IoT Core con le sue funzionalità principali utili a costruire applicazioni interamente cloud-native
Restate sintonizzati per la serie di futuri articoli in cui approfondiremo le problematiche legate al mondo IoT e di cui questo è solo il capitolo introduttivo!