Event-driven Serverless Applications con AWS Lambda

In un precedente articolo abbiamo visto che cosa sono i microservizi. In questo post cercheremo di fare un passo avanti conoscendo il servizio Lambda di Amazon Web Services (AWS). Prima di parlare di Lambda facciamo però un breve passo indietro.

Quando parliamo di cloud computing siamo abituati a pensare subito alle virtual machines (VMs) ed ai containers. Sebbene le differenze tra questi due modi di fare calcolo non siano banali, VMs e containers rappresentano l’ambiente ideale per fare il deployment di architetture software basate su microservizi.

In entrambi i casi l’impegno nella gestione dell’infrastruttura (provisioning, scaling, managing OS updates, infrastructure monitoring, etc.) diventa un nostro onere certamente non banale. E’ proprio a questo “problema” che prova a dare una soluzione Amazon con Lambda.

AWS Lambda consente di eseguire codice senza fare provisioning o doversi occupare della gestione di server. Si paga solo il tempo di calcolo utilizzato e quando il nostro codice non è in esecuzione non paghiamo nulla. Con Lambda chi sviluppa deve esclusivamente preoccuparsi di scrivere il codice e farne l’upload sulla console di gestione AWS. Sarà Lambda ad occuparsi di mettere in piedi tutto il necessario per eseguire, scalare e garantire alta disponibilità alla nostra applicazione.

Quando utilizziamo Lambda dobbiamo disegnare ciascun nostro microservizio composto da parti di codice che implementano delle funzionalità. Il codice eseguito su AWS Lambda è chiamato “Lambda function“. Ogni Lambda function è indipendente dalle altre, è stateless e non ha alcun legame con l’infrastruttura sottostante, in questo modo è possibile eseguire tante copie di una funzione quante sono necessarie per rispondere alle richieste del momento (scaling). L’esecuzione di una funzione può essere sincrona quando fornisce un risultato oppure asincrona quando scateniamo l’azione senza dover attendere il suo completamento e/o il suo esito.
Una Lambda function include il codice da eseguire e alcune informazioni di configurazione tra cui il nome della funzione e le risorse richieste. L’immediato vantaggio di spalmare la business logic di un’applicazione in funzioni, oltre alla già citata scalabilità, è la possibilità di effettuare il deployment delle funzioni in modo totalmente isolato.

Una Lambda function può essere invocata direttamente da un’applicazione web, un’applicazione mobile o da un oggetto intelligente (IoT). Oppure può fargli da trigger un altro servizio AWS (ad esempio Amazon S3, Amazon DynamoDB, Amazon SNS, etc.) al verificarsi di un particolare evento (es. l’aggiunta di un record in una DynamoDB Table, la cancellazione di un file in un S3 Bucket, etc.). Il modello proposto da Amazon per Lambda è totalmente event-driven. Utilizzando Lambda ci orientiamo, quindi, verso un modello di event-driven serverless applications.

Pensando ad un’applicazione web concepire il modello event-driven è immediato per il front-end, dove il submit di un form può essere un banale esempio di evento. Diverso è, invece, il discorso per il back-end dove ragionare per eventi può apparire meno scontato ma il concetto è in ogni caso facile da afferrare.

Attualmente AWS Lambda supporta Java, Node.js e Python, non è richiesto di imparare un nuovo linguaggio per creare le nostre applicazioni. E’ evidente in questo elenco la pesante assenza di un linguaggio open-source come PHP, ma sono sicuro che a breve quelli di Amazon si faranno sentire.

Amazon offre fondamentalmente tre strade per invocare le funzioni Lambda:

  • la prima è quella di utilizzare lo SDK, disponibile anche per mobile, per farne trigger;
  • la seconda è quella di “mettersi in ascolto” di un evento su un altro servizio AWS;
  • la terza è quella di utilizzare il servizio API Gateway per fare mapping tra una Web API ed una funziona Lambda.

Chiudiamo questa introduzione a Lambda accennando al modello di prezzo proposto da Amazon. Il costo viene calcolato in base al numero totale di richieste per tutte le funzioni e in particolare è funzione della durata e della quantità di memoria allocata. Lambda conteggia una richiesta ogni qual volta che viene avviata un’elaborazione in risposta alla notifica di un evento o a una chiamata (invoke). Il primo milione di richieste ogni mese è gratuito.

Non ci resta che dare sfogo alla nostra fantasia ed iniziare a sviluppare con AWS Lambda.

Questions?

Have a question about this post or anything else? Ask away on Twitter or in my AMA repo.

Leave a Reply

Your email address will not be published. Required fields are marked *