Uruchamianie funkcji platformy Azure w odpowiedzi na zdarzenie przywracania obiektu blob

Aby odczytać obiekt blob, który znajduje się w warstwie Archiwum, należy najpierw przywrócić obiekt blob do warstwy Gorąca lub Chłodna. Ukończenie procesu ponownego wypełniania może potrwać kilka godzin. Zamiast wielokrotnie sondować stan operacji ponownego wypełniania, możesz skonfigurować usługę Azure Event Grid tak, aby uruchamiała zdarzenie po zakończeniu operacji ponownego wypełniania obiektu blob i obsłużyć to zdarzenie w aplikacji.

Gdy wystąpi zdarzenie, usługa Event Grid wysyła zdarzenie do programu obsługi zdarzeń za pośrednictwem punktu końcowego. Wiele usług platformy Azure może służyć jako programy obsługi zdarzeń, w tym usługi Azure Functions. Funkcja platformy Azure to blok kodu, który może być wykonywany w odpowiedzi na zdarzenie. W tym przewodniku przedstawiono proces tworzenia funkcji platformy Azure, a następnie konfigurowania usługi Event Grid w celu uruchomienia funkcji w odpowiedzi na zdarzenie, które występuje po ponownym wypełnianiu obiektu blob.

W tym artykule pokazano, jak utworzyć i przetestować funkcję platformy Azure przy użyciu platformy .NET z poziomu programu Visual Studio. Usługę Azure Functions można tworzyć z różnych lokalnych środowisk programistycznych i używać różnych języków programowania. Aby uzyskać więcej informacji na temat obsługiwanych języków dla usługi Azure Functions, zobacz Obsługiwane języki w usłudze Azure Functions. Aby uzyskać więcej informacji na temat opcji programowania dla usługi Azure Functions, zobacz Code and test Azure Functions locally (Kodowanie i testowanie usługi Azure Functions lokalnie).

Aby uzyskać więcej informacji na temat ponownego wypełniania obiektów blob z warstwy Archiwum, zobacz Overview of blob rehydration from the archive tier (Omówienie przywracania obiektów blob z warstwy archiwum).

Wymagania wstępne

W tym artykule pokazano, jak używać programu Visual Studio 2019 lub nowszego do tworzenia funkcji platformy Azure przy użyciu platformy .NET. Możesz bezpłatnie zainstalować program Visual Studio Community. Upewnij się, że skonfigurowaliśmy program Visual Studio for Azure Development przy użyciu platformy .NET.

Aby debugować funkcję platformy Azure lokalnie, musisz użyć narzędzia, które może wysłać żądanie HTTP, takie jak Postman.

Wymagana jest subskrypcja platformy Azure. Jeśli nie masz jeszcze konta, przed rozpoczęciem utwórz bezpłatne konto.

Tworzenie aplikacji funkcji platformy Azure

Aplikacja funkcji to zasób platformy Azure, który służy jako kontener dla usługi Azure Functions. Aby wykonać kroki opisane w tym artykule, możesz użyć nowej lub istniejącej aplikacji funkcji.

Aby utworzyć nową aplikację funkcji w witrynie Azure Portal, wykonaj następujące kroki:

  1. W witrynie Azure Portal wyszukaj pozycję Aplikacja funkcji. Wybierz ikonę Aplikacja funkcji, aby przejść do listy aplikacji funkcji w subskrypcji.

  2. Wybierz przycisk Utwórz, aby utworzyć nową aplikację funkcji.

  3. Na karcie Podstawy określ grupę zasobów i podaj unikatową nazwę nowej aplikacji funkcji.

  4. Upewnij się, że opcja Publikuj jest ustawiona na Kod.

  5. Z listy rozwijanej Stos środowiska uruchomieniowego wybierz pozycję .NET. Pole Wersja jest wypełniane automatycznie, aby używać najnowszej wersji platformy .NET Core.

  6. Wybierz region dla nowej aplikacji funkcji.

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

  7. Po ukończeniu karty Podstawowe przejdź do karty Hosting .

  8. Na karcie Hosting wybierz konto magazynu, na którym będzie przechowywana funkcja platformy Azure. Możesz wybrać istniejące konto magazynu lub utworzyć nowe.

  9. Upewnij się, że pole System operacyjny ma wartość Windows.

  10. W polu Typ planu wybierz pozycję Zużycie (bezserwerowe). Aby uzyskać więcej informacji na temat tego planu, zobacz Hosting planu użycia usługi Azure Functions.

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

  11. Wybierz pozycję Przejrzyj i utwórz , aby utworzyć nową aplikację funkcji.

Aby dowiedzieć się więcej na temat konfigurowania aplikacji funkcji, zobacz Zarządzanie aplikacją funkcji w dokumentacji usługi Azure Functions.

Tworzenie funkcji platformy Azure jako wyzwalacza usługi Event Grid

Następnie utwórz funkcję platformy Azure, która będzie uruchamiana po ponownym wypełnianiu obiektu blob na określonym koncie magazynu. Wykonaj następujące kroki, aby utworzyć funkcję platformy Azure w programie Visual Studio przy użyciu języków C# i .NET Core:

  1. Uruchom program Visual Studio 2019 i utwórz nowy projekt usługi Azure Functions. Aby uzyskać szczegółowe informacje, postępuj zgodnie z instrukcjami opisanymi w temacie Tworzenie projektu aplikacji funkcji.

  2. W kroku Tworzenie nowej aplikacji usługi Azure Functions wybierz następujące wartości:

    • Domyślnie środowisko uruchomieniowe usługi Azure Functions jest ustawione na usługę Azure Functions w wersji 3 (.NET Core). Firma Microsoft zaleca korzystanie z tej wersji środowiska uruchomieniowego usługi Azure Functions.
    • Z listy możliwych wyzwalaczy wybierz pozycję Wyzwalacz usługi Event Grid. Aby uzyskać więcej informacji na temat tego, dlaczego wyzwalacz usługi Event Grid jest zalecanym typem wyzwalacza do obsługi zdarzenia usługi Blob Storage za pomocą funkcji platformy Azure, zobacz Używanie funkcji jako procedury obsługi zdarzeń dla zdarzeń usługi Event Grid.
    • Ustawienie Konto magazynu wskazuje, gdzie będzie przechowywana funkcja platformy Azure. Możesz wybrać istniejące konto magazynu lub utworzyć nowe.
  3. Wybierz pozycję Utwórz , aby utworzyć nowy projekt w programie Visual Studio.

  4. Następnie zmień nazwę klasy i funkcji platformy Azure zgodnie z opisem w temacie Zmiana nazwy funkcji. Wybierz nazwę odpowiednią dla danego scenariusza.

  5. W programie Visual Studio wybierz pozycję Narzędzia NuGet | Menedżer pakietów | Menedżer pakietów Konsola, a następnie zainstaluj następujące pakiety z konsoli programu :

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  6. W pliku klasy funkcji platformy Azure wklej następujące instrukcje 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. Znajdź metodę Run w pliku klasy. Jest to metoda uruchamiana po wystąpieniu zdarzenia. Wklej następujący kod do treści metody Run . Pamiętaj, aby zastąpić wartości symboli zastępczych w nawiasach kątowych własnymi wartościami:

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

Aby uzyskać więcej informacji na temat tworzenia usługi Azure Functions, zobacz Wskazówki dotyczące tworzenia usługi Azure Functions.

Aby dowiedzieć się więcej o informacjach uwzględnionych podczas publikowania zdarzenia usługi Blob Storage w procedurze obsługi zdarzeń, zobacz Azure Blob Storage as Event Grid source (Usługa Azure Blob Storage jako źródło usługi Event Grid).

Uruchamianie funkcji platformy Azure lokalnie w debugerze

Aby przetestować kod funkcji platformy Azure lokalnie, musisz ręcznie wysłać żądanie HTTP, które wyzwoli zdarzenie. Żądanie można opublikować przy użyciu narzędzia takiego jak Postman.

W górnej części pliku klasy dla funkcji platformy Azure znajduje się punkt końcowy adresu URL, którego można użyć do testowania w środowisku lokalnym. Delegowanie żądania za pomocą tego adresu URL wyzwala zdarzenie w środowisku lokalnym, aby można było debugować kod. Adres URL ma następujący format:

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

Żądanie wysyłane do tego punktu końcowego to symulowane żądanie. Nie wysyła ani nie odbiera danych z konta usługi Azure Storage.

Wykonaj następujące kroki, aby skonstruować i wysłać żądanie do tego punktu końcowego. W tym przykładzie pokazano, jak wysłać żądanie za pomocą narzędzia Postman.

  1. W środowisku Postman utwórz nowe żądanie.

  2. Wklej adres URL pokazany powyżej w polu adresu URL żądania, zastępując nazwę funkcji i {functionname} usuwając nawiasy klamrowe. Upewnij się, że zlecenie żądania ma ustawioną wartość GET.

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

  3. Dodaj nagłówek Content-Type i ustaw go na wartość application/json.

  4. Dodaj nagłówek aeg-event-type i ustaw go na Powiadomienie.

    Screenshot showing header configuration for local request to trigger event

  5. W narzędziu Postman określ treść żądania z typem treści ustawionym na JSON i formatem nieprzetworzonym. Poniższy przykład symuluje żądanie kopiowania obiektu blob . Zastąp wartości symboli zastępczych w nawiasach kątowych własnymi wartościami. Należy pamiętać, że nie jest konieczne zmianę wartości daty/godziny lub identyfikatora, ponieważ jest to symulowane żądanie:

    [{
      "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. W programie Visual Studio umieść dowolne żądane punkty przerwania w kodzie i naciśnij klawisz F5 , aby uruchomić debuger.

  7. W narzędziu Postman wybierz przycisk Wyślij , aby wysłać żądanie do punktu końcowego.

Po wysłaniu żądania usługa Event Grid wywołuje funkcję platformy Azure i można ją debugować normalnie. Aby uzyskać dodatkowe informacje i przykłady, zobacz Ręczne publikowanie żądania w dokumentacji usługi Azure Functions.

Żądanie wyzwalające zdarzenie jest symulowane, ale funkcja platformy Azure uruchamiana po uruchomieniu zdarzenia zapisuje informacje dziennika do nowego obiektu blob na koncie magazynu. Zawartość obiektu blob można sprawdzić i wyświetlić czas ostatniej modyfikacji w witrynie Azure Portal, jak pokazano na poniższej ilustracji:

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

Publikowanie funkcji platformy Azure

Po przetestowaniu funkcji platformy Azure lokalnie następnym krokiem jest opublikowanie funkcji platformy Azure w utworzonej wcześniej aplikacji funkcji platformy Azure. Funkcja musi zostać opublikowana, aby można było skonfigurować usługę Event Grid w celu wysyłania zdarzeń występujących na koncie magazynu do punktu końcowego funkcji.

Wykonaj następujące kroki, aby opublikować funkcję:

  1. W Eksplorator rozwiązań wybierz i przytrzymaj (lub kliknij prawym przyciskiem myszy) projekt usługi Azure Functions i wybierz pozycję Publikuj.

  2. W oknie Publikowanie wybierz pozycję Azure jako element docelowy, a następnie wybierz pozycję Dalej.

  3. Wybierz pozycję Aplikacja funkcji platformy Azure (Windows) jako określony element docelowy, a następnie wybierz pozycję Dalej.

  4. Na karcie Wystąpienie usługi Functions wybierz swoją subskrypcję z menu rozwijanego, a następnie znajdź aplikację funkcji platformy Azure na liście dostępnych aplikacji funkcji.

  5. Upewnij się, że pole wyboru Uruchom z pliku pakietu zostało zaznaczone.

  6. Wybierz pozycję Zakończ , aby przygotować się do opublikowania funkcji.

  7. Na stronie Publikowanie sprawdź, czy konfiguracja jest poprawna. Jeśli zostanie wyświetlone ostrzeżenie, że zależność usługi do aplikacji Szczegółowe informacje nie jest skonfigurowana, możesz ją skonfigurować na tej stronie.

  8. Wybierz przycisk Publikuj, aby rozpocząć publikowanie funkcji platformy Azure w utworzonej wcześniej aplikacji funkcji platformy Azure.

    Screenshot showing page to publish Azure Function from Visual Studio

Za każdym razem, gdy wprowadzisz zmiany w kodzie funkcji platformy Azure, musisz opublikować zaktualizowaną funkcję na platformie Azure.

Subskrybowanie zdarzeń ponownego wypełniania obiektów blob z konta magazynu

Masz teraz aplikację funkcji zawierającą funkcję platformy Azure, która może działać w odpowiedzi na zdarzenie. Następnym krokiem jest utworzenie subskrypcji zdarzeń na podstawie konta magazynu. Subskrypcja zdarzeń umożliwia skonfigurowanie konta magazynu w celu opublikowania zdarzenia za pośrednictwem usługi Event Grid w odpowiedzi na operację na obiekcie blob na koncie magazynu. Następnie usługa Event Grid wysyła zdarzenie do określonego punktu końcowego programu obsługi zdarzeń. W takim przypadku program obsługi zdarzeń jest funkcją platformy Azure utworzoną w poprzedniej sekcji.

Podczas tworzenia subskrypcji zdarzeń można filtrować zdarzenia wysyłane do programu obsługi zdarzeń. Zdarzenia do przechwycenia podczas ponownego wypełniania obiektu blob z warstwy Archiwum to Microsoft.Storage.BlobTierChanged, odpowiadające operacji Set Blob Tier oraz Zdarzenia Microsoft.Storage.BlobCreated odpowiadające operacji kopiowania obiektu blob. W zależności od scenariusza możesz obsługiwać tylko jedno z tych zdarzeń.

Aby utworzyć subskrypcję zdarzeń, wykonaj następujące kroki:

  1. W witrynie Azure Portal przejdź do konta magazynu zawierającego obiekty blob w celu ponownego wypełniania z warstwy Archiwum.

  2. Wybierz ustawienie Zdarzenia w okienku nawigacji po lewej stronie.

  3. Na stronie Zdarzenia wybierz pozycję Więcej opcji.

  4. Wybierz pozycję Utwórz subskrypcję zdarzeń.

  5. Na stronie Tworzenie subskrypcji zdarzeń w sekcji Szczegóły subskrypcji zdarzeń podaj nazwę subskrypcji zdarzeń.

  6. W sekcji Szczegóły tematu podaj nazwę tematu systemowego. Temat systemowy reprezentuje co najmniej jedno zdarzenie publikowane przez usługę Azure Storage. Aby uzyskać więcej informacji na temat tematów systemowych, zobacz Tematy systemowe w usłudze Azure Event Grid.

  7. W sekcji Typy zdarzeń wybierz zdarzenia Utworzone obiekty blob i Zmieniono warstwę obiektu blob. W zależności od sposobu ponownego wypełniania obiektu blob z warstwy Archiwum zostanie wyzwolony jeden z tych dwóch zdarzeń.

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

  8. W sekcji Szczegóły punktu końcowego wybierz pozycję Funkcja platformy Azure z menu rozwijanego.

  9. Wybierz pozycję Wybierz punkt końcowy , aby określić funkcję utworzoną w poprzedniej sekcji. W oknie dialogowym Wybieranie funkcji platformy Azure wybierz subskrypcję, grupę zasobów i aplikację funkcji dla funkcji platformy Azure. Na koniec wybierz nazwę funkcji z listy rozwijanej i wybierz pozycję Potwierdź wybór.

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

  10. Wybierz przycisk Utwórz, aby utworzyć subskrypcję zdarzeń i rozpocząć wysyłanie zdarzeń do programu obsługi zdarzeń funkcji platformy Azure.

Aby dowiedzieć się więcej o subskrypcjach zdarzeń, zobacz Pojęcia dotyczące usługi Azure Event Grid.

Testowanie programu obsługi zdarzeń funkcji platformy Azure

Aby przetestować funkcję platformy Azure, możesz wyzwolić zdarzenie na koncie magazynu, które zawiera subskrypcję zdarzeń. Utworzona wcześniej subskrypcja zdarzeń filtruje dwa zdarzenia : Microsoft.Storage.BlobCreated i Microsoft.Storage.BlobTierChanged. Po wyzwoleniu jednego z tych zdarzeń funkcja platformy Azure zostanie wyzwolona.

Funkcja platformy Azure przedstawiona w tym artykule zapisuje w obiekcie blob dziennika w dwóch scenariuszach:

  • Gdy zdarzenie to Microsoft.Storage.BlobCreated , a operacją interfejsu API jest kopiowanie obiektu blob.
  • Gdy zdarzenie to Microsoft.Storage.BlobTierChanged , a operacja interfejsu API to Ustaw warstwę obiektu blob.

Aby dowiedzieć się, jak przetestować funkcję przez ponowne wypełnianie obiektu blob, zobacz jedną z następujących dwóch procedur:

Po zakończeniu ponownego wypełniania obiekt blob dziennika jest zapisywany w tym samym kontenerze co obiekt blob, który jest ponownie wypełniany. Na przykład po ponownym wypełnianiu obiektu blob za pomocą operacji kopiowania można zobaczyć w witrynie Azure Portal, że oryginalny źródłowy obiekt blob pozostaje w warstwie archiwum, w pełni wypełniony docelowy obiekt blob pojawia się w docelowej warstwie online, a obiekt blob dziennika utworzony przez funkcję platformy Azure również pojawia się na liście.

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.

Należy pamiętać, że ponowne wypełnianie obiektu blob może potrwać do 15 godzin, w zależności od ustawienia priorytetu ponownego wypełniania. Jeśli ustawisz priorytet ponownego wypełniania na Wysoki, ponowne wypełnianie może zakończyć się w mniej niż jedną godzinę dla obiektów blob o rozmiarze mniejszym niż 10 GB. Jednak ponowne wypełnianie o wysokim priorytcie wiąże się z większym kosztem. Aby uzyskać więcej informacji, zobacz Omówienie ponownego wypełniania obiektów blob z warstwy archiwum.

Napiwek

Chociaż celem tego instrukcji jest obsługa tych zdarzeń w kontekście ponownego wypełniania obiektów blob, w celach testowych pomocne może być również obserwowanie tych zdarzeń w odpowiedzi na przekazanie obiektu blob lub zmianę warstwy obiektu blob online (tj. od gorącej do chłodnej), ponieważ zdarzenie jest uruchamiane natychmiast.

Aby uzyskać więcej informacji na temat filtrowania zdarzeń w usłudze Event Grid, zobacz Jak filtrować zdarzenia dla usługi Azure Event Grid.

Zobacz też