Azure Functions fa parte del servizio di calcolo serverless di Microsoft. In poche parole, ti permette di eseguire piccole porzioni di codice in risposta a eventi senza dover gestire tu stesso i server.
Per esempio, una funzione può essere eseguita quando arriva una richiesta HTTP, quando un file viene caricato nello storage o anche quando scatta un orario pianificato.
"Serverless" non significa necessariamente che non ci siano server. Significa che è Azure a gestire l'infrastruttura per te. Azure si occupa del provisioning, dello scaling e della manutenzione dietro le quinte.
In questa guida, ti mostrerò i mattoni di base: trigger, binding, opzioni di hosting e un esempio pratico per iniziare.
Cosa sono le Azure Functions?
Un'Azure Function è semplicemente una piccola porzione di codice che viene eseguita quando viene attivata da un evento che scegli tu. Tu scrivi la logica e Azure si occupa del resto.
Ci sono tre idee che definiscono questo modello.
- L'esecuzione event-driven consente al codice di girare solo quando succede qualcosa, non continuamente.
- Lo scaling automatico permette ad Azure di aggiungere o rimuovere risorse di calcolo in base alla domanda.
- La tariffazione a consumo consente, in alcuni piani di hosting, di pagare solo per il tempo in cui il tuo codice effettivamente gira.
Idealmente, una singola funzione fa un solo lavoro, come ridimensionare un'immagine o elaborare un messaggio. Una Function App è il contenitore che ospita una o più funzioni. Gestisce impostazioni condivise, come configurazione e distribuzione, per tutte le funzioni al suo interno.
Come funzionano le Azure Functions
Il ciclo di vita di una funzione segue un semplice schema, come segue:
- Si verifica un evento, come un caricamento di file o una chiamata HTTP.
- Un trigger rileva l'evento e avvia immediatamente la funzione.
- La funzione esegue il suo codice.
- I binding collegano la funzione ad altri servizi che leggono l'input o inviano l'output necessario.
- Azure gestisce le risorse di calcolo dietro questo processo, ovviamente in base al piano di hosting che hai scelto.
Questo flusso è in gran parte lo stesso indipendentemente dal linguaggio o dall'opzione di hosting. Cambiano solo il trigger, il codice e i binding.
Trigger di Azure Functions
Ogni funzione ha esattamente un trigger. Il trigger definisce come esattamente si avvia la funzione. Ecco i tipi più comuni che dovresti conoscere:
- HTTP Trigger: Esegue una funzione quando riceve una richiesta HTTP. È comune per creare API.
- Timer Trigger: Esegue una funzione a intervalli pianificati, ad esempio ogni ora o una volta al giorno.
- Blob Storage Trigger: Esegue una funzione quando un file viene aggiunto o modificato in Azure Blob Storage.
- Queue Trigger: Esegue una funzione quando arriva un nuovo messaggio in una coda.
- Event Hub Trigger: Esegue una funzione in risposta a un flusso di eventi. Molto utile per grandi volumi di dati.
- Cosmos DB Trigger: Esegue una funzione quando i documenti vengono creati o aggiornati in un contenitore Cosmos DB, sfruttando il Change Feed.
- Service Bus Trigger: Esegue una funzione in risposta a messaggi da una coda o un topic di Azure Service Bus, comunemente usato per la messaggistica enterprise e il disaccoppiamento dei sistemi.
- Durable Functions: Un'estensione di Azure Functions che ti consente di scrivere funzioni con stato in un ambiente serverless per orchestrare workflow complessi e multi-step.
Binding di Azure Functions
Spesso trigger e binding vengono confusi, ma anche se sembrano simili, svolgono compiti completamente diversi. Un trigger avvia una funzione, mentre un binding collega la funzione ai dati leggendoli o inviandoli.
Qui fornisci dati alla tua funzione senza scrivere codice d'integrazione personalizzato. Per esempio, una funzione può leggere automaticamente un record da un database semplicemente dichiarando il binding.
Output binding
Ti permette di inviare il risultato della tua funzione altrove. Ad esempio, puoi usare gli output binding per scrivere un messaggio elaborato in una coda.
Ecco un esempio per chiarire: un trigger Blob Storage avvia una funzione quando viene caricata un'immagine. Un output binding poi salva l'immagine ridimensionata in un altro contenitore di storage. I binding gestiscono le connessioni allo storage e non serve alcun codice client di storage manuale.
Come creare la tua prima Azure Function
Ecco un esempio molto semplice di funzione con trigger HTTP che restituisce un saluto. Il flusso è questo:
- Crea una Function App. È il contenitore per la tua funzione in Azure.
- Scegli un runtime e seleziona il linguaggio in cui vuoi programmare.
- Aggiungi una nuova funzione all'interno della tua Function App.
- Seleziona l'HTTP trigger per fare in modo che la funzione risponda alle richieste web.
- Aggiungi una funzionalità semplice, come leggere un nome dalla richiesta e restituire "Ciao, [nome]."
- Esegui e testa la funzione usando gli strumenti di test integrati o invia semplicemente una richiesta dal browser.
- Distribuiscila su Azure così sarà attiva e raggiungibile.
Ho volutamente reso l'esempio molto piccolo per mostrarti lo schema e lasciare alla tua creatività il resto.
Linguaggi supportati da Azure Functions
Azure Functions supporta molti linguaggi, tra cui:
- C#
- JavaScript/TypeScript
- Python
- Java
- PowerShell
Il supporto e i modelli di sviluppo possono variare per linguaggio e versione. Per questo, ti consiglio di controllare la documentazione di Azure aggiornata prima di iniziare un nuovo progetto, visto che questi dettagli cambiano spesso.
Opzioni di hosting per Azure Functions
Non tutte le Azure Function girano allo stesso modo. Azure offre diversi piani di hosting, ognuno con compromessi differenti. La scelta giusta dipende dal tuo caso d'uso. I principali compromessi sono:
- Scaling: alcuni piani eseguono lo scaling automaticamente e all'istante, mentre altri richiedono un po' più di controllo manuale.
- Comportamento di avvio: alcuni piani mantengono le funzioni "calde". Questo significa semplicemente che sono pronte a girare all'istante, mentre altri avviano le funzioni su richiesta.
- Rete: alcuni piani supportano funzionalità di rete avanzate come la connessione a una rete virtuale privata, mentre altri no.
- Costo: i modelli di prezzo differiscono molto, dal pay-per-execution a costi mensili fissi.
Scaling e cold start in Azure Functions
Ci sono altri due concetti importanti quando la tua funzione gira in produzione. Sono:
Scaling automatico
Qui Azure monitora il carico sulla tua funzione e, quando la domanda aumenta, aggiunge altre istanze di calcolo, mentre quando la domanda cala le rimuove. Non devi gestirlo manualmente.
Cold start
Se una funzione non è stata eseguita di recente, potrebbe aver bisogno di un momento per avviarsi prima di poter gestire una nuova richiesta. Questo ritardo si chiama cold start. Alcuni piani di hosting riducono o evitano questo effetto mantenendo l'istanza calda, come detto.
Casi d'uso comuni per Azure Functions
Il modello event-driven si adatta a molti problemi quotidiani che potresti incontrare. In particolare:
API e webhook
Serve a gestire richieste HTTP in ingresso senza dover mantenere un web server completo attivo 24/7.
Elaborazione di file e immagini
Aiuta ad attivare una funzione ogni volta che un file arriva nello storage, per poi ridimensionarlo, convertirlo o semplicemente analizzarlo.
Job pianificati
Consente di eseguire attività di pulizia, report o promemoria a timer senza bisogno di un server dedicato sempre attivo.
Pipeline di elaborazione dati
Serve per elaborare messaggi o eventi man mano che arrivano, un passaggio alla volta.
IoT ed elaborazione di eventi
Aiuta a gestire grandi volumi di dati da sensori o dispositivi mentre vengono trasmessi.
Attività in background
Scarica il lavoro lento o occasionale, come l'invio di email, in modo che non blocchi la tua applicazione principale.
Monitoraggio e troubleshooting di Azure Functions
Una volta che una funzione è attiva, hai bisogno di visibilità su come sta andando.
Puoi, ad esempio, consultare i log che registrano cosa è successo a ogni esecuzione, molto utili per il debugging. Puoi anche controllare Application Insights negli strumenti Azure, che tiene traccia di prestazioni, richieste ed errori in un'unica posizione centrale.
Dovresti anche monitorare i fallimenti di invocazione, così sai quando e perché una funzione non è andata a buon fine. Il monitoraggio delle prestazioni ti aiuta inoltre a individuare funzioni lente prima che diventino un problema e, ovviamente, puoi configurare i tentativi automatici perché le esecuzioni fallite vengano riprovate.
Conclusione
Azure Functions ti offre un modo per eseguire codice in risposta a eventi, senza dover gestire i server sottostanti. I trigger decidono quando parte una funzione. I binding, invece, semplificano il collegamento di quella funzione ad altri servizi senza codice di integrazione aggiuntivo.
Quando passi da una semplice funzione di test a qualcosa in produzione, le scelte di hosting e scaling contano molto di più. Il piano giusto incide sui costi, ma anche su velocità e affidabilità.
Azure Functions fa parte del servizio di calcolo serverless di Microsoft. In poche parole, ti permette di eseguire piccole porzioni di codice in risposta a eventi senza dover gestire tu stesso i server.
Per esempio, una funzione può essere eseguita quando arriva una richiesta HTTP, quando un file viene caricato nello storage o anche quando scatta un orario pianificato.
"Serverless" non significa necessariamente che non ci siano server. Significa che è Azure a gestire l'infrastruttura per te. Azure si occupa del provisioning, dello scaling e della manutenzione dietro le quinte.
In questa guida, ti mostrerò i mattoni di base: trigger, binding, opzioni di hosting e un esempio pratico per iniziare.
Cosa sono le Azure Functions?
Un'Azure Function è semplicemente una piccola porzione di codice che viene eseguita quando viene attivata da un evento che scegli tu. Tu scrivi la logica e Azure si occupa del resto.
Ci sono tre idee che definiscono questo modello.
Idealmente, una singola funzione fa un solo lavoro, come ridimensionare un'immagine o elaborare un messaggio. Una Function App è il contenitore che ospita una o più funzioni. Gestisce impostazioni condivise, come configurazione e distribuzione, per tutte le funzioni al suo interno.
Come funzionano le Azure Functions
Il ciclo di vita di una funzione segue un semplice schema, come segue:
Questo flusso è in gran parte lo stesso indipendentemente dal linguaggio o dall'opzione di hosting. Cambiano solo il trigger, il codice e i binding.
Trigger di Azure Functions
Ogni funzione ha esattamente un trigger. Il trigger definisce come esattamente si avvia la funzione. Ecco i tipi più comuni che dovresti conoscere:
Binding di Azure Functions
Spesso trigger e binding vengono confusi, ma anche se sembrano simili, svolgono compiti completamente diversi. Un trigger avvia una funzione, mentre un binding collega la funzione ai dati leggendoli o inviandoli.
Input binding
Qui fornisci dati alla tua funzione senza scrivere codice d'integrazione personalizzato. Per esempio, una funzione può leggere automaticamente un record da un database semplicemente dichiarando il binding.
Output binding
Ti permette di inviare il risultato della tua funzione altrove. Ad esempio, puoi usare gli output binding per scrivere un messaggio elaborato in una coda.
Ecco un esempio per chiarire: un trigger Blob Storage avvia una funzione quando viene caricata un'immagine. Un output binding poi salva l'immagine ridimensionata in un altro contenitore di storage. I binding gestiscono le connessioni allo storage e non serve alcun codice client di storage manuale.
Come creare la tua prima Azure Function
Ecco un esempio molto semplice di funzione con trigger HTTP che restituisce un saluto. Il flusso è questo:
Ho volutamente reso l'esempio molto piccolo per mostrarti lo schema e lasciare alla tua creatività il resto.
Linguaggi supportati da Azure Functions
Azure Functions supporta molti linguaggi, tra cui:
Il supporto e i modelli di sviluppo possono variare per linguaggio e versione. Per questo, ti consiglio di controllare la documentazione di Azure aggiornata prima di iniziare un nuovo progetto, visto che questi dettagli cambiano spesso.
Opzioni di hosting per Azure Functions
Non tutte le Azure Function girano allo stesso modo. Azure offre diversi piani di hosting, ognuno con compromessi differenti. La scelta giusta dipende dal tuo caso d'uso. I principali compromessi sono:
Scaling e cold start in Azure Functions
Ci sono altri due concetti importanti quando la tua funzione gira in produzione. Sono:
Scaling automatico
Qui Azure monitora il carico sulla tua funzione e, quando la domanda aumenta, aggiunge altre istanze di calcolo, mentre quando la domanda cala le rimuove. Non devi gestirlo manualmente.
Cold start
Se una funzione non è stata eseguita di recente, potrebbe aver bisogno di un momento per avviarsi prima di poter gestire una nuova richiesta. Questo ritardo si chiama cold start. Alcuni piani di hosting riducono o evitano questo effetto mantenendo l'istanza calda, come detto.
Casi d'uso comuni per Azure Functions
Il modello event-driven si adatta a molti problemi quotidiani che potresti incontrare. In particolare:
API e webhook
Serve a gestire richieste HTTP in ingresso senza dover mantenere un web server completo attivo 24/7.
Elaborazione di file e immagini
Aiuta ad attivare una funzione ogni volta che un file arriva nello storage, per poi ridimensionarlo, convertirlo o semplicemente analizzarlo.
Job pianificati
Consente di eseguire attività di pulizia, report o promemoria a timer senza bisogno di un server dedicato sempre attivo.
Pipeline di elaborazione dati
Serve per elaborare messaggi o eventi man mano che arrivano, un passaggio alla volta.
IoT ed elaborazione di eventi
Aiuta a gestire grandi volumi di dati da sensori o dispositivi mentre vengono trasmessi.
Attività in background
Scarica il lavoro lento o occasionale, come l'invio di email, in modo che non blocchi la tua applicazione principale.
Monitoraggio e troubleshooting di Azure Functions
Una volta che una funzione è attiva, hai bisogno di visibilità su come sta andando.
Puoi, ad esempio, consultare i log che registrano cosa è successo a ogni esecuzione, molto utili per il debugging. Puoi anche controllare Application Insights negli strumenti Azure, che tiene traccia di prestazioni, richieste ed errori in un'unica posizione centrale.
Dovresti anche monitorare i fallimenti di invocazione, così sai quando e perché una funzione non è andata a buon fine. Il monitoraggio delle prestazioni ti aiuta inoltre a individuare funzioni lente prima che diventino un problema e, ovviamente, puoi configurare i tentativi automatici perché le esecuzioni fallite vengano riprovate.
Conclusione
Azure Functions ti offre un modo per eseguire codice in risposta a eventi, senza dover gestire i server sottostanti. I trigger decidono quando parte una funzione. I binding, invece, semplificano il collegamento di quella funzione ad altri servizi senza codice di integrazione aggiuntivo.
Quando passi da una semplice funzione di test a qualcosa in produzione, le scelte di hosting e scaling contano molto di più. Il piano giusto incide sui costi, ma anche su velocità e affidabilità.