Sdílet prostřednictvím


Spuštění funkce Azure Functions v reakci na událost dosazování objektů blob

Pokud chcete přečíst objekt blob, který je v archivní úrovni, musíte objekt blob nejprve dosadit na horkou nebo studenou úroveň. Dokončení procesu dosazování může trvat několik hodin. Místo opakovaného dotazování na stav operace dosazování můžete službu Azure Event Grid nakonfigurovat tak, aby aktivovalo událost při dokončení operace dosazování objektů blob a zpracování této události ve vaší aplikaci.

Když dojde k události, Event Grid událost odešle obslužné rutině události prostřednictvím koncového bodu. Řada služeb Azure může sloužit jako obslužné rutiny událostí, včetně Azure Functions. Funkce Azure je blok kódu, který se může spustit v reakci na událost. Tento postup vás provede procesem vývoje funkce Azure Functions a následnou konfigurací event Gridu tak, aby funkci spustila v reakci na událost, ke které dochází při rehydraci objektu blob.

V tomto článku se dozvíte, jak vytvořit a otestovat funkci Azure Functions pomocí .NET ze sady Visual Studio. Azure Functions můžete vytvářet z různých místních vývojových prostředí a používat různé programovací jazyky. Další informace o podporovaných jazycích pro Azure Functions najdete v tématu Podporované jazyky ve službě Azure Functions. Další informace o možnostech vývoje pro Azure Functions najdete v tématu Kód a místní testování azure Functions.

Další informace o dosazování objektů blob z archivní úrovně najdete v tématu Přehled dosazování objektů blob z archivní úrovně.

Předpoklady

V tomto článku se dozvíte, jak pomocí sady Visual Studio 2019 nebo novější vyvíjet funkci Azure s .NET. Visual Studio Community si můžete zdarma nainstalovat. Ujistěte se, že jste pomocí .NET nakonfigurovali Visual Studio pro vývoj pro Azure.

K místnímu ladění funkce Azure Functions budete muset použít nástroj, který může odeslat požadavek HTTP, například Postman.

Vyžaduje se předplatné Azure. Pokud ještě účet nemáte, vytvořte si ho ještě před tím, než začnete.

Vytvoření aplikace Azure Function App

Aplikace funkcí je prostředek Azure, který slouží jako kontejner pro službu Azure Functions. K dokončení kroků popsaných v tomto článku můžete použít novou nebo existující aplikaci funkcí.

Pokud chcete vytvořit novou aplikaci funkcí na webu Azure Portal, postupujte takto:

  1. Na webu Azure Portal vyhledejte aplikaci funkcí. Výběrem ikony Aplikace funkcí přejděte do seznamu aplikací funkcí ve vašem předplatném.

  2. Výběrem tlačítka Vytvořit vytvořte novou aplikaci funkcí.

  3. Na kartě Základy zadejte skupinu prostředků a zadejte jedinečný název nové aplikace funkcí.

  4. Ujistěte se, že je možnost Publikovat nastavená na Kód.

  5. V rozevíracím seznamu zásobníku modulu runtime vyberte .NET. Pole Verze se vyplní automaticky, aby používalo nejnovější verzi .NET Core.

  6. Vyberte oblast nové aplikace funkcí.

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

  7. Po dokončení karty Základy přejděte na kartu Hostování .

  8. Na kartě Hostování vyberte účet úložiště, do kterého se uloží vaše funkce Azure Functions. Můžete zvolit existující účet úložiště nebo vytvořit nový.

  9. Ujistěte se, že je pole Operační systém nastavené na Windows.

  10. V poli Typ plánu vyberte Consumption (Bezserverová verze). Další informace o tomto plánu najdete v tématu Hostování plánu Consumption služby Azure Functions.

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

  11. Vyberte Zkontrolovat a vytvořit novou aplikaci funkcí.

Další informace o konfiguraci aplikace funkcí najdete v tématu Správa aplikace funkcí v dokumentaci ke službě Azure Functions.

Vytvoření funkce Azure Functions jako triggeru Event Gridu

Dále vytvořte funkci Azure Functions, která se spustí při dosazování objektu blob v konkrétním účtu úložiště. Pomocí následujícího postupu vytvořte funkci Azure Functions v sadě Visual Studio s C# a .NET Core:

  1. Spusťte Visual Studio 2019 a vytvořte nový projekt Azure Functions. Podrobnosti najdete v pokynech popsaných v tématu Vytvoření projektu aplikace funkcí.

  2. V kroku Vytvořit novou aplikaci Azure Functions vyberte následující hodnoty:

    • Modul runtime Azure Functions je standardně nastavený na Azure Functions v3 (.NET Core). Microsoft doporučuje používat tuto verzi modulu runtime Azure Functions.
    • V seznamu možných triggerů vyberte Trigger Event Gridu. Další informace o tom, proč je trigger Event Gridu doporučeným typem triggeru pro zpracování události služby Blob Storage pomocí funkce Azure, najdete v tématu Použití funkce jako obslužné rutiny událostí pro události Event Gridu.
    • Nastavení účtu úložiště označuje, kde se vaše funkce Azure Functions uloží. Můžete vybrat existující účet úložiště nebo vytvořit nový.
  3. Vyberte Vytvořit a vytvořte nový projekt v sadě Visual Studio.

  4. V dalším kroku přejmenujte třídu a funkci Azure, jak je popsáno v části Přejmenovat funkci. Zvolte název, který je vhodný pro váš scénář.

  5. V sadě Visual Studio vyberte nástroje | NuGet Správce balíčků | Správce balíčků konzolu a pak z konzoly nainstalujte následující balíčky:

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  6. Do souboru třídy pro funkci Azure Functions vložte následující příkazy using:

    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. Vyhledejte metodu Run v souboru třídy. Jedná se o metodu, která se spouští při výskytu události. Do těla metody Run vložte následující kód. Nezapomeňte nahradit zástupné hodnoty v hranatých závorkách vlastními hodnotami:

    // 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;
        }
    }
    

Další informace o vývoji Azure Functions najdete v pokynech k vývoji Azure Functions.

Další informace o informacích, které jsou zahrnuté při publikování události Blob Storage do obslužné rutiny události, najdete v tématu Azure Blob Storage jako zdroj Event Gridu.

Místní spuštění funkce Azure Functions v ladicím programu

Pokud chcete kód funkce Azure Functions otestovat místně, musíte ručně odeslat požadavek HTTP, který událost aktivuje. Požadavek můžete publikovat pomocí nástroje, jako je Postman.

V horní části souboru třídy pro vaši funkci Azure Je koncový bod adresy URL, který můžete použít k testování v místním prostředí. Odeslání požadavku pomocí této adresy URL aktivuje událost v místním prostředí, abyste mohli kód ladit. Adresa URL je v následujícím formátu:

http://localhost:7071/runtime/webhooks/EventGrid?functionName={functionname}

Požadavek, který odešlete do tohoto koncového bodu, je simulovaný požadavek. Neodesílá ani nepřijímá data z vašeho účtu Azure Storage.

Pomocí těchto kroků vytvořte a odešlete požadavek do tohoto koncového bodu. Tento příklad ukazuje, jak odeslat požadavek pomocí nástroje Postman.

  1. V prostředí Postman vytvořte nový požadavek.

  2. Vložte adresu URL uvedenou výše do pole adresy URL požadavku a nahraďte název funkce {functionname} složenými závorkami a odeberte závorky. Ujistěte se, že je příkaz požadavku nastavený na GET.

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

  3. Přidejte hlavičku Content-Type a nastavte ji na application/json.

  4. Přidejte hlavičku aeg-event-type a nastavte ji na Oznámení.

    Screenshot showing header configuration for local request to trigger event

  5. V Nástroji Postman zadejte text požadavku s typem textu nastaveným na JSON a formátem, který se má nezpracovaný. Následující příklad simuluje požadavek copy blob . Zástupné hodnoty v lomených závorkách nahraďte vlastními hodnotami. Všimněte si, že není nutné měnit hodnoty data a času nebo identifikátoru, protože se jedná o simulovaný požadavek:

    [{
      "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. V sadě Visual Studio umístěte do kódu všechny požadované zarážky a stisknutím klávesy F5 spusťte ladicí program.

  7. V nástroji Postman vyberte tlačítko Odeslat a odešlete požadavek do koncového bodu.

Když odešlete požadavek, Event Grid zavolá funkci Azure Functions a můžete ji normálně ladit. Další informace a příklady najdete v tématu Ruční publikování požadavku v dokumentaci ke službě Azure Functions.

Požadavek, který událost aktivuje, se simuluje, ale funkce Azure Functions, která se spustí při aktivaci události, zapisuje informace protokolu do nového objektu blob ve vašem účtu úložiště. Obsah objektu blob můžete ověřit a zobrazit jeho čas poslední změny na webu Azure Portal, jak je znázorněno na následujícím obrázku:

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

Publikování funkce Azure Functions

Po místním otestování funkce Azure Functions je dalším krokem publikování funkce Azure Functions do aplikace funkcí Azure, kterou jste vytvořili dříve. Funkce musí být publikovaná, abyste mohli službu Event Grid nakonfigurovat tak, aby odesílala události, ke kterým došlo v účtu úložiště, do koncového bodu funkce.

Pokud chcete funkci publikovat, postupujte takto:

  1. V Průzkumník řešení vyberte projekt Azure Functions a podržte ho (nebo na to klikněte pravým tlačítkem) a zvolte Publikovat.

  2. V okně Publikovat vyberte Jako cíl Azure a pak zvolte Další.

  3. Jako konkrétní cíl vyberte aplikaci Funkcí Azure (Windows) a pak zvolte Další.

  4. Na kartě Instance služby Functions vyberte své předplatné z rozevírací nabídky a pak v seznamu dostupných aplikací funkcí vyhledejte svou aplikaci Funkcí Azure.

  5. Ujistěte se, že je zaškrtnuté políčko Spustit ze souboru balíčku.

  6. Vyberte Dokončit a připravte se na publikování funkce.

  7. Na stránce Publikovat ověřte správnost konfigurace. Pokud se zobrazí upozornění, že závislost služby na aplikaci Přehledy není nakonfigurovaná, můžete ji nakonfigurovat z této stránky.

  8. Výběrem tlačítka Publikovat zahájíte publikování funkce Azure Functions do aplikace Funkcí Azure, kterou jste vytvořili dříve.

    Screenshot showing page to publish Azure Function from Visual Studio

Kdykoli ve funkci Azure Functions provedete změny kódu, musíte aktualizovanou funkci publikovat do Azure.

Přihlášení k odběru událostí dosazování objektů blob z účtu úložiště

Teď máte aplikaci funkcí, která obsahuje funkci Azure, která se dá spustit v reakci na událost. Dalším krokem je vytvoření odběru událostí z účtu úložiště. Odběr událostí nakonfiguruje účet úložiště tak, aby událost publikoval prostřednictvím Služby Event Grid v reakci na operaci s objektem blob ve vašem účtu úložiště. Event Grid pak odešle událost do koncového bodu obslužné rutiny události, který jste zadali. V tomto případě je obslužná rutina události funkcí Azure, kterou jste vytvořili v předchozí části.

Při vytváření odběru událostí můžete filtrovat, které události se odesílají do obslužné rutiny události. Události, které se mají zachytit při dosazování objektu blob z archivní úrovně, jsou Microsoft.Storage.BlobTierChanged, odpovídající operaci Set Blob Tier a Microsoft.Storage.BlobCreated události odpovídající operaci kopírování objektu blob. V závislosti na vašem scénáři můžete chtít zpracovat pouze jednu z těchto událostí.

Pokud chcete vytvořit odběr události, postupujte takto:

  1. Na webu Azure Portal přejděte do účtu úložiště, který obsahuje objekty blob, které se mají dosadit z archivní úrovně.

  2. V levém navigačním podokně vyberte nastavení Události .

  3. Na stránce Události vyberte Další možnosti.

  4. Vyberte Vytvořit odběr událostí.

  5. Na stránce Vytvořit odběr události v části Podrobnosti odběru událostí zadejte název odběru události.

  6. V části Podrobnosti tématu zadejte název systémového tématu. Systémové téma představuje jednu nebo více událostí publikovaných službou Azure Storage. Další informace o systémových tématech najdete v tématu Systémová témata ve službě Azure Event Grid.

  7. V části Typy událostí vyberte události Blob Created (Vytvořené objekty blob) a Blob Tier Changed (Změněné úrovně objektů blob). V závislosti na tom, jak se rozhodnete dosadit objekt blob z archivní úrovně, se aktivuje jedna z těchto dvou událostí.

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

  8. V části Podrobnosti o koncovém bodu vyberte v rozevírací nabídce funkci Azure Functions.

  9. Zvolte Vybrat koncový bod a určete funkci, kterou jste vytvořili v předchozí části. V dialogovém okně Vybrat funkci Azure zvolte předplatné, skupinu prostředků a aplikaci funkcí pro funkci Azure Functions. Nakonec v rozevíracím seznamu vyberte název funkce a zvolte Potvrdit výběr.

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

  10. Výběrem tlačítka Vytvořit vytvořte odběr události a začněte odesílat události do obslužné rutiny události funkce Azure Functions.

Další informace o odběrech událostí najdete v tématu Koncepty služby Azure Event Grid.

Testování obslužné rutiny událostí funkce Azure Functions

Pokud chcete funkci Azure Functions otestovat, můžete aktivovat událost v účtu úložiště, který obsahuje odběr události. Odběr událostí, který jste vytvořili dříve, filtruje dvě události: Microsoft.Storage.BlobCreated a Microsoft.Storage.BlobTierChanged. Když se aktivuje některé z těchto událostí, aktivuje se vaše funkce Azure Functions.

Funkce Azure functions zobrazená v tomto článku zapisuje do objektu blob protokolu ve dvou scénářích:

  • Pokud je událost Microsoft.Storage.BlobCreated a operace rozhraní API je Kopírovat objekt blob.
  • Pokud je událost Microsoft.Storage.BlobTierChanged a operace rozhraní API je nastavena na úroveň objektu blob.

Pokud chcete zjistit, jak funkci otestovat dosazováním objektu blob, podívejte se na jeden z těchto dvou postupů:

Po dokončení dosazování se objekt blob protokolu zapíše do stejného kontejneru jako objekt blob, který jste dosazovali. Například po dosazování objektu blob s operací kopírování uvidíte na webu Azure Portal, že původní zdrojový objekt blob zůstane v archivní úrovni, plně rehydrovaný cílový objekt blob se zobrazí v cílové online vrstvě a objekt blob protokolu vytvořený funkcí Azure Functions se zobrazí také v seznamu.

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.

Mějte na paměti, že dosazování objektu blob může trvat až 15 hodin v závislosti na nastavení priority dosazování. Pokud nastavíte prioritu dosazování na hodnotu Vysoká, může se dosazování dokončit do jedné hodiny pro objekty blob, které mají velikost menší než 10 GB. Při dosazování s vysokou prioritou se však účtují vyšší náklady. Další informace najdete v tématu Přehled dosazování objektů blob z archivní úrovně.

Tip

I když je cílem tohoto postupu zpracovat tyto události v kontextu dosazování objektů blob, pro účely testování může být také užitečné sledovat tyto události v reakci na nahrání objektu blob nebo změnu úrovně online objektu blob (tj. z horké na studenou), protože se událost okamžitě aktivuje.

Další informace o filtrování událostí v Event Gridu najdete v tématu Jak filtrovat události pro Azure Event Grid.

Viz také