Delen via


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.

Als u lokaal fouten wilt opsporen in de Azure-functie, moet u een hulpprogramma gebruiken dat een HTTP-aanvraag kan verzenden, zoals Postman.

Er is een Azure-abonnement vereist. Als u nog geen account hebt, maakt u een gratis account voordat u begint.

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:

  1. Zoek in Azure Portal naar functie-app. Selecteer het pictogram Functie-app om naar de lijst met functie-apps in uw abonnement te navigeren.

  2. Selecteer de knop Maken om een nieuwe functie-app te maken.

  3. Geef op het tabblad Basisinformatie een resourcegroep op en geef een unieke naam op voor de nieuwe functie-app.

  4. Zorg ervoor dat de optie Publiceren is ingesteld op Code.

  5. Selecteer .NET in de vervolgkeuzelijst Runtime-stack. Het veld Versie wordt automatisch ingevuld om de nieuwste versie van .NET Core te gebruiken.

  6. Selecteer de regio voor de nieuwe functie-app.

    Screenshot showing how to create a new function app in Azure - Basics tab

  7. Nadat u het tabblad Basisbeginselen hebt voltooid, gaat u naar het tabblad Hosting .

  8. Selecteer op het tabblad Hosting het opslagaccount waarin uw Azure-functie wordt opgeslagen. U kunt een bestaand opslagaccount kiezen of een nieuw opslagaccount maken.

  9. Zorg ervoor dat het veld Besturingssysteem is ingesteld op Windows.

  10. Selecteer Verbruik (serverloos) in het veld Abonnementstype. Zie Het hosten van azure Functions-verbruiksabonnementen voor meer informatie over dit abonnement.

    Screenshot showing how to create a new function app in Azure - Hosting tab

  11. Selecteer Beoordelen en maken om de nieuwe functie-app te maken.

Zie Uw functie-app beheren in de Documentatie van Azure Functions voor meer informatie over het configureren van uw functie-app .

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:

  1. Start Visual Studio 2019 en maak een nieuw Azure Functions-project. Volg de instructies die worden beschreven in Een functie-app-project maken voor meer informatie.

  2. Selecteer in de stap Een nieuwe Azure Functions-toepassing maken de volgende waarden:

  3. Selecteer Maken om het nieuwe project te maken in Visual Studio.

  4. 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.

  5. 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
    
  6. 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;
    
  7. 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);
    
    // Populate connection string with your Shared Key credentials.
    const string ConnectionString = "DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net";
    
    // 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
        };
    
        BlobClient logBlobClient = new BlobClient(ConnectionString,
                                                  logBlobUriBuilder.BlobContainerName,
                                                  logBlobName);
    
        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 Richtlijnen voor het ontwikkelen van Azure Functions voor meer informatie over het ontwikkelen van Azure Functions.

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 Postman.

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.

Volg deze stappen om een aanvraag naar dit eindpunt te maken en te verzenden. In dit voorbeeld ziet u hoe u de aanvraag verzendt met Postman.

  1. Maak in Postman een nieuwe aanvraag.

  2. Plak de BOVENSTAANDe URL in het veld voor de aanvraag-URL, waarbij u de naam van uw functie vervangt door {functionname} de accolades te verwijderen. Zorg ervoor dat het aanvraagwoord is ingesteld op GET.

    Screenshot showing how to specify local URL for event trigger in Postman

  3. Voeg de header Content-Type toe en stel deze in op application/json.

  4. Voeg de header aeg-event-type toe en stel deze in op Notification.

    Screenshot showing header configuration for local request to trigger event

  5. Geef in Postman de aanvraagbody op, waarbij het type hoofdtekst is ingesteld op JSON en de indeling op onbewerkt. In het volgende voorbeeld wordt een Copy Blob-aanvraag gesimuleerd. Vervang tijdelijke aanduidingen tussen punthaken door uw eigen waarden. Houd er rekening mee dat het niet nodig is om datum-/tijd- of id-waarden te wijzigen, omdat dit een gesimuleerde aanvraag is:

    [{
      "topic": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
      "subject": "/blobServices/default/containers/<container-name>/blobs/<blob-name>",
      "eventType": "Microsoft.Storage.BlobCreated",
      "id": "2bfb587b-501e-0094-2746-8b2884065d32",
      "data": {
        "api": "CopyBlob",
        "clientRequestId": "3d4dedc7-6c27-4816-9405-fdbfa806b00c",
        "requestId": "2bfb587b-501e-0094-2746-8b2884000000",
        "eTag": "0x8D9595DCA505BDF",
        "contentType": "text/plain",
        "contentLength": 48,
        "blobType": "BlockBlob",
        "url": "https://<storage-account>.blob.core.windows.net/<container-name>/<blob-name>",
        "sequencer": "0000000000000000000000000000201B00000000004092a5",
        "storageDiagnostics": {
          "batchId": "8a92736a-6006-0026-0046-8bd7f5000000"
        }
      },
      "dataVersion": "",
      "metadataVersion": "1",
      "eventTime": "2021-08-07T04:42:41.0730463Z"
    }]
    
  6. Plaats in Visual Studio alle gewenste onderbrekingspunten in uw code en druk op F5 om het foutopsporingsprogramma uit te voeren.

  7. Selecteer in Postman de knop Verzenden om de aanvraag naar het eindpunt te verzenden.

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:

Screenshot showing the contents of the log blob in the Azure portal

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:

  1. Selecteer en houd uw Azure Functions-project in Solution Explorer ingedrukt (of klik erop met de rechtermuisknop) en kies Publiceren.

  2. Selecteer Azure in het venster Publiceren als doel en kies vervolgens Volgende.

  3. Selecteer de Azure-functie-app (Windows) als het specifieke doel en kies vervolgens Volgende.

  4. 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.

  5. Zorg ervoor dat het selectievakje Uitvoeren vanuit pakketbestand is ingeschakeld.

  6. Selecteer Voltooien om de functie voor te bereiden.

  7. 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.

  8. Selecteer de knop Publiceren om de Azure-functie te publiceren naar de Azure Function-app die u eerder hebt gemaakt.

    Screenshot showing page to publish Azure Function from Visual Studio

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:

  1. Navigeer in Azure Portal naar het opslagaccount dat blobs bevat om te reactiveren vanuit de archieflaag.

  2. Selecteer de instelling Gebeurtenissen in het linkernavigatiedeelvenster.

  3. Selecteer meer opties op de pagina Gebeurtenissen.

  4. Selecteer Gebeurtenisabonnement maken.

  5. Geef op de pagina Gebeurtenisabonnement maken in de sectie Details van gebeurtenisabonnement een naam op voor het gebeurtenisabonnement.

  6. 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.

  7. 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.

    Screenshot showing how to select event types for blob rehydration events in the Azure portal

  8. Selecteer Azure Function in de vervolgkeuzelijst in de sectie Eindpuntdetails.

  9. 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.

    Screenshot showing how to select an Azure Function as the endpoint for an Event Grid subscription

  10. 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.

Screenshot showing the original blob in the archive tier, the rehydrated blob in the hot tier, and the log blob written by the event handler.

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.

Fooi

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.

Zie ook