Поделиться через


Запуск функции 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.

  • Установите или используйте средство, которое может отправлять HTTP-запросы для тестирования решения, например:

    Внимание

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

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

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: создание приложения-функции на вкладке

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

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

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

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

    Снимок экрана: создание приложения-функции на вкладке

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

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

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

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

  1. Запустите Visual Studio 2019. Затем войдите и подключите код приложения к Azure с помощью DefaultAzureCredential.

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

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

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

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

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

    Install-Package Azure.Storage.Blobs
    Install-Package Microsoft.ApplicationInsights.WorkerService
    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights
    
  7. В файле класса для функции 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;
    
  8. Найдите метод 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);
    
    // 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;
        }
    }
    

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

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

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

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

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

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

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

Отправьте запрос в эту конечную точку с помощью средства HTTP-запроса и его инструкций. Обязательно замените {functionname} заполнитель именем функции (например Get http://localhost:7071/runtime/webhooks/EventGrid?functionName=BlobRehydrateEventHandler).

  1. В Visual Studio добавьте в код необходимые точки останова и нажмите клавишу F5 для запуска отладчика.
  2. В средстве HTTP-запроса отправьте запрос в конечную точку.

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

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

Снимок экрана: содержимое BLOB-объекта журнала на портале Azure

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

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: страница для публикации функции Azure из Visual Studio

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

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

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: выбор типов событий для событий восстановления BLOB-объектов на портале Azure

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

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

    Снимок экрана: выбор функции Azure в качестве конечной точки для подписки службы

  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, также отображается в списке.

Снимок экрана: исходный большой двоичный объект на уровне архива, восстановленный большой двоичный объект на горячем уровне и большой двоичный объект журнала, написанный обработчиком событий.

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

Совет

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

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

См. также