Eseguire una funzione di Azure in risposta a un evento di riattivazione di un BLOB
Per leggere un BLOB incluso nel livello archivio, prima è necessario riattivare il BLOB nel livello di accesso frequente o sporadico. Il completamento del processo di riattivazione può richiedere diverse ore. Invece di eseguire ripetutamente il polling dello stato dell'operazione di riattivazione, è possibile configurare Griglia di eventi di Azure per generare un evento al termine dell'operazione di riattivazione BLOB e gestire questo evento nell'applicazione.
Quando si verifica un evento, Griglia di eventi invia l'evento a un gestore dell'evento tramite un endpoint. Diversi servizi di Azure possono fungere da gestori dell'evento, tra cui Funzioni di Azure. Una funzione di Azure è un blocco di codice che può essere eseguito in risposta a un evento. Questa procedura illustra il processo di sviluppo di una funzione di Azure e quindi la configurazione di Griglia di eventi per eseguire la funzione in risposta a un evento che si verifica quando un BLOB viene riattivato.
Questo articolo illustra come creare e testare una funzione di Azure con .NET da Visual Studio. È possibile creare Funzioni di Azure da un'ampia gamma di ambienti di sviluppo locali e usare un'ampia gamma di linguaggi di programmazione diversi. Per altre informazioni sui linguaggi supportati per le Funzioni di Azure, vedere Linguaggi supportati in Funzioni di Azure. Per altre informazioni sulle opzioni di sviluppo per Funzioni di Azure, vedere Scrivere codice ed effettuare test di Funzioni di Azure in locale.
Per altre informazioni sulla riattivazione dei BLOB dal livello archivio, vedere Panoramica della riattivazione dei BLOB dal livello archivio.
Prerequisiti
Questo articolo illustra come usare Visual Studio 2019 o versione successiva per sviluppare una funzione di Azure con .NET. È possibile installare gratuitamente Visual Studio Community. Assicurarsi di configurare Visual Studio per lo sviluppo di Azure con .NET.
Installare o usare uno strumento che può inviare richieste HTTP per testare la soluzione, ad esempio:
- Visual Studio Code con un'estensione da Visual Studio Marketplace
- PowerShell Invoke-RestMethod
- Microsoft Edge - Strumento console di rete
- Bruno
- curl
Attenzione
Per gli scenari in cui sono presenti dati sensibili, ad esempio credenziali, segreti, token di accesso, chiavi API e altre informazioni simili, assicurarsi di usare uno strumento che protegge i dati con le funzionalità di sicurezza necessarie, funziona offline o in locale, non sincronizza i dati nel cloud e non richiede l'accesso a un account online. In questo modo si riduce il rischio di esporre i dati sensibili al pubblico.
È necessaria una sottoscrizione di Azure. Se non si ha già un account, crearne uno gratuito prima di iniziare.
Entità di sicurezza microsoft Entra ID di cui è stato effettuato il provisioning a cui è stato assegnato il ruolo Collaboratore ai dati del BLOB di archiviazione, con ambito l'account di archiviazione, il gruppo di risorse padre o la sottoscrizione. Vedere Assegnare ruoli all'account utente di Microsoft Entra.
Creare un'app per le funzioni di Azure
Un'app per le funzioni è una risorsa di Azure che funge da contenitore per le Funzioni di Azure. È possibile usare un'app per le funzioni nuova o esistente per completare i passaggi descritti in questo articolo.
Per creare una nuova app per le funzioni nel portale di Azure, attenersi a questa procedura:
Nel portale di Azure, cercare App per le funzioni. Selezionare l'icona App per le funzioni per passare all'elenco delle app per le funzioni nella sottoscrizione.
Selezionare il pulsante Crea per creare una nuova app per le funzioni.
Nella scheda Informazioni di base specificare un gruppo di risorse e specificare un nome univoco per la nuova app per le funzioni.
Assicurarsi che l'opzione Pubblica sia impostata su Codice.
Nell'elenco a discesa Stack di runtime selezionare .NET. Il campo Versione viene popolato automaticamente per usare la versione più recente di .NET Core.
Selezionare l'area per la nuova app per le funzioni.
Dopo aver completato la scheda Informazioni di base, passare alla scheda Hosting.
Nella scheda Hosting selezionare l'account di archiviazione in cui verrà archiviata la funzione di Azure. È possibile usare un account di archiviazione esistente o crearne uno nuovo.
Assicurarsi che il campo Sistema operativo sia impostato su Windows.
Nel campo Tipo di piano selezionare Consumo (serverless). Per altre informazioni su questo piano, vedere Hosting del piano a consumo di Funzioni di Azure.
Selezionare Rivedi e crea per creare la nuova app per le funzioni.
Per altre informazioni sulla configurazione dell'app per le funzioni, vedere Gestire l'app per le funzioni nella documentazione di Funzioni di Azure.
Creare una funzione di Azure come trigger di Griglia di eventi
Creare quindi una funzione di Azure che verrà eseguita quando un BLOB viene riattivato in un account di archiviazione specifico. Seguire questa procedura per creare una funzione di Azure in Visual Studio con C# e .NET Core:
Avviare Visual Studio 2019. Accedere e connettere quindi il codice dell'app ad Azure usando DefaultAzureCredential.
Creare un nuovo progetto Funzioni di Azure. Per informazioni dettagliate, seguire le istruzioni descritte in Creare un progetto di app per le funzioni.
Nel passaggio Crea una nuova applicazione Funzioni di Azure selezionare i valori seguenti:
- Per impostazione predefinita, il runtime di Funzioni di Azure è impostato su Funzioni di Azure v3 (.NET Core). Microsoft consiglia di usare questa versione del runtime di Funzioni di Azure.
- Nell'elenco dei possibili trigger selezionare Trigger Griglia di eventi. Per altre informazioni sul motivo per cui un trigger di Griglia di eventi è il tipo di trigger consigliato per la gestione di un evento di archiviazione BLOB con una funzione di Azure, vedere Usare una funzione come un gestore dell'evento per gli eventi di Griglia di eventi.
- L'impostazione Account di archiviazione indica dove verrà archiviata la funzione di Azure. È possibile selezionare un account di archiviazione esistente o crearne uno nuovo.
Selezionare Crea per creare il nuovo progetto in Visual Studio.
Rinominare quindi la classe e la funzione di Azure, come descritto in Rinominare la funzione. Scegliere un nome appropriato per lo scenario.
In Visual Studio selezionare Strumenti | Gestione pacchetti NuGet | Console gestione pacchetti e quindi installare i pacchetti seguenti dalla console:
Install-Package Azure.Storage.Blobs Install-Package Microsoft.ApplicationInsights.WorkerService Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
Nel file di classe per la funzione di Azure incollare le seguenti istruzioni di utilizzo:
using System; using System.IO; using System.Text; using Microsoft.Azure.WebJobs; using Microsoft.Azure.EventGrid.Models; using Microsoft.Azure.WebJobs.Extensions.EventGrid; using Microsoft.Extensions.Logging; using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models;
Individuare il metodo Esegui nel file di classe. Questo è il metodo che viene eseguito quando si verifica un evento. Incollare il codice seguente nel corpo del metodo Esegui. È necessario ricordare di sostituire i valori segnaposto tra parentesi uncinate con i valori personalizzati:
// When either Microsoft.Storage.BlobCreated or Microsoft.Storage.BlobTierChanged // event occurs, write the event details to a log blob in the same container // as the event subject (the blob for which the event occurred). // Create a unique name for the log blob. string logBlobName = string.Format("function-log-{0}.txt", DateTime.UtcNow.Ticks); // Get data from the event. dynamic data = eventGridEvent.Data; string eventBlobUrl = Convert.ToString(data.url); string eventApi = Convert.ToString(data.api); // Build string containing log information. StringBuilder eventInfo = new StringBuilder(); eventInfo.AppendLine(string.Format("{0} operation occurred.", eventApi)); eventInfo.AppendLine(string.Format("Blob URL: {0}", eventBlobUrl)); eventInfo.AppendLine($@"Additional event details: Id=[{eventGridEvent.Id}] EventType=[{eventGridEvent.EventType}] EventTime=[{eventGridEvent.EventTime}] Subject=[{eventGridEvent.Subject}] Topic=[{eventGridEvent.Topic}]"); // If event was BlobCreated and API call was CopyBlob, respond to the event. bool copyBlobEventOccurred = (eventGridEvent.EventType == "Microsoft.Storage.BlobCreated") && (eventApi == "CopyBlob"); // If event was BlobTierChanged and API call was SetBlobTier, respond to the event. bool setTierEventOccurred = (eventGridEvent.EventType == "Microsoft.Storage.BlobTierChanged") && (eventApi == "SetBlobTier"); // If one of these two events occurred, write event info to a log blob. if (copyBlobEventOccurred | setTierEventOccurred) { // Create log blob in same account and container. BlobUriBuilder logBlobUriBuilder = new BlobUriBuilder(new Uri(eventBlobUrl)) { BlobName = logBlobName }; TokenCredential credential = new DefaultAzureCredential(); string blobUri = "https://" + accountName + ".blob.core.windows.net/" + logBlobUriBuilder.BlobContainerName + "/" + logBlobName; BlobClient logBlobClient = new BlobClient(new Uri(blobUri), credential); byte[] byteArray = Encoding.ASCII.GetBytes(eventInfo.ToString()); try { // Write the log info to the blob. // Overwrite if the blob already exists. using (MemoryStream memoryStream = new MemoryStream(byteArray)) { BlobContentInfo blobContentInfo = logBlobClient.Upload(memoryStream, overwrite: true); } } catch (RequestFailedException e) { Console.WriteLine(e.Message); throw; } }
Per altre informazioni sullo sviluppo di Funzioni di Azure, vedere Materiale sussidiario per lo sviluppo di Funzioni di Azure.
Per altre informazioni sulle informazioni incluse quando un evento di archiviazione BLOB viene pubblicato in un gestore dell'evento, vedere Archiviazione BLOB di Azure come origine di Griglia di eventi.
Eseguire la funzione di Azure in locale nel debugger
Per testare il codice della funzione di Azure in locale, è necessario inviare manualmente una richiesta HTTP che attiva l'evento. È possibile pubblicare la richiesta usando uno strumento come quelli descritti nella sezione dei prerequisiti di questo articolo.
Nella parte superiore del file di classe per la funzione di Azure è presente un endpoint URL utilizzabile per il test nell'ambiente locale. La registrazione della richiesta con questo URL attiva l'evento nell'ambiente locale in modo da poter eseguire il debug del codice. L'URL è nel formato seguente:
http://localhost:7071/runtime/webhooks/EventGrid?functionName={functionname}
La richiesta inviata a questo endpoint è una richiesta simulata. Non invia o riceve dati dall'account di archiviazione di Azure.
Inviare una richiesta a questo endpoint usando lo strumento di richiesta HTTP e le relative istruzioni. Assicurarsi di sostituire il {functionname}
segnaposto con il nome della funzione , ad esempio Get http://localhost:7071/runtime/webhooks/EventGrid?functionName=BlobRehydrateEventHandler
.
- In Visual Studio posizionare i punti di interruzione desiderati nel codice e premere F5 per eseguire il debugger.
- Nello strumento di richiesta HTTP inviare la richiesta all'endpoint.
Quando si invia la richiesta, la Griglia di eventi chiama la funzione di Azure ed è possibile eseguirne il debug normalmente. Per altre informazioni ed esempi, vedere Pubblicare manualmente la richiesta nella documentazione di Funzioni di Azure.
La richiesta che attiva l'evento viene simulata, ma la funzione di Azure che viene eseguita quando l'evento genera scrive informazioni di log in un nuovo BLOB nell'account di archiviazione. È possibile verificare il contenuto del BLOB e visualizzarne l'ora dell'ultima modifica nel portale di Azure, come illustrato nell'immagine seguente:
Pubblicare la funzione di Azure
Dopo aver testato la funzione di Azure in locale, il passaggio successivo consiste nel pubblicare la funzione di Azure nell'app per le funzioni di Azure creata in precedenza. La funzione deve essere pubblicata in modo da poter configurare Griglia di eventi per inviare eventi che si verificano dall'account di archiviazione all'endpoint della funzione.
Per pubblicare la funzione, seguire questa procedura:
In Esplora soluzioni selezionare e tenere premuto (o fare clic con il pulsante destro del mouse) sul progetto di Funzioni di Azure e scegliere Pubblica.
Nella finestra Pubblica selezionare Azure come destinazione e quindi scegliere Avanti.
Selezionare App per le funzioni di Azure (Windows) come destinazione specifica, quindi scegliere Avanti.
Nella scheda Istanza di Funzioni selezionare la sottoscrizione dal menu a discesa, quindi individuare l'app per le funzioni di Azure nell'elenco delle app per le funzioni disponibili.
Assicurarsi che la casella di controllo Esegui dal file del pacchetto sia selezionata.
Selezionare Fine per preparare la pubblicazione della funzione.
Nella pagina Pubblica verificare che la configurazione sia corretta. Se viene visualizzato un avviso che indica che la dipendenza del servizio in Application Insights non è configurata, è possibile configurarla da questa pagina.
Selezionare il pulsante Pubblica per iniziare a pubblicare la funzione di Azure nell'app per le funzioni di Azure creata in precedenza.
Ogni volta che si apportano modifiche al codice nella funzione di Azure, è necessario pubblicare la funzione aggiornata in Azure.
Sottoscrivere eventi di riattivazione BLOB da un account di archiviazione
Ora è disponibile un'app per le funzioni che contiene una funzione di Azure che può essere eseguita in risposta a un evento. Il passaggio successivo consiste nel creare una sottoscrizione di eventi dall'account di archiviazione. La sottoscrizione di eventi configura l'account di archiviazione per pubblicare un evento tramite Griglia di eventi in risposta a un'operazione su un BLOB nell'account di archiviazione. Griglia di eventi invia quindi l'evento all'endpoint del gestore dell'evento specificato. In questo caso il gestore dell'evento è la funzione di Azure creata nella sezione precedente.
Quando si crea la sottoscrizione di eventi, è possibile filtrare gli eventi inviati al gestore dell'evento. Gli eventi da acquisire durante la riattivazione di un BLOB dal livello archivio sono Microsoft.Storage.BlobTierChanged, corrispondenti a un'operazioneImposta livello BLOB e agli eventi Microsoft.Storage.BlobCreated, corrispondenti a un'operazioneCopia BLOB. A seconda dello scenario, è possibile gestire solo uno di questi eventi.
Per creare la sottoscrizione di eventi, seguire questa procedura:
Nel portale di Azure passare all'account di archiviazione che contiene BLOB da riattivare dal livello archivio.
Selezionare l'impostazione Eventi nel pannello di navigazione a sinistra.
Nella pagina Eventi selezionare Altre opzioni.
Selezionare Crea sottoscrizione di eventi.
Nella pagina Crea sottoscrizione di eventi nella sezione Dettagli sottoscrizione eventi specificare un nome per la sottoscrizione di eventi.
Nella sezione Dettagli argomento specificare un nome per l'argomento di sistema. L'argomento di sistema rappresenta uno o più eventi pubblicati da Archiviazione di Azure. Per altre informazioni sugli argomenti di sistema, vedere Argomenti di sistema in Griglia di eventi di Azure.
Nella sezione Tipi di evento selezionare gli eventiBlob Created e Blob Tier Changed. A seconda di come si sceglie di riattivare un BLOB dal livello archivio, verrà generato uno di questi due eventi.
Nella sezione Dettagli endpoint selezionare Funzione di Azure dal menu a discesa.
Scegliere Selezionare un endpoint per specificare la funzione creata nella sezione precedente. Nella finestra di dialogo Seleziona funzione di Azure scegliere la sottoscrizione, il gruppo di risorse e l'app per le funzioni per la propria Funzione di Azure. Infine selezionare il nome della funzione nell'elenco a discesa e scegliere Conferma selezione.
Selezionare il pulsante Crea per creare la sottoscrizione di eventi e iniziare a inviare eventi al gestore dell'evento della Funzione di Azure.
Per altre informazioni sulle sottoscrizioni di eventi, vedere Concetti di Griglia di eventi di Azure.
Testare il gestore dell'evento della Funzione di Azure
Per testare la Funzione di Azure è possibile attivare un evento nell'account di archiviazione che contiene la sottoscrizione di eventi. La sottoscrizione di eventi creata in precedenza filtra due eventi, Microsoft.Storage.BlobCreated e Microsoft.Storage.BlobTierChanged. Quando viene generato uno di questi eventi, verrà attivata la funzione di Azure.
La funzione di Azure illustrata in questo articolo scrive in un BLOB di log in due scenari:
- Quando l'evento è Microsoft.Storage.BlobCreated e l'operazione API è Copia BLOB.
- Quando l'evento è Microsoft.Storage.BlobTierChanged e l'operazione API è Imposta livello BLOB.
Per informazioni su come testare la funzione riattivando un BLOB, vedere una delle due procedure seguenti:
- Riattivazione di un BLOB con un'operazione di copia
- Riattivazione di un BLOB mediante modifica del relativo livello
Al termine della riattivazione, il BLOB di log viene scritto nello stesso contenitore del BLOB riattivato. Ad esempio, dopo aver riattivato un BLOB con un'operazione di copia, è possibile vedere nel portale di Azure che il BLOB di origine originale rimane nel livello archivio, il BLOB di destinazione interamente riattivato viene visualizzato nel livello online di destinazione e anche il BLOB di log creato dalla funzione di Azure viene visualizzato nell'elenco.
Tenere presente che la riattivazione di un BLOB può richiedere fino a 15 ore, a seconda dell'impostazione della priorità di riattivazione. Se si imposta la priorità di riattivazione su Alta, la riattivazione può essere completata in meno di un'ora per i BLOB con dimensioni inferiori a 10 GB. Tuttavia, una riattivazione ad alta priorità comporta un costo maggiore. Per altre informazioni, vedere Panoramica di riattivazione di un BLOB dal livello archivio.
Suggerimento
Anche se l'obiettivo di questa procedura consiste nel gestire questi eventi nel contesto della riattivazione BLOB, a scopo di test può anche essere utile osservare questi eventi in risposta al caricamento di un BLOB o alla modifica del livello di un BLOB online (ad esempio dal livello di accesso frequente al livello di accesso sporadico), perché l'evento viene generato immediatamente.
Per altre informazioni su come filtrare gli eventi in Griglia di eventi, vedere Come filtrare gli eventi per Griglia di eventi di Azure.