Azure Function App: piccole funzioni, una grande differenza

Azure Function App è un servizio di cloud computing offerto da Microsoft Azure che permette di eseguire piccole porzioni di codice, chiamate "funzioni", senza la necessità di gestire l'infrastruttura sottostante. Si tratta di un esempio di architettura serverless, dove gli sviluppatori possono concentrarsi sul codice e sulla logica applicativa, mentre la gestione dell'infrastruttura viene gestita dal provider cloud. In questo articolo dedicheremo un po’ di tempo a capire meglio cos’è, come funziona e come cominciare a creare una function app da zero.

Cosa troverai in questo articolo

  • Azure Function App: che cos’è?
  • Azure Function App: come funziona?
  • Azure Function App Triggers e Binding
  • Azure App Service vs. Function App
  • Azure Function App: come crearne una?
Azure Function App: piccole funzioni, una grande differenza

Azure Function App: che cos’è?

Azure Function App è un servizio offerto dalla piattaforma cloud di Microsoft che aiuta gli utenti a creare e distribuire applicazioni rapidamente. Questa tecnologia sfrutta i vantaggi offerti sia dal cloud computing che dal serverless computing per permettere agli sviluppatori di creare soluzioni software complesse in tempi significativamente inferiori rispetto ai metodi tradizionali.

Il computing serverless è un tipo di modello di calcolo in cui lo sviluppatore scrive il codice nel cloud e non deve gestire istanze di server o la fornitura di componenti software, concentrandosi solo sulla scrittura del codice.

In sostanza elimina tutte le seccature legate alla gestione delle risorse software sottostanti, come server e database. Niente più preoccupazioni per la gestione dell'hardware e, inoltre, il serverless computing offre anche significativi risparmi sui costi; gli utenti pagano solo per ciò che viene utilizzato – il che significa che quando le loro app sono inattive durante i periodi più tranquilli, i costi diminuiscono notevolmente.

Combinando i servizi cloud di Azure con le funzionalità di Function App, gli sviluppatori possono sviluppare app senza preoccuparsi di ciò che accade sui server sottostanti – ottenendo così scalabilità e bassa latenza per le loro creazioni.

Quindi, se state cercando un modo efficace per ottenere risultati soddisfacenti nello sviluppo delle vostre app, esplorare come funziona Azure Function App potrebbe essere una buona idea e nelle prossime sezioni ci dedicheremo esattamente a questo.

Sviluppare applicazioni basate su eventi, in modo personalizzato

Azure Function App: come funziona?

Azure Function App è, come abbiamo già detto, un servizio cloud di Microsoft che permette agli sviluppatori di eseguire codice senza dover gestire l'infrastruttura sottostante. È ideale per lavori di piccola scala, consentendo di creare programmi basati su eventi in modo semplice e rapido.

Si basa sulla stessa tecnologia di Azure App Service ma con funzionalità aggiuntive come scalabilità, trigger e binding – che rendono le soluzioni sviluppate con Function App adatte per applicazioni nel cloud che richiedono tempi di risposta rapidi o aggiornamenti regolari.

Ma cos'è una Azure Function? Fondamentalmente, è un pezzo di codice che gira sulla piattaforma di cloud computing di Microsoft e può essere scritto in vari linguaggi (JavaScript, C# o Java, per citarne alcuni). Funzionerà allo stesso modo sia che tu utilizzi Windows o Linux come sistema operativo.

Le funzioni vengono attivate da certi eventi come una richiesta HTTP o quando avvengono cambiamenti nel database e questo evita di dover scrivere codice aggiuntivo per cose come chiamare API e eseguire lavori pianificati.

Per comprendere meglio il funzionamento di Azure Function App diamo uno sguardo alle sue componenti chiave:

  • In primo luogo, ci sono i trigger – come richieste HTTP, timer e messaggi in coda che possono essere usati per avviare le funzioni.
  • In secondo luogo, abbiamo i binding – parametri che definiscono i dati disponibili ogni volta che una funzione viene invocata tramite un binding di input o output.
  • Poi, ovviamente, c'è l'evento principale: il codice che viene eseguito quando si verifica il suo trigger o è stato impostato un parametro di binding.
  • Infine, ci sono le limitazioni delle risorse – determinate dall'allocazione delle risorse di calcolo per ogni funzione eseguita e dall'impostazione di restrizioni su quante volte possono essere chiamate in un dato periodo di tempo.

Function App supporta un’ampia varietà di linguaggi come .NET Core, Java 8/9/10/11/12/13+, JavaScript 6+ (Node + Express), Python 2+ / 3+, C# Scripts (file CSX), PowerShell versione 6 (file ps1) e anche la compilazione C# (.csx). Con la 'Function Composition' di Microsoft, è possibile anche combinare molti elementi linguistici diversi in un unico programma. Ciò permette al codice composto in linguaggi diversi di lavorare insieme, consentendo di svolgere compiti sempre più complessi in modo più produttivo.

Oltre a queste caratteristiche, Function App vanta una serie impressionante di funzionalità che lo rendono una scelta eccellente per le applicazioni cloud-native sulla piattaforma di Microsoft.

Per citarne alcune, con i servizi di gestione API si possono utilizzare strumenti per monitorare i modelli di utilizzo e spostare i dati tra le app senza problemi; le Durable Entities consentono di impostare situazioni di calcolo serverless con stato; i servizi cognitivi mettono a tua disposizione modelli di intelligenza artificiale tramite API; gli algoritmi di Machine Learning sfruttano il deep learning (IA); il Batch Processing offre l'auto-scalabilità integrata oltre alle integrazioni con gli strumenti DevOps e i container Docker forniscono ulteriori possibilità.

Integrazione fluida tra dati, intelligenza artificiale e DevOps

Supporta anche architetture serverless e modelli di progettazione di microservizi – senza dimenticare i connettori personalizzati che offrono agli sviluppatori un accesso rapido ai servizi di terze parti come Salesforce o Slack senza dover scrivere codice.

E senza dimenticare la sicurezza, Function App mette a disposizione l'Autenticazione e l'Autorizzazione tramite l'integrazione con i servizi Active Directory e il supporto per Blob Storage per mantenere file di log e altri elementi utilizzati dalla tua applicazione. Si può limitare l'accesso attribuendo ruoli particolari a utenti/gruppi (Lettore/Collaboratore/Proprietario) e assicurarsi che qualsiasi dato riservato memorizzato su servizi esterni come database sia crittografato di conseguenza, in modo che solo le persone autorizzate possano vederlo.

Ci sono due modi per distribuire una Azure Function: tramite il Portale di Azure o utilizzando Visual Studio Code in combinazione con GitHub per il controllo delle versioni e il tracciamento della distribuzione. Ciò che è fondamentale qui è che è necessario specificare in quale linguaggio si vuole che la propria funzione sia scritta e quale tipo di versioning; questo assicura che non ci siano problemi di compatibilità tra le dipendenze e che i trigger funzionino come previsto quando avvengono aggiornamenti o rilasci.

Anche se non abbiamo bisogno di un server per le nostre funzioni, ci sono comunque funzionalità di logging che devono essere ispezionate periodicamente in caso di attività dannose, così come informazioni generali sulle prestazioni, come la frequenza con cui le funzioni vengono chiamate, ecc. Tutte queste considerazioni mantengono i dati sicuri e aiutano a stabilire una reale conoscenza di ciò che accade quando la funzione viene messa sotto stress in diverse circostanze.

Sai che aiutiamo i nostri clienti nella gestione dei loro tenant Azure?

Abbiamo creato il team Infra&Security, verticale sul cloud Azure, per rispondere alle esigenze dei clienti che ci coinvolgono nelle decisioni tecniche e strategiche. Oltre a configurare e gestire il loro tenant, ci occupiamo di:

  • ottimizzare i costi delle risorse
  • implementare procedure di scaling e high availability
  • creare deployment applicativi tramite le pipeline di DevOps
  • monitoring
  • e soprattutto security!

Con Dev4Side, hai un partner affidabile in grado di supportarti sull'intero ecosistema applicativo di Microsoft.

Azure Function App Triggers e Binding

Ora che abbiamo esaminato l'anatomia delle Azure Functions in linea generale, diamo uno sguardo più da vicino ai trigger e ai binding per capire meglio come funzionano.

I trigger sono ciò che causa l'esecuzione di una funzione. Definiscono come la funzione viene invocata e possono essere basati su una varietà di eventi o pianificazioni. Ogni funzione deve avere esattamente un trigger. Il tipo di trigger utilizzato determina i dati disponibili per la funzione e l'ambiente in cui essa viene eseguita.

Tipi comuni di trigger includono:

  1. Trigger HTTP: Invoca la funzione tramite una richiesta HTTP. Questo è utile per creare API o rispondere a webhook.
  2. Trigger Timer: Invoca la funzione in base a una pianificazione definita usando un'espressione cron. Questo è utile per attività che devono essere eseguite periodicamente.
  3. Trigger Blob: Invoca la funzione quando viene rilevato un nuovo blob o un blob aggiornato in un contenitore di Azure Blob Storage specificato.
  4. Trigger Coda: Invoca la funzione quando viene trovato un nuovo messaggio in una coda di Azure Storage.
  5. Trigger Service Bus: Invoca la funzione quando è disponibile un nuovo messaggio in una coda o in un argomento di Azure Service Bus.
  6. Trigger Event Hub: Invoca la funzione quando vengono consegnati eventi a un Azure Event Hub.
  7. Trigger Cosmos DB: Invoca la funzione quando vengono apportate modifiche ai documenti in un database di Azure Cosmos DB.
  8. Trigger Event Grid: Invoca la funzione quando viene ricevuto un evento Event Grid.

I binding forniscono un modo per connettere la tua funzione ad altri servizi e sorgenti di dati senza dover scrivere codice di integrazione personalizzato. Essi astraggono le complessità sottostanti e permettono ai developer di concentrarsi sulla logica aziendale.

I binding possono essere input binding (per portare dati nella funzione) o output binding (per inviare dati dalla funzione) e includono:

  1. Binding Blob Storage
    • Input Binding: Legge un blob e fornisce i suoi contenuti alla funzione.
    • Output Binding: Scrive dati dalla funzione a un blob specificato.
  1. Binding Queue Storage
    • Input Binding: Legge messaggi da una coda di Azure Storage.
    • Output Binding: Scrive messaggi in una coda di Azure Storage.
  1. Binding Service Bus
    • Input Binding: Legge messaggi da una coda o da un argomento di Service Bus.
    • Output Binding: Scrive messaggi in una coda o in un argomento di Service Bus.
  1. Binding Cosmos DB
    • Input Binding: Recupera documenti da una raccolta di Cosmos DB.
    • Output Binding: Scrive documenti in una raccolta di Cosmos DB.
  1. Binding Table Storage
    • Input Binding: Legge entità da un Azure Table Storage.
    • Output Binding: Scrive entità in un Azure Table Storage.
  1. Binding HTTP
    • Input Binding: Recupera dati della richiesta HTTP.
    • Output Binding: Invia dati di risposta HTTP.

Ma come funzionano insieme nello specifico? Un primo esempio coinvolge un Trigger HTTP e un Output Binding Blob Storage. In questo scenario, una richiesta HTTP carica un file su Azure Blob Storage. La funzione viene quindi invocata dalla richiesta HTTP e il contenuto del file viene memorizzato in un blob.

Un possibile secondo scenario riguarda un Trigger Timer e un Binding Cosmos DB. Immaginiamo di dover implementare un'attività programmata che si esegue ogni notte per aggregare dati da vari documenti in una raccolta di Cosmos DB. In questo caso la funzione è invocata da un Timer e interagisce con Cosmos DB utilizzando sia binding di input che di output.

Infine, un terzo esempio possibile potrebbe coinvolgere un Trigger Queue e un Output Binding Service Bus. In questo caso, una funzione elabora messaggi da una coda di Azure Storage e li inoltra a una coda di Service Bus per ulteriori elaborazioni. La funzione viene invocata da nuovi messaggi nella coda di Storage e utilizza un binding di output per inviare messaggi alla coda di Service Bus.

Azure App Service vs. Function App

Tra l’enorme mole di servizi messi a disposizione da Azure, diversi sono dedicati all’esecuzione e la scrittura di codice per app. Spesso una nomenclatura simile e funzionalità apparentemente intercambiabili possono confondere gli utenti alle prime armi della piattaforma, che potrebbero rimanere perplessi di fronte alla scelta dello strumento giusto per risolvere le loro problematiche.

In questa sezione ci soffermeremo brevemente sulla differenza tra Function App e un altro dei servizi di Azure pensato per lo sviluppo di App, ovvero App Service, entrambe due offerte di Azure pensate per eseguire codice, ma con scopi e modelli di utilizzo differenti.

Azure Function App è, come abbiamo già potuto vedere, una piattaforma di esecuzione serverless in cui il codice viene eseguito in risposta a eventi specifici, come una richiesta HTTP o un messaggio in una coda, e Azure si occupa automaticamente di allocare le risorse necessarie.

Invece, Azure App Service è un servizio che permette di ospitare applicazioni web, API e servizi backend su infrastruttura gestita. Anche se offre scalabilità automatica, il modello di esecuzione è più tradizionale rispetto a Function App e, in questo caso, si ha maggiore controllo sull'ambiente di esecuzione, potendo configurare il runtime, gestire sessioni e mantenere lo stato dell'applicazione tra le richieste.

La differenza principale sta quindi nell'approccio alla gestione dell'infrastruttura e nell'utilizzo: Azure Function App è orientata all'esecuzione di codice in modo reattivo e su richiesta, senza preoccuparsi dei server, mentre Azure App Service è una piattaforma per l'hosting di applicazioni web più strutturate, con una maggiore enfasi sul controllo e la configurazione dell'ambiente di esecuzione.

App Service è dunque maggiormente indicato per applicazioni web di media o grande complessità che necessitano di essere sempre attive e pronte a rispondere a richieste degli utenti, garantendo una disponibilità continua, dove invece Function App è particolarmente utile per compiti brevi e puntuali, in cui il codice viene eseguito solo quando richiesto, con una gestione dinamica della scalabilità, un approccio ideale per scenari come l'elaborazione di eventi, la gestione di trigger e l'automazione di compiti che devono reagire a cambiamenti o input esterni.

Panoramica di Azure App Service

Azure Function App: come crearne una?

Ma perché limitarci a descriverne la facilità d’uso quando possiamo metterla alla prova personalmente? Ora che abbiamo un’idea più chiara delle sue componenti principali e del suo funzionamento è arrivato il momento di testare Azure Function App sul campo e lo faremo creando una piccola applicazione di prova.

Prerequisiti per la creazione di una Function App

Ci sono alcuni prerequisiti di cui dobbiamo essere a conoscenza prima di creare una Azure Function App:

  • Un account Azure valido con una sottoscrizione.
  • Un Piano di Servizio all'interno del quale la funzione deve essere creata ed eseguita. Solitamente, esistono due tipi di piani di servizio:
    1. Piano App Service: consente all'utente di eseguire continuamente il codice su un contenitore virtuale con un set di risorse computazionali allocate.  A differenza del piano Consumer, non c’è nessun timeout per le funzioni.
    2. Piano Consumer: addebita solo per la durata in cui la funzione viene eseguita. Per queste funzioni è impostato anche un timeout, che per impostazione predefinita è fissato a 5 minuti e che può essere portato fino a un massimo di 60 minuti.
  • Un Account di Archiviazione in Azure, che sarà collegato alla Function App e può essere utilizzato per archiviare informazioni come log e gestire trigger, ecc. Possiamo anche utilizzare questo account di archiviazione per archiviare i file di configurazione per questa funzione.

Creazione della funzione

Ci sono tre modi in cui possiamo creare una Function App:

  • Utilizzando il portale di Azure
  • Utilizzando la Azure CLI (Command Line Interface)
  • Utilizzando un editor di codice, come Visual Studio Code

In questo tutorial, esploreremo la prima opzione, ovvero l'utilizzo del portale di Azure. Accediamo al portale di Azure (accessibile visitando https://portal.azure.com) e cerchiamo Function App.

Si aprirà la dashboard della Function App, che appare come mostrato di seguito. Poiché non si è creato alcuna funzione, la dashboard è vuota. Nel caso si fossero create funzioni in precedenza (e queste siano ancora attive), verrà visualizzato un elenco di tutte le funzioni disponibili create in questo account.

Facciamo clic su Add in alto, oppure clicchiamo sul pulsante Create Function App per iniziare a creare l'applicazione.

Dashboard di Azure Functions

Nella pagina successiva, dovremo fornire alcuni dettagli di configurazione su come desideriamo creare la funzione e il suo nome, insieme ad alcuni altri parametri. La prima opzione qui è selezionare l'account di sottoscrizione sotto il quale verrà creata la funzione. Lo si può considerare come un raggruppamento logico per la gestione della fatturazione. In questo caso abbiamo una sottoscrizione predefinita, che selezioneremo per procedere.

Il parametro successivo è selezionare il resource group. Il resource group è anch'esso un gruppo logico e può essere utilizzato per raggruppare varie risorse che appartengono alla stessa soluzione. È possibile selezionare un gruppo di risorse già esistente oppure procedere creandone uno nuovo come segue.

Dettaglio creazione nuovo resource group

Una volta creato il resource group, possiamo procedere con gli altri parametri. Il prossimo punto importante è fornire un nome valido per la funzione. Questo nome deve essere univoco a livello globale, poiché verrà utilizzato come parte dell'URL di base.

Selezioniamo l'opzione Publish come Code e lo stack runtime come .NET Core. Si può scegliere qualsiasi altro stack runtime in base alle proprie preferenze.

Infine, sarà necessario selezionare la regione in cui desideri distribuire la tua funzione. Come buona pratica, la funzione dovrebbe essere distribuita in una regione vicina a quella in cui si trova il tuo cliente. In questo caso useremo la regione West Europe.

Dettaglio inserimento dati

Una volta compilate tutte queste informazioni, facciamo clic su Next: Hosting e configuriamo i parametri relativi.

Qui dobbiamo definire i dettagli dell'account di archiviazione, che verranno utilizzati dalla nostra funzione. Se si dispone già di un account di archiviazione, si può tranquillamente utilizzare quello o crearne uno nuovo.

Dettaglio creazione nuovo account di storage

Una volta creato l'account di archiviazione, potremo selezionare il sistema operativo e il piano per la funzione. Il sistema operativo predefinito per .NET Core è Windows. Per il piano, selezioneremo il Piano Consumption, che verrà scalato in base a quando la funzione viene attivata e sarà tariffato in base al tempo di esecuzione.

Dettaglio selezione piano e sistema operativo

Facciamo poi clic su Next: Monitoring per configurare i parametri di monitoraggio. Qui ci verrà chiesto se desideriamo abilitare Application Insights o meno. Per questo tutorial, questa opzione rimarrà disabilitata poiché non è parte integrante dell'argomento trattato. Facciamo quindi clic su No e procediamo oltre.

Dettaglio abilitazione Application Insights

In questa fase, puoi fare clic su Review + Create per creare la funzione come specificato. Verranno verificate tutte le informazioni e successivamente verranno visualizzati i dettagli per la tua revisione. Una volta che hai esaminato i dettagli in questa pagina, procedi e fai clic su Create.

Schermata Review + Create

Il processo di distribuzione della funzione potrebbe richiedere del tempo, a seconda delle risorse disponibili. Una volta completata la distribuzione, vedrai le seguenti informazioni apparire sulla dashboard.

Schermata completamento deployment

Verifica e scrittura di codice

Una volta creata la Function App, il passo successivo è verificare l'URL della funzione e confermare se l'app è attiva e funzionante. Facciamo clic sull'URL e verremo reindirizzati alla homepage della Function App.

Dettaglio url applicazione

La pagina appare simile alla figura sottostante. Questo significa che la Azure Function App è ora attiva e funzionante.

Pagina dell’URL

Ora che sappiamo che la nostra funzione è attiva, è il momento di scrivere il codice che dobbiamo distribuire in questa funzione. Durante la creazione della nuova funzione, è importante tenere a mente i seguenti due punti prima di procedere:

  • Tipo di Trigger – Definisce come deve essere chiamata la funzione; può essere una chiamata HTTP, una modifica in una tabella del database o qualsiasi altro evento che possa attivare una funzione.
  • Opzioni di Authoring – Gli utenti possono scegliere come preferiscono scrivere il codice per questa funzione. Possono scrivere il codice utilizzando l'editor di codice integrato in Azure, oppure scegliere un editor di codice desktop preferito, come Visual Studio Code o Sublime Text.

Fai clic su Function e poi seleziona Add. Apparirà un elenco di modelli sulla destra; seleziona HTTP Trigger.

Selezione di HTTP Trigger

Una volta selezionato il tipo di trigger, forniamo i dettagli sulla funzione. Inseriamo un nome per la funzione e il livello di autenticazione. Selezioniamo in questo caso Anonymous come livello di autenticazione e facciamo clic su Create Function.

Dettaglio nome funzione e livello di autorizzazione

La funzione verrà creata e distribuita entro pochi minuti, e possiamo verificare i dettagli come segue.

Funzione creata

Facciamo clic su Code + Test per visualizzare il codice fornito.

Per testare questa funzione, facciamo clic su Test/Run. Verrà visualizzato un pannello sulla destra in cui dovremo impostare il metodo HTTP su GET. Inoltre, aggiungiamo un parametro name alla lista delle query con un valore a scelta. In questo particolare caso abbiamo utilizzato un nome casuale. Clicchiamo su Run una volta completato.

Test funzione

Conclusioni

Il panorama cloud sta offrendo giorno dopo giorno nuove possibilità ai developer che desiderano sfruttarne il potenziale per la scrittura e la distribuzione delle proprie applicazioni.

In questo contesto, Azure (che ricordiamo è la seconda piattaforma cloud più utilizzata al mondo), con la sua mole di servizi, si posiziona grazie a offerte come quelle di Azure Function App come una scelta incredibilmente solida per tutti quegli sviluppatori che vogliono sfruttare le potenzialità del serverless computing e dello sviluppo di applicazioni, slegato dalle vetuste preoccupazioni legate all’infrastruttura sottostante e concentrarsi solo sulla scrittura delle loro app: la parte davvero importante e creativa del loro lavoro.

Non resta dunque che invitarvi a provarlo e vedere se la soluzione di Microsoft basata su questi piccoli frammenti di codice può fare anche per voi una grande differenza in termini di tempo e risorse.

FAQ su Azure Function App

Cos'è Azure Function App?

Azure Function App è un servizio di cloud computing serverless fornito da Microsoft Azure. Consente agli sviluppatori di eseguire piccoli pezzi di codice, chiamati "funzioni", senza gestire l'infrastruttura sottostante.

Come funziona Azure Function App?

Azure Function App funziona su trigger basati su eventi, scalando automaticamente in base alla domanda. È ideale per attività come richieste HTTP o modifiche ai database.

Quali linguaggi sono supportati da Azure Function App?

Azure Function App supporta vari linguaggi tra cui JavaScript, C#, Java, Python e PowerShell.

Quali sono i trigger comuni di Azure Function App?

I trigger comuni includono richieste HTTP, timer, messaggi Azure Queue e modifiche a Cosmos DB.

In cosa si differenzia Azure Function App da Azure App Service?

Azure Function App è ottimizzato per l'esecuzione di piccole attività basate su eventi senza gestione del server, mentre Azure App Service ospita applicazioni web complete con maggiore controllo sull'ambiente di esecuzione.

Come si crea una Azure Function App?

Una Azure Function App può essere creata tramite il portale Azure, Azure CLI o editor di codice come Visual Studio Code.

Cosa sono i binding in Azure Function App?

I binding in Azure Function App consentono alle funzioni di connettersi ad altri servizi, come Blob Storage o Cosmos DB, senza dover scrivere codice d'integrazione personalizzato.

Quali sono i due principali piani di servizio di Azure Function App?

I principali piani di servizio sono il piano Consumption, che addebita in base al tempo di esecuzione, e il piano App Service, che funziona continuamente senza timeout.

Quali sono i vantaggi di Azure Function App per gli sviluppatori?

Azure Function App semplifica la gestione dell'infrastruttura, permettendo agli sviluppatori di concentrarsi sul codice, rendendolo ideale per applicazioni piccole, scalabili e basate su eventi.

Scopri perché scegliere il team

Infra & Sec

Il team Infra & Security è verticale sulla gestione ed evoluzione dei tenant Microsoft Azure dei nostri clienti. Oltre a configurare e gestire il tenant, si occupa della creazione dei deployment applicativi tramite le pipelines di DevOps, monitora e gestisce tutti gli aspetti di sicurezza del tenant, supportando i Security Operations Centers (SOC).