{"id":4451,"date":"2022-05-13T13:58:00","date_gmt":"2022-05-13T11:58:00","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=4451"},"modified":"2022-05-13T12:07:16","modified_gmt":"2022-05-13T10:07:16","slug":"cosa-ho-imparato-dopo-un-paio-di-settimane-di-utilizzo-di-aws-greengrass","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/cosa-ho-imparato-dopo-un-paio-di-settimane-di-utilizzo-di-aws-greengrass\/","title":{"rendered":"Cosa ho imparato dopo un paio di settimane di utilizzo di AWS Greengrass"},"content":{"rendered":"\n
Negli ultimi giorni abbiamo studiato AWS Greengrass, uno dei tanti servizi IoT offerti da Amazon Web Services, che \u00e8 stato aggiornato alla versione v2 l’anno scorso. <\/p>\n\n\n\n
In questo articolo vorrei parlare di ci\u00f2 che ho imparato e delle mie opinioni generali, sperando di aiutare chiunque si stia approcciando a questo servizio per la prima volta proprio come ho fatto io.<\/p>\n\n\n\n
Allora, cominciamo con…<\/p>\n\n\n\n
AWS Greengrass \u00e8 un servizio che ci consente di portare l’esperienza di elaborazione a cui siamo abituati quando lavoriamo con i servizi AWS sui nostri dispositivi IoT. Consiste in un runtime open source che dobbiamo installare sui nostri dispositivi che offre diverse funzionalit\u00e0, ad esempio:<\/p>\n\n\n\n
Come la maggior parte degli altri servizi AWS, Greengrass \u00e8 stato creato per risolvere molteplici problemi in modo gestito senza costringere gli sviluppatori a reinventarsi la ruota ogni volta. Quando creiamo soluzioni IoT dobbiamo preoccuparci della scalabilit\u00e0 della nostra soluzione e di mantenere aggiornato il firmware dei nostri dispositivi. Il compito di Greengrass \u00e8 proprio quello di aiutarci a gestire queste problematiche.<\/p>\n\n\n\n
AWS IoT Greengrass semplifica la distribuzione e la gestione del software dei dispositivi su milioni di dispositivi remoti. Possiamo organizzare i nostri dispositivi in gruppi e distribuire e gestire il software e la configurazione in un sottoinsieme di dispositivi o in tutti i dispositivi. AWS IoT Greengrass ci offre la possibilit\u00e0 di inviare aggiornamenti relativi al nostro codice over-the-air sulle nostre macchine, senza preoccuparci di causare un disservizio dato da un errore sul layer di runtime e costringerci ad andare sul posto del dispositivo per ripristinarlo manualmente. Questo \u00e8 possibile grazie a come \u00e8 stata pensata l\u2019architettura del software in esecuzione: il nostro software \u00e8 suddiviso in diversi componenti disaccoppiati dal Core, che ha il compito di orchestrare i nostri componenti e gestire i job di aggiornamento del firmware.<\/p>\n\n\n\n
Con Greengrass, possiamo eseguire inferenza Machine Learning, aggregazione di dati e streaming su pi\u00f9 servizi cloud AWS (come S3 o Amazon Kinesis) direttamente dai nostri dispositivi, consentendoci quindi di decidere quali dati debbano essere inviati al cloud, in modo da poter ottimizzare i costi di analisi, elaborazione e archiviazione.<\/p>\n\n\n\n
Immagina di creare una soluzione IoT composta da pi\u00f9 dispositivi installati in una fabbrica. Questi dispositivi raccolgono periodicamente i dati e li inviano direttamente a un back-end cloud. I dati vengono quindi elaborati e archiviati, consentendo ai tuoi clienti di sapere se le loro macchine stiano funzionando come dovrebbero, se alcune parti necessitano di manutenzione, e permettendo di configurare eventi personalizzati che devono essere notificati. <\/p>\n\n\n\n
Immagina ora questa soluzione distribuita in migliaia di fabbriche, quindi milioni di dispositivi che ogni pochi minuti inviano un messaggio al tuo back-end: i costi della tua applicazione aumenterebbero con il numero di dispositivi installati. Inoltre, i dati ricevuti da una fabbrica non hanno alcun collegamento con i dati ricevuti da un’altra perch\u00e9 ogni fabbrica \u00e8 considerabile come un\u2019entit\u00e0 a s\u00e9 stante.<\/p>\n\n\n\n
Quindi come possiamo ottimizzare questa infrastruttura? Con Greengrass potremmo configurare una macchina che funziona come un centralizzatore di elaborazione: raccoglie i dati, li aggrega e invia periodicamente un singolo messaggio contenente lo stato globale dell’impianto. Naturalmente i dispositivi potrebbero ancora dover inviare alcune informazioni (come allarmi o eventi) cos\u00ec come sono al nostro back-end, ma spostare parte dell’elaborazione dei dati dal cloud al luogo in cui si trovano i dispositivi migliorerebbe drasticamente i costi della nostra infrastruttura e ridurrebbe il throughput di rete. Avremmo quindi molte meno risorse da configurare e gestire lato cloud, e queste risorse non andrebbero a crescere con il numero di dispositivi ma con il numero di impianti.<\/p>\n\n\n\n
Il mio approccio all’apprendimento di Greengrass \u00e8 stato lo stesso che ho utilizzato per altri servizi AWS: solitamente inizio con una rapida panoramica della documentazione ufficiale per poi costruire qualcosa direttamente dalla console AWS, e quando mi trovo davanti ad un ostacolo eseguo ricerche puntuali sul web per capire come risolvere il problema.<\/p>\n\n\n\n
La mia opinione sulla documentazione ufficiale di Greengrass \u00e8 che \u00e8 molto ampia ma a volte le nozioni sono sparse in sezioni diverse. Mi sono spesso trovato a cercare modi per risolvere un problema che pensavo non fosse documentato, e dopo minuti (se non ore) mi sono reso conto che la soluzione era proprio sotto i miei occhi ma in un\u2019altra sezione della documentazione. Greengrass \u00e8 composto da molti concetti strettamente legati tra di loro, quindi il mio consiglio \u00e8 di studiare approfonditamente la documentazione ufficiale prima di iniziare a creare un progetto.<\/p>\n\n\n\n
Il core device \u00e8 una macchina su cui \u00e8 stato installato il runtime Greengrass. Ci sono molti modi per farlo; il percorso che ho scelto inizialmente \u00e8 il provisioning automatico di Greengrass in un container Docker, poich\u00e9 \u00e8 il modo pi\u00f9 semplice per eseguire questa attivit\u00e0 e non richiede molta configurazione. Tutto quello che dobbiamo fare \u00e8 creare un file “.env” con la configurazione del nostro dispositivo principale che assomiglia a questo:<\/p>\n\n\n\n
GGC_ROOT_PATH=\/greengrass\/v2\nAWS_REGION=eu-west-1\nPROVISION=true\nTHING_NAME=P2BCGreengrassCore\nTHING_GROUP_NAME=P2BCGreengrassCoreGroup\nTES_ROLE_NAME=P2BCGreengrassV2TokenExchangeRole\nTES_ROLE_ALIAS_NAME=P2BCGreengrassCoreTokenExchangeRoleAlias\nCOMPONENT_DEFAULT_USER=ggc_user:ggc_group\n<\/code><\/pre>\n\n\n\nQuesto file “.env” pu\u00f2 quindi essere passato nel file docker-compose.yaml come valore “env_file”; Se impostiamo la chiave PROVISION a true, Greengrass si occuper\u00e0 di creare tutte le risorse necessarie su AWS IoT per configurare un nuovo dispositivo. Ma per fare ci\u00f2, dobbiamo fornire a Greengrass alcune credenziali AWS sotto forma di access key, secret access key e session token. Non ero entusiasta di questa soluzione in quanto non voglio eseguire questa operazione per ogni dispositivo core che installer\u00f2 in futuro e, soprattutto, voglio essere incaricato di creare i ruoli e le autorizzazioni necessarie.<\/p>\n\n\n\n