Запуск функции Azure в ответ на событие восстановления BLOB-объекта

Чтобы считать BLOB-объект на архивном уровне, необходимо сначала восстановить его на горячем или холодном уровне. Процесс восстановления может занять несколько часов. Вместо многократного опроса состояния операции восстановления можно настроить службу Сетка событий Azure, чтобы активировать событие при завершении операции восстановления BLOB-объекта и обработать это событие в приложении.

При возникновении события Сетка событий отправляет его в обработчик событий через конечную точку. Ряд служб Azure может выступать в качестве обработчиков событий, включая Функции Azure. Функция Azure — это блок кода, который может выполняться в ответ на событие. В этом пошаговом руководстве описан процесс разработки функции Azure и последующей настройки службы "Сетка событий" для выполнения этой функции в ответ на событие, возникающее при восстановлении BLOB-объекта.

В этой статье показано, как создать и протестировать функцию Azure с использованием .NET из Visual Studio. Вы можете создавать функции Azure из различных локальных сред разработки и использовать различные языки программирования. Дополнительные сведения о поддерживаемых языках для функций Azure см. в статье Поддерживаемые языки в решении "Функции Azure". Дополнительные сведения о возможностях разработки функций Azure см. в статье Как программировать и тестировать Функции Azure в локальной среде.

Дополнительные сведения о восстановлении BLOB-объектов с архивного уровня см. в разделе Общие сведения о восстановлении BLOB-объектов из уровня архива.

Необходимые компоненты

В этой статье описано, как использовать Visual Studio 2019 или более поздней версии для разработки функции Azure с использованием .NET. Visual Studio Community можно установить бесплатно. Убедитесь, что вы настроили Visual Studio для разработки Azure с использованием .NET.

Для локальной отладки функции Azure потребуется средство, способное отправить HTTP-запрос, например Postman.

Требуется подписка Azure. Если у вас еще нет учетной записи, создайте бесплатную учетную запись, прежде чем начать работу.

Создание приложения-функции Azure

Приложение-функция — это ресурс Azure, который служит контейнером для Функций Azure. Для выполнения действий, описанных в этой статье, можно использовать новое или существующее приложение-функцию.

Чтобы создать приложение-функцию на портале Azure, сделайте следующее.

  1. На портале Azure выполните поиск по запросу Приложение-функция. Щелкните значок Приложение-функция, чтобы перейти к списку приложений-функций в своей подписке.

  2. Нажмите кнопку Создать, чтобы создать приложение-функцию.

  3. На вкладке Основные укажите группу ресурсов и задайте уникальное имя для нового приложения-функции.

  4. Задайте для параметра Публикация значение Код.

  5. В раскрывающемся списке Стек времени выполнения выберите .NET. Поле Версия заполняется автоматически для использования последней версии .NET Core.

  6. Выберите регион для нового приложения-функции.

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

  7. Закончив работу на вкладке Основные, перейдите на вкладку Размещение.

  8. На вкладке Размещение выберите учетную запись хранения, где будет храниться ваша функция Azure. Вы можете выбрать имеющуюся учетную запись хранения или создать ее.

  9. В поле Операционная система задайте значение Windows.

  10. В поле Тип плана выберите Потребление (бессерверное). Дополнительные сведения об этом плане см. в разделе Размещение плана потребления Функций Azure.

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

  11. Выберите Просмотр и создание, чтобы создать приложение-функцию.

Дополнительные сведения о настройке приложения-функции см. в разделе Управление приложением-функцией документации по Функциям Azure.

Создание функции Azure в качестве триггера Сетки событий

Далее создайте функцию Azure, которая будет выполняться при восстановлении BLOB-объекта в определенной учетной записи хранения. Выполните следующие действия, чтобы создать функцию Azure в Visual Studio с использованием C# и .NET Core.

  1. Запустите Visual Studio 2019 и создайте проект Функций Azure. Для получения дополнительных сведений выполните инструкции, описанные в разделе Создание проекта приложения-функции.

  2. На шаге Создание нового приложения Функций Azure выберите следующие значения.

    • По умолчанию в качестве среды выполнения Функций Azure указана Функции Azure v3 (.NET Core). Корпорация Майкрософт рекомендует использовать именно эту версию среды выполнения Функций Azure.
    • В списке возможных триггеров выберите Триггер сетки событий. Дополнительные сведения о том, почему триггер Сетки событий является рекомендуемым типом триггера для обработки события Хранилища BLOB-объектов с функцией Azure, см. в разделе Использование функции Azure как обработчика событий Сетки событий.
    • Параметр Учетная запись хранения указывает, где будет храниться функция Azure. Можно выбрать существующую учетную запись хранения или создать новую.
  3. Выберите Создать, чтобы создать проект в Visual Studio.

  4. Затем переименуйте класс и функцию Azure, как описано в разделе Переименование функции. Выберите имя, подходящее для вашего сценария.

  5. В Visual Studio последовательно выберите Инструменты | Диспетчер пакетов NuGet | Консоль диспетчера пакетов, а затем установите следующие пакеты из консоли:

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  6. В файле класса для функции Azure вставьте следующие операторы 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. Найдите метод Run в файле класса. Это метод выполняется при возникновении события. Замените текст метода Run следующим кодом. Не забудьте заменить значения заполнителей в угловых скобках собственными значениями.

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

Дополнительные сведения о разработке функций Azure см. в статье Руководство по разработке Функций Azure.

Дополнительные сведения о данных, включаемых при публикации события Хранилища BLOB-объектов в обработчике событий, см. в статье Хранилище BLOB-объектов Azure в качестве источника Сетки событий.

Локальное выполнение функции Azure в отладчике

Чтобы локально протестировать код функции Azure, необходимо вручную отправить HTTP-запрос, активирующий событие. Запрос можно отправить с помощью такого средства, как Postman.

В начале файла класса для функции Azure указана конечная точка URL-адреса, которую можно использовать для тестирования в локальной среде. Отправка запроса с помощью этого URL-адреса активирует событие в локальной среде, что позволяет выполнить отладку кода. Этот URL-адрес имеет следующий формат:

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

Запрос, отправляемый в эту конечную точку, является имитированным. Он не отправляет данные в учетную запись службы хранилища Azure и не получает их оттуда.

Выполните следующие действия, чтобы создать запрос и отправить его в эту конечную точку. В этом примере показано, как отправить запрос с помощью Postman.

  1. Создайте запрос в Postman.

  2. Вставьте приведенный выше URL-адрес в поле URL-адреса запроса, заменив {functionname} именем функции и удалив фигурные скобки. Задайте для команды запроса значение GET.

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

  3. Добавьте заголовок с именем Content-Type и значением application/json.

  4. Добавьте заголовок с именем aeg-event-type и значением Notification.

    Screenshot showing header configuration for local request to trigger event

  5. В Postman укажите текст запроса, задав для него тип текста JSON и формат raw. В следующем примере имитируется запрос на копирование BLOB-объекта. Замените значения заполнителей в угловых скобках фактическими значениями. Обратите внимание, что изменять значения даты, времени или идентификатора необязательно, так как это имитированный запрос:

    [{
      "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. В Visual Studio добавьте в код необходимые точки останова и нажмите клавишу F5 для запуска отладчика.

  7. Нажмите кнопку Отправить в Postman, чтобы отправить запрос конечной точке.

При отправке запроса служба "Сетка событий" вызывает функцию Azure, и ее можно отладить в обычном режиме. Дополнительные сведения и примеры см. в разделе Публикация запроса вручную документации по Функциям Azure.

Выполняется имитация запроса, активирующего событие, но функция Azure, которая выполняется при активации события, записывает данные журнала в новый BLOB-объект в вашей учетной записи хранения. Вы можете проверить содержимое BLOB-объекта и просмотреть время его последнего изменения на портале Azure, как показано на следующем рисунке:

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

публикация функции Azure;

Следующий этап после локального тестирования функции Azure заключается в публикации функции Azure в ранее созданном приложении-функции Azure. Функция должна быть опубликована, чтобы можно было настроить Сетку событий для отправки событий, возникающих в учетной записи хранения, в конечную точку функции.

Выполните следующие действия, чтобы опубликовать функцию.

  1. В обозревателе решений выделите и удерживайте (или щелкните правой кнопкой) проект Функции Azure и выберите пункт Опубликовать.

  2. В окне Публикация выберите Azure в качестве целевого объекта и нажмите Далее.

  3. Выберите Приложение-функция Azure (Windows) в качестве конкретного целевого объекта и нажмите кнопку Далее.

  4. На вкладке Экземпляр Функций выберите подписку в раскрывающемся меню, а затем найдите приложение-функцию Azure в списке доступных приложений-функций.

  5. Установите флажок Запустить из файла пакета.

  6. Нажмите кнопку Готово, чтобы подготовиться к публикации функции.

  7. На странице Публикация проверьте правильность конфигурации. Если отображается предупреждение о том, что зависимость службы от Application Insights не настроена, ее можно настроить на этой странице.

  8. Нажмите кнопку Опубликовать, чтобы начать публикацию функции Azure в созданном ранее приложении-функции Azure.

    Screenshot showing page to publish Azure Function from Visual Studio

При любом внесении изменений в код в функции Azure необходимо опубликовать обновленную функцию в Azure.

Подписка на события восстановления BLOB-объекта из учетной записи хранения

Теперь у вас есть приложение-функция, содержащее функцию Azure, которая может выполняться в ответ на событие. Следующим шагом является создание подписки на события из учетной записи хранения. Подписка на события настраивает учетную запись хранения для публикации события через Сетку событий в ответ на операцию с BLOB-объектом в вашей учетной записи хранения. Затем Сетка событий отправляет событие в указанную конечную точку обработчика событий. В данном случае обработчиком событий является функция Azure, созданная в предыдущем разделе.

При создании подписки на события можно отфильтровать события, отправляемые в обработчик событий. События, которые необходимо записать при повторном удалении большого двоичного объекта из архивного уровня, являются Microsoft.служба хранилища. BlobTierChanged, соответствующий операции "Набор уровней BLOB-объектов" и Microsoft.служба хранилища. События BLOBCreated, соответствующие операции копирования BLOB-объектов. В зависимости от сценария вам может потребоваться выполнить обработку только одного из этих событий.

Чтобы создать подписку на события, сделайте следующее.

  1. На портале Azure перейдите к учетной записи хранения, содержащей BLOB-объекты, которые необходимо восстановить с архивного уровня.

  2. В области навигации слева выберите События.

  3. На странице События выберите Дополнительные параметры.

  4. Выберите Создать подписку на события.

  5. На странице Создать подписку на события в разделе Сведения о подписке на события укажите имя для подписки на события.

  6. В разделе Сведения о разделе введите имя системного раздела. Системный раздел представляет одно или несколько событий, опубликованных службой хранилища Azure. Дополнительные сведения о системных разделах см. в разделе Системные разделы в службе "Сетка событий Azure".

  7. В разделе Типы событий выберите события Blob Created (BLOB-объект создан) и Blob Tier Changed (Уровень BLOB-объекта изменен). В зависимости от того, как вы решили восстановить BLOB-объект с архивного уровня, активируется одно из этих двух событий.

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

  8. В разделе Сведения о конечной точке выберите значение Функция Azure в раскрывающемся меню.

  9. Выберите Выбрать конечную точку, чтобы указать функцию, созданную в предыдущем разделе. В диалоговом окне Выберите функцию Azure выберите подписку, группу ресурсов и приложение-функцию для своей функции Azure. Наконец, выберите имя функции в раскрывающемся списке и нажмите кнопку Подтвердить выбор.

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

  10. Нажмите кнопку Создать, чтобы создать подписку на события и начать отправку событий в обработчик событий функции Azure.

Дополнительные сведения о подписках на события см. в разделе Основные понятия службы "Сетка событий Azure".

Тестирование обработчика событий функции Azure

Чтобы протестировать функцию Azure, можно активировать событие в учетной записи хранения, которая содержит подписку на события. Созданная ранее подписка на события фильтруется по двум событиям — Microsoft.Storage.BlobCreated и Microsoft.Storage.BlobTierChanged. При возникновении одного из этих событий активируется функция Azure.

Функция Azure, приведенная в этой статье, осуществляет запись в BLOB-объект журнала при двух сценариях:

  • При событии Microsoft.Storage.BlobCreated и операции API Копирование BLOB-объекта.
  • При событии Microsoft.Storage.BlobTierChanged и операции API Установка уровня большого двоичного объекта.

Чтобы узнать, как протестировать функцию посредством восстановления BLOB-объекта, ознакомьтесь с одной из следующих двух процедур.

После завершения восстановления BLOB-объект журнала записывается в тот же контейнер, что и восстановленный BLOB-объект. Например, после восстановления BLOB-объекта с использованием операции копирования на портале Azure можно увидеть, что исходный BLOB-объект остается на архивном уровне, полностью восстановленный целевой BLOB-объект находится на целевом подключенном уровне, а BLOB-объект журнала, созданный функцией Azure, также отображается в списке.

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.

Не забывайте, что восстановление BLOB-объекта может занять до 15 часов в зависимости от настройки приоритета восстановления. Если установлен приоритет восстановления Высокий, восстановление для BLOB-объектов размером менее 10 ГБ может завершиться менее чем за час. Однако восстановление с высоким приоритетом требует больших затрат. Дополнительные сведения см. в разделе Общие сведения о восстановлении больших двоичных объектов из архивного уровня хранилища.

Совет

Хотя целью этого практического руководства является обработка таких событий в контексте восстановления BLOB-объекта, для тестирования также может быть полезно наблюдать за этими событиями в контексте отправки BLOB-объекта или изменения подключенного уровня BLOB-объекта (например, с горячего на холодный), так как событие активируется немедленно.

Дополнительные сведения о том, как отфильтровать события в службе "Сетка событий", см. в разделе Фильтрация событий для Сетки событий Azure.

См. также