Azure Functions: Implementare soluzioni serverless end-to-end in Azure

Si parla da molto tempo di un modello di distribuzione delle applicazioni chiamato serverless, in cui i clienti sono responsabili soltanto del codice dell’applicazione e non si devono interessare dell’infrastruttura che serve a far funzionare il loro codice. Serverless non significa che non esistono server per far funzionare la propria applicazione ma significa che, dalla prospettiva del cliente, il server non viene visto e il cliente non deve prendersi cura dell’infrastruttura e della piattaforma necessari a far girare il codice. L’ambiente creato dal modello serverless inoltre permette di scalare in maniera automatica senza che il cliente se ne accorga.

L’unico compito del cliente è scrivere il proprio codice; diventa responsabilità di Azure provvedere alle infrastrutture e alla piattaforma necessaria a far girare il codice, oltre a mantenere un livello di performce molto alto.

Principi della tecnologia serverless

La tecnologia serverless è basata sui seguenti principi:

  • Costo inferiore: il costo si basa sul consumo effettivo di risorse di elaborazione e potenza. Non ci sono costi se non ci sono consumi.
  • Scalabilità illimitata: con la tecnologia serverless non è necessario eseguire neanche operazioni di scaling manuale o automatico. Tutto viene gestito direttamente dalla piattaforma Azure.
  • Event-driven: Le funzioni serverless vengono eseguite quando accadono determinati eventi. L’evento attiva l’esecuzione della funzione.
  • Esecuzione rapida: Le funzioni non richiedono molto tempo per completare le operazioni richieste dal codice.

Cos’è Azure Functions?

Azure Functions è una soluzione che consente di eseguire facilmente piccole parti di codice, o “funzioni”, nel cloud e rende più produttiva l’attività di sviluppo, consentendo di usare il linguaggio di sviluppo preferito: C#, Java, JavaScript, PowerShell e Python. Tutti i vantaggi sono descritti alla pagina https://azure.microsoft.com/it-it/solutions/serverless/

Quali operazioni si possono eseguire con Azure Functions?

Azure Functions è un’ottima soluzione per l’elaborazione di dati, l’integrazione di sistemi, l’utilizzo di Internet delle cose (IoT) e la compilazione di semplici API e microservizi. È possibile usare Azure Functions per attività come l’elaborazione di immagini o di ordini, la manutenzione di file o per qualsiasi attività si voglia eseguire in base a una pianificazione.

Gli scenari chiave che è possible utilizzare con Azure Functions sono:

  • HTTPTrigger : attiva l’esecuzione del codice usando una richiesta HTTP.
  • TimerTrigger : esegue attività di pulizia o altre attività batch secondo una pianificazione predefinita.
  • CosmosDBTrigger : Elabora i documenti di Azure Cosmos DB quando vengono aggiunti o aggiornati nelle raccolte in un database NoSQL.
  • BlobTrigger : elabora i BLOB di archiviazione di Azure quando vengono aggiunti ai contenitori. Questa funzione può essere usata per il ridimensionamento delle immagini.
  • QueueTrigger : risponde ai messaggi che arrivano in una coda di archiviazione di Azure.
  • EventGridTrigger: rispondere agli eventi inviati a una sottoscrizione nella Griglia di eventi di Azure. Supporta un modello basato su sottoscrizione per la ricezione di eventi, che include funzioni di filtro. Una buona soluzione per la compilazione di architetture basate su eventi.
  • EventHubTrigger: risponde agli eventi inviati a un hub eventi di Azure. È particolarmente utile negli scenari di strumentazione delle applicazioni, elaborazione dei flussi di lavoro o dell’esperienza utente e di Internet delle cose (IoT).
  • ServiceBusQueueTrigger: connette il codice ad altri servizi di Azure o locali rimanendo in ascolto sulle code di messaggi.
  • ServiceBusTopicTrigger: connette il codice ad altri servizi di Azure o servizi locali mediante la sottoscrizione di argomenti.

Per ospitare l’esecuzione delle funzioni è necessaria un’app per le funzioni. Azure Function App consente di raggruppare le funzioni come un’unità logica per semplificare la gestione, la distribuzione, il ridimensionamento e la condivisione delle risorse.

Creazione di una nuova Azure Function App

Per creare una nuova Azure Function App è sufficiente cercare la risorsa nel portale di Azure e cliccare su Create.

Figura 1: Risorsa Azure Function App nel portale di Azure

Inserite le informazioni richieste relative alla sottoscrizione, al gruppo di risorse, al nome della Azure Function App (che deve essere univoco), alla regione di Azure da utilizzare e al Runtime Stack che volete usare. Nel mio caso ho utilizzato PowerShell Core. Per una panoramica delle versioni del runtime disponibili in Azure Functions vi rimando alla lettura dell’articolo https://docs.microsoft.com/it-it/azure/azure-functions/functions-versions

Figura 2: Informazioni di base per la creazione di Azure Function App

Procedete nel wizard e scegliete lo storage account da utilizzare per conservare i dati interni della funzione e i relativi logs. Scegliete anche il tipo di piano da utilizzare per l’hosting dell’applicazione. Esistono attualmente tre tipi di piani di hosting per un’app in esecuzione in funzioni di Azure, ognuno dei quali ha un proprio modello di determinazione dei prezzi: Consumo, Premium e Dedicato. Trovate maggiori informazioni sulla stima dei costi e sulle differenze tra i vari paini visitando la pagina https://docs.microsoft.com/it-it/azure/azure-functions/functions-consumption-costs

Figura 3: Scelta della modalità di Hosting della Azure Function App

Nella pagina Monitoring scegliete se volete abilitare Application Insights per il monitoraggio della vostra applicazione. È consigliabile usare Application Insights perché raccoglie i dati di log, delle prestazioni e degli errori. In più rileva automaticamente le anomalie delle prestazioni e include potenti strumenti di analisi che consentono di diagnosticare i problemi e di comprendere come vengono usate le funzioni. Alla pagina https://docs.microsoft.com/it-it/azure/azure-functions/functions-monitoring trovate maggiori informazioni.

Figura 4: Abilitazione del monitoraggio per la Azure Function App

Controllate le informazioni inserite e cliccate su Create per creare la vostra applicazione.

Figura 5: Pagina di riepilogo della creazione della Azure Functions App

Nel resource group che avete scelto troverete tutte le risorse che sono state create per far funzionare la vostra Azure Function App, in particolare l’App service, il Service Plan, lo Storage account e Application Insights.

Figura 6: Risorse create per la Azure Functions App

Cliccando sulla Function App verrete reindirizzati alla pagina di Overview dell’applicazione, da cui potete comunicare la creazione delle vostre funzioni.

Creazione di una nuova funzione

In questo esempio voglio creare una funzione PowerShell che viene richiamata da un trigger HTTP. La funzione PowerShell dovrà occuparsi di visualizzare lo stato di esecuzione delle macchine virtuali presenti all’interno della mia sottoscrizione.

Per creare una nuova funzione fate click sul tasto +New function e scegliete di creare e di modificare la funzione direttamente nel portale di Azure. Poiché la funzione verrà eseguita nel momento in cui verrà ricevuta una richiesta HTTP (HTTP Request) selezionate il tasto WebHook + API e cliccate su Create. Nelle figure sotto sono mostrati tutti i passaggi.

Figura 7: Avvio del wizard di creazione di una nuova Azure Function

Figura 8: Scelta del tool per la creazione della Azure Function

Figura 9: Scelta del tipo di funzione da creare

La procedura di creazione della funzione dura pochissimi secondi e verrà creato un file PowerShell chiamato run.ps1 uno che eseguirà la funzione HttTrigger1.

Figura 10: Creazione della funzione completata

Potete quindi utilizzare il portale di Azure per modificare il codice della vostra funzione. Sotto è riportato il codice che ho utilizzato per poter conoscere lo stato di esecuzione delle macchine virtuali presenti all’interno della mia sottoscrizione.

 

Ho quindi sostituito il codice di default della funzione con il mio codice personalizzato e ho fatto clic su Save.

Figura 11: Codice personalizzato utilizzato dalla funzione PowerShell

Modifica dei permessi di accesso alla Azure Function App

Poiché il codice che ho utilizzato deve accedere in lettura ad alcune risorse presenti nella sottoscrizione, è necessario registrare l’app in Azure AD e poi assegnargli i permessi di lettura per poter effettuare le operazioni richieste dalla funzione PowerShell. Nella pagina principale della funzione cliccate su Platform Features e successivamente su Identity.

Figura 12: Pagina Platform Features della Azure Funciont

Cliccate su ON per abilitare la creazione di una system assigned managed identity e confermate con Yes. Una system assigned managed identity viene abilitata in un’istanza del servizio di Azure, che crea un’identità per l’istanza nel tenant di Azure AD utilizzato dalla sottoscrizione dell’istanza. Dopo la creazione dell’identità, viene effettuato il provisioning delle credenziali nell’istanza. In questo modo non è necessario inserire nessun tipo di credenziale all’interno del codice per l’autenticazione ai servizi cloud, come è in effetti richiesto dal mio script che vuole enumerare lo stato di esecuzione delle macchine virtuali della mia sottoscrizione.

Figura 13: Creazione di una system assigned managed identity per la mia Azure Function App

Figura 14: Creazione della system assigned managed identity completata

Ho proceduto quindi a modificare i permessi di accesso alla mia sottoscrizione e ho concesso il ruolo di Reader alla system assigned managed identity appena creata.

Figura 15: Modifica dei permessi di RBAC per la sottoscrizione

Test della Azure Function App

Per poter testare il corretto funzionamento della Azure Function App creata sarà sufficiente cliccare sull’HttpTrigger della funzione e recuperare il Function URL, come mostrato in figura:

Figura 16: Function URL utilizzato dall’HttpTrigger della funzione

Inserite il Function URL in un browser e verificate il corretto funzionamento della vostra funzione. Come si vede nell’immagine in basso, la funzione mi restituisce (in formato HTML) lo stato di esecuzione delle macchine virtuali associate alla mia sottoscrizione Azure.

Figura 17: Pagina web creata dalla Azure Function App

Ovviamente potete far fare alla funzione molte più operazioni e potete decisamente divertivi con l’HTML. Potete utilizzare il portale di Azure per creare un secondo trigger HTML e modificare il codice della vostra funzione. Sotto è riportato il codice che ho utilizzato per il secondo trigger:

 

Figura 18: Creazione di un secondo trigger HTTP ed utilizzo della formattazione HTML

Il risultato è quello mostrato nella figura sotto:

Figura 19: Pagina web creata dalla Azure Function App con codice HTML personalizzato

Conclusioni

Azure Functions consente di eseguire il codice in un ambiente senza server (serverless), senza dover prima creare una macchina virtuale o pubblicare un’applicazione Web. Una Azure Function App consente di raggruppare le funzioni come un’unità logica per semplificare la gestione, la distribuzione, il ridimensionamento e la condivisione delle risorse. In questo modo è possibile scrivere solo il codice necessario per far funzionare l’applicazione, senza preoccuparsi dell’infrastruttura necessaria per eseguirlo.