Een Azure-functie uitvoeren als reactie op een rehydratatiegebeurtenis van een blob
Als u een blob wilt lezen die zich in de archieflaag bevindt, moet u de blob eerst reactiveren naar de dynamische of statische laag. Het rehydratatieproces kan enkele uren duren. In plaats van herhaaldelijk de status van de rehydratatiebewerking te peilen, kunt u Azure Event Grid configureren om een gebeurtenis te activeren wanneer de rehydratatiebewerking van de blob is voltooid en deze gebeurtenis in uw toepassing afhandelt.
Wanneer een gebeurtenis plaatsvindt, verzendt Event Grid de gebeurtenis via een eindpunt naar een gebeurtenis-handler. Een aantal Azure-services kan fungeren als gebeurtenis-handlers, waaronder Azure Functions. Een Azure-functie is een codeblok dat kan worden uitgevoerd als reactie op een gebeurtenis. Met deze procedure doorloopt u het proces voor het ontwikkelen van een Azure-functie en configureert u vervolgens Event Grid om de functie uit te voeren als reactie op een gebeurtenis die optreedt wanneer een blob wordt gerehydrateerd.
In dit artikel leest u hoe u een Azure-functie maakt en test met .NET vanuit Visual Studio. U kunt Azure Functions bouwen vanuit verschillende lokale ontwikkelomgevingen en een verscheidenheid aan verschillende programmeertalen gebruiken. Zie Ondersteunde talen in Azure Functions voor meer informatie over ondersteunde talen voor Azure Functions. Zie Code and test Azure Functions lokaal voor meer informatie over ontwikkelopties voor Azure Functions.
Zie Overzicht van rehydratatie van blobs uit de archieflaag voor meer informatie over het reactiveren van blobs uit de archieflaag.
Vereisten
In dit artikel leest u hoe u Visual Studio 2019 of hoger gebruikt om een Azure-functie te ontwikkelen met .NET. U kunt Visual Studio Community gratis installeren. Zorg ervoor dat u Visual Studio configureert voor Azure Development met .NET.
Installeer of gebruik een hulpprogramma waarmee HTTP-aanvragen kunnen worden verzonden om uw oplossing te testen, bijvoorbeeld:
- Visual Studio Code met een extensie van Visual Studio Marketplace
- PowerShell Invoke-RestMethod
- Microsoft Edge - Hulpprogramma voor netwerkconsole
- Bruno
- curl
Let op
Voor scenario's waarin u gevoelige gegevens hebt, zoals referenties, geheimen, toegangstokens, API-sleutels en andere vergelijkbare informatie, moet u een hulpprogramma gebruiken waarmee uw gegevens worden beveiligd met de benodigde beveiligingsfuncties, offline of lokaal werken, uw gegevens niet worden gesynchroniseerd met de cloud en u zich niet hoeft aan te melden bij een onlineaccount. Op deze manier vermindert u het risico dat gevoelige gegevens openbaar worden gemaakt voor het publiek.
Er is een Azure-abonnement vereist. Als u nog geen account hebt, maakt u een gratis account voordat u begint.
Een ingerichte Microsoft Entra ID-beveiligingsprincipaal waaraan de rol Inzender voor opslagblobgegevens is toegewezen, die is gericht op het opslagaccount, de bovenliggende resourcegroep of het abonnement. Zie Rollen toewijzen aan uw Microsoft Entra-gebruikersaccount.
Een Azure-functie-app maken
Een functie-app is een Azure-resource die fungeert als een container voor uw Azure Functions. U kunt een nieuwe of bestaande functie-app gebruiken om de stappen uit te voeren die in dit artikel worden beschreven.
Voer de volgende stappen uit om een nieuwe functie-app te maken in Azure Portal:
Zoek in Azure Portal naar functie-app. Selecteer het pictogram Functie-app om naar de lijst met functie-apps in uw abonnement te navigeren.
Selecteer de knop Maken om een nieuwe functie-app te maken.
Geef op het tabblad Basisinformatie een resourcegroep op en geef een unieke naam op voor de nieuwe functie-app.
Zorg ervoor dat de optie Publiceren is ingesteld op Code.
Selecteer .NET in de vervolgkeuzelijst Runtime-stack. Het veld Versie wordt automatisch ingevuld om de nieuwste versie van .NET Core te gebruiken.
Selecteer de regio voor de nieuwe functie-app.
Nadat u het tabblad Basisbeginselen hebt voltooid, gaat u naar het tabblad Hosting .
Selecteer op het tabblad Hosting het opslagaccount waarin uw Azure-functie wordt opgeslagen. U kunt een bestaand opslagaccount kiezen of een nieuw opslagaccount maken.
Zorg ervoor dat het veld Besturingssysteem is ingesteld op Windows.
Selecteer Verbruik (serverloos) in het veld Abonnementstype. Zie Het hosten van azure Functions-verbruiksabonnementen voor meer informatie over dit abonnement.
Selecteer Beoordelen en maken om de nieuwe functie-app te maken.
Een Azure-functie maken als een Event Grid-trigger
Maak vervolgens een Azure-functie die wordt uitgevoerd wanneer een blob in een bepaald opslagaccount wordt gerehydrateerd. Volg deze stappen om een Azure-functie te maken in Visual Studio met C# en .NET Core:
Start Visual Studio 2019. Meld u vervolgens aan en verbind uw app-code met Azure met behulp van DefaultAzureCredential.
Maak een nieuw Azure Functions-project. Volg de instructies die worden beschreven in Een functie-app-project maken voor meer informatie.
Selecteer in de stap Een nieuwe Azure Functions-toepassing maken de volgende waarden:
- De Azure Functions-runtime is standaard ingesteld op Azure Functions v3 (.NET Core). Microsoft raadt aan deze versie van de Azure Functions-runtime te gebruiken.
- Selecteer Event Grid-trigger in de lijst met mogelijke triggers. Zie Een functie gebruiken als gebeurtenis-handler voor Event Grid-gebeurtenissen voor meer informatie over waarom een Event Grid-trigger het aanbevolen type trigger is voor het afhandelen van een Blob Storage-gebeurtenis met een Azure-functie.
- De instelling Opslagaccount geeft aan waar uw Azure-functie wordt opgeslagen. U kunt een bestaand opslagaccount selecteren of een nieuwe maken.
Selecteer Maken om het nieuwe project te maken in Visual Studio.
Wijzig vervolgens de naam van de klasse en De Azure-functie, zoals beschreven in Naam van de functie wijzigen. Kies een naam die geschikt is voor uw scenario.
Selecteer in Visual Studio Tools | NuGet Pakketbeheer | Pakketbeheer Console en installeer vervolgens de volgende pakketten vanuit de console:
Install-Package Azure.Storage.Blobs Install-Package Microsoft.ApplicationInsights.WorkerService Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
Plak in het klassebestand voor uw Azure-functie het volgende met behulp van instructies:
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;
Zoek de methode Uitvoeren in het klassebestand. Dit is de methode die wordt uitgevoerd wanneer een gebeurtenis plaatsvindt. Plak de volgende code in de hoofdtekst van de methode Uitvoeren . Vergeet niet om de waarden van de tijdelijke aanduidingen tussen de punthaken te vervangen door uw eigen waarden:
// 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; } }
Zie Azure Blob Storage als Event Grid-bron voor meer informatie over de informatie die wordt opgenomen wanneer een Blob Storage-gebeurtenis wordt gepubliceerd naar een gebeurtenis-handler.
De Azure-functie lokaal uitvoeren in het foutopsporingsprogramma
Als u uw Azure Function-code lokaal wilt testen, moet u handmatig een HTTP-aanvraag verzenden waarmee de gebeurtenis wordt geactiveerd. U kunt de aanvraag posten met behulp van een hulpprogramma, zoals hulpprogramma's die worden beschreven in de sectie Vereisten van dit artikel.
Bovenaan het klassebestand voor uw Azure-functie bevindt zich een URL-eindpunt dat u kunt gebruiken voor het testen in de lokale omgeving. Als u de aanvraag met deze URL plaatst, wordt de gebeurtenis geactiveerd in de lokale omgeving, zodat u fouten in uw code kunt opsporen. De URL heeft de volgende indeling:
http://localhost:7071/runtime/webhooks/EventGrid?functionName={functionname}
De aanvraag die u naar dit eindpunt verzendt, is een gesimuleerde aanvraag. Er worden geen gegevens verzonden of ontvangen van uw Azure Storage-account.
Verzend een aanvraag naar dit eindpunt met behulp van uw HTTP-aanvraagprogramma en de bijbehorende instructies. Zorg ervoor dat u de {functionname}
tijdelijke aanduiding vervangt door de naam van uw functie (bijvoorbeeld Get http://localhost:7071/runtime/webhooks/EventGrid?functionName=BlobRehydrateEventHandler
).
- Plaats in Visual Studio alle gewenste onderbrekingspunten in uw code en druk op F5 om het foutopsporingsprogramma uit te voeren.
- Verzend de aanvraag in het HTTP-aanvraagprogramma naar het eindpunt.
Wanneer u de aanvraag verzendt, roept Event Grid uw Azure-functie aan en kunt u er normaal fouten in opsporen. Zie de aanvraag handmatig posten in de Documentatie van Azure Functions voor meer informatie en voorbeelden.
De aanvraag die de gebeurtenis activeert, wordt gesimuleerd, maar de Azure-functie die wordt uitgevoerd wanneer de gebeurtenis wordt geactiveerd, schrijft logboekgegevens naar een nieuwe blob in uw opslagaccount. U kunt de inhoud van de blob controleren en de laatste wijzigingstijd bekijken in Azure Portal, zoals wordt weergegeven in de volgende afbeelding:
De Azure Function publiceren
Nadat u uw Azure-functie lokaal hebt getest, is de volgende stap het publiceren van de Azure-functie naar de Azure Function-app die u eerder hebt gemaakt. De functie moet worden gepubliceerd, zodat u Event Grid kunt configureren om gebeurtenissen te verzenden die plaatsvinden in het opslagaccount naar het functie-eindpunt.
Volg deze stappen om de functie te publiceren:
Selecteer en houd uw Azure Functions-project in Solution Explorer ingedrukt (of klik erop met de rechtermuisknop) en kies Publiceren.
Selecteer Azure in het venster Publiceren als doel en kies vervolgens Volgende.
Selecteer de Azure-functie-app (Windows) als het specifieke doel en kies vervolgens Volgende.
Selecteer uw abonnement op het tabblad Functions-exemplaar in de vervolgkeuzelijst en zoek vervolgens uw Azure Function-app in de lijst met beschikbare functie-apps.
Zorg ervoor dat het selectievakje Uitvoeren vanuit pakketbestand is ingeschakeld.
Selecteer Voltooien om de functie voor te bereiden.
Controleer op de pagina Publiceren of de configuratie juist is. Als u een waarschuwing ziet dat de serviceafhankelijkheid van Application Insights niet is geconfigureerd, kunt u deze configureren vanaf deze pagina.
Selecteer de knop Publiceren om de Azure-functie te publiceren naar de Azure Function-app die u eerder hebt gemaakt.
Wanneer u wijzigingen aanbrengt in de code in uw Azure-functie, moet u de bijgewerkte functie publiceren naar Azure.
Abonneren op blobrehydratatiegebeurtenissen vanuit een opslagaccount
U hebt nu een functie-app die een Azure-functie bevat die kan worden uitgevoerd als reactie op een gebeurtenis. De volgende stap bestaat uit het maken van een gebeurtenisabonnement op basis van uw opslagaccount. Het gebeurtenisabonnement configureert het opslagaccount om een gebeurtenis via Event Grid te publiceren als reactie op een bewerking op een blob in uw opslagaccount. Event Grid verzendt de gebeurtenis vervolgens naar het eindpunt van de gebeurtenis-handler dat u hebt opgegeven. In dit geval is de gebeurtenis-handler de Azure-functie die u in de vorige sectie hebt gemaakt.
Wanneer u het gebeurtenisabonnement maakt, kunt u filteren welke gebeurtenissen naar de gebeurtenis-handler worden verzonden. De gebeurtenissen die moeten worden vastgelegd bij het reactiveren van een blob uit de archieflaag zijn Microsoft.Storage.BlobTierChanged, die overeenkomt met een bewerking bloblaag instellen en gebeurtenissen van Microsoft.Storage.BlobCreated , die overeenkomen met een kopieer-blobbewerking . Afhankelijk van uw scenario wilt u mogelijk slechts één van deze gebeurtenissen verwerken.
Voer de volgende stappen uit om het gebeurtenisabonnement te maken:
Navigeer in Azure Portal naar het opslagaccount dat blobs bevat om te reactiveren vanuit de archieflaag.
Selecteer de instelling Gebeurtenissen in het linkernavigatiedeelvenster.
Selecteer meer opties op de pagina Gebeurtenissen.
Selecteer Gebeurtenisabonnement maken.
Geef op de pagina Gebeurtenisabonnement maken in de sectie Details van gebeurtenisabonnement een naam op voor het gebeurtenisabonnement.
Geef in de sectie Onderwerpdetails een naam op voor het systeemonderwerp. Het systeemonderwerp vertegenwoordigt een of meer gebeurtenissen die zijn gepubliceerd door Azure Storage. Zie Systeemonderwerpen in Azure Event Grid voor meer informatie over systeemonderwerpen.
Selecteer in de sectie Gebeurtenistypen de gebeurtenissen Blob Gemaakt en Blob Tier Gewijzigd . Afhankelijk van hoe u ervoor kiest om een blob uit de archieflaag te reactiveren, wordt een van deze twee gebeurtenissen geactiveerd.
Selecteer Azure Function in de vervolgkeuzelijst in de sectie Eindpuntdetails.
Kies Selecteer een eindpunt om de functie op te geven die u in de vorige sectie hebt gemaakt. Kies in het dialoogvenster Azure-functie selecteren het abonnement, de resourcegroep en de functie-app voor uw Azure-functie. Selecteer ten slotte de functienaam in de vervolgkeuzelijst en kies Selectie bevestigen.
Selecteer de knop Maken om het gebeurtenisabonnement te maken en begin met het verzenden van gebeurtenissen naar de Azure Function-gebeurtenis-handler.
Zie Azure Event Grid-concepten voor meer informatie over gebeurtenisabonnementen.
De Gebeurtenis-handler van Azure Function testen
Als u de Azure-functie wilt testen, kunt u een gebeurtenis activeren in het opslagaccount dat het gebeurtenisabonnement bevat. Het gebeurtenisabonnement dat u eerder hebt gemaakt, filtert op twee gebeurtenissen, Microsoft.Storage.BlobCreated en Microsoft.Storage.BlobTierChanged. Wanneer een van deze gebeurtenissen wordt geactiveerd, wordt uw Azure-functie geactiveerd.
De Azure-functie die in dit artikel wordt weergegeven, schrijft in twee scenario's naar een logboekblob:
- Wanneer de gebeurtenis Microsoft.Storage.BlobCreated is en de API-bewerking Blob kopiëren is.
- Wanneer de gebeurtenis Microsoft.Storage.BlobTierChanged is en de API-bewerking Blob-laag instellen.
Zie een van de volgende twee procedures voor meer informatie over het testen van de functie door een blob te reactiveren:
Nadat de rehydratatie is voltooid, wordt de logboek-blob geschreven naar dezelfde container als de blob die u hebt gerehydrateerd. Nadat u bijvoorbeeld een blob hebt gerehydrateerd met een kopieerbewerking, kunt u in Azure Portal zien dat de oorspronkelijke bron-blob in de archieflaag blijft staan, wordt de volledig gerehydrateerde doel-blob weergegeven in de doel onlinelaag en wordt de logboek-blob die door de Azure-functie is gemaakt, ook weergegeven in de lijst.
Houd er rekening mee dat het reactiveren van een blob tot 15 uur kan duren, afhankelijk van de instelling voor rehydratatieprioriteit. Als u de rehydratatieprioriteit instelt op Hoog, kan rehydratatie binnen één uur worden voltooid voor blobs die kleiner zijn dan 10 GB. Bij rehydratatie met hoge prioriteit worden echter hogere kosten in rekening gebracht. Zie Overzicht van rehydratatie van blobs vanuit de archieflaag voor meer informatie.
Tip
Hoewel het doel van deze procedure is om deze gebeurtenissen te verwerken in de context van rehydratatie van blobs, kan het voor testdoeleinden ook handig zijn om deze gebeurtenissen te observeren als reactie op het uploaden van een blob of het wijzigen van de laag van een online-blob (d.w.z. van dynamisch naar statisch), omdat de gebeurtenis onmiddellijk wordt geactiveerd.
Zie Gebeurtenissen filteren voor Azure Event Grid voor meer informatie over het filteren van gebeurtenissen in Event Grid.