Руководство по развертыванию Функции Azure в виде модулей IoT Edge

Область применения:IoT Edge 1.5 проверка mark IoT Edge 1.5 IoT Edge 1.4 проверка mark IoT Edge 1.4

Внимание

Поддерживаются выпуски IoT Edge 1.5 LTS и IoT Edge 1.4 LTS. IoT Edge 1.4 LTS заканчивается жизнью 12 ноября 2024 года. Если вы используете более ранний выпуск, см. статью Обновление IoT Edge.

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

  • Использование Visual Studio Code для создания Функции Azure.
  • Используйте Visual Studio Code и Docker, чтобы создать образ Docker и опубликовать его в реестре контейнеров.
  • Развертывать модуль из реестра контейнеров на устройстве IoT Edge.
  • Просматривать отфильтрованные данные.

Схема архитектуры функции, показывающая этап и развертывание модуля функции.

Функция Azure, создание которой описано в этом руководстве, фильтрует данные температуры, созданные устройством. Она отправляет сообщения в вышестоящий Центр Интернета вещей Azure, когда температура превышает заданное пороговое значение.

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

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

Перед началом работы с этим руководством выполните инструкции по настройке среды разработки для разработки контейнеров Linux: разработка модулей Azure IoT Edge с помощью Visual Studio Code. После работы с ним у вас должны быть готовы все необходимые компоненты:

Чтобы разработать модуль IoT Edge с Функции Azure, установите дополнительные предварительные требования на компьютере разработки:

Создание проекта функции

Azure IoT Edge для Visual Studio Code, установленный в предварительных требованиях, предоставляет возможности управления, а также некоторые шаблоны кода. В этом разделе Visual Studio Code используется для создания решения IoT Edge, содержащего Функцию Azure.

Создание нового проекта

Выполните следующие действия, чтобы создать шаблон решения функции C#, который можно настроить.

  1. Откройте Visual Studio Code на компьютере для разработки.

  2. Откройте палитру команд Visual Studio Code, выбрав "Просмотреть>палитру команд".

  3. В палитре команд добавьте и запустите команду Azure IoT Edge: новое решение IoT Edge. Выполните следующие запросы в палитре команд, чтобы создать решение:

    • Выберите папку: выберите расположение на компьютере разработки для Visual Studio Code, чтобы создать файлы решения.
    • Укажите имя решения: добавьте описательное имя решения, например FunctionSolution, или примите значение по умолчанию.|
    • Выберите шаблон модуля: выберите Функции Azure — C#.
    • Укажите имя модуля | Присвойте модулю CSharpFunction.
    • Предоставьте репозиторий образов Docker для модуля. Репозиторий изображений включает в себя имя реестра контейнеров и имя образа контейнера. Образ контейнера предварительно заполняется на последнем шаге. Замените localhost:5000 значением сервера входа из реестра контейнеров Azure. Сервер входа можно получить на странице обзора реестра контейнеров в портал Azure. Последняя строка выглядит следующим образом: <имя реестра>.azurecr.io/csharpfunction.

    Снимок экрана: добавление имени репозитория образов Docker в Visual Studio Code.

Добавление учетных данных реестра

Файл среды решения хранит учетные данные для реестра контейнеров и предоставляет им общий доступ к среде выполнения IoT Edge. Среда выполнения должна использовать эти учетные данные для извлечения частных образов на устройство IoT Edge.

Расширение IoT Edge в Visual Studio Code пытается извлечь учетные данные реестра контейнеров из Azure и заполнить их в файле среды. Проверьте, уже ли ваши учетные данные находятся в файле. В противном случае добавьте их:

  1. Откройте файл в обозревателе .env Visual Studio Code.
  2. Обновите поля с именем пользователя и паролем, скопированные из своего реестра контейнера Azure. Их можно найти снова, перейдя в реестр контейнеров в Azure и выбрав страницу ключей Параметры> Access.
  3. Сохраните этот файл.

Примечание.

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

Установка целевой архитектуры в AMD64

Запуск модулей Функции Azure в IoT Edge поддерживается только в контейнерах на основе Linux AMD64. Целевая архитектура по умолчанию для Visual Studio Code — Linux AMD64, но мы явно задали ему значение Linux AMD64 здесь.

  1. Откройте палитру команд и найдите Azure IoT Edge: задайте целевую платформу по умолчанию для решения Edge.

  2. В палитре команд выберите целевую архитектуру AMD64 из списка параметров.

Обновление модуля с помощью пользовательского кода

Давайте добавим дополнительный код, чтобы модуль CSharpFunction обрабатывал сообщения на границе перед пересылкой их в Центр Интернета вещей.

  1. В обозревателе Visual Studio Code откройте модули>CSharpFunction>CSharpFunction.cs.

  2. Измените содержимое файла CSharpFunction.cs на код, приведенный ниже. Этот код получает данные телеметрии о температуре компьютера и окружающей среды и передает сообщение в Центр Интернета вещей, только если температура компьютера превышает указанный порог.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.EdgeHub;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    
    namespace Functions.Samples
    {
        public static class CSharpFunction
        {
            [FunctionName("CSharpFunction")]
            public static async Task FilterMessageAndSendMessage(
                [EdgeHubTrigger("input1")] Message messageReceived,
                [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output,
                ILogger logger)
            {
                const int temperatureThreshold = 20;
                byte[] messageBytes = messageReceived.GetBytes();
                var messageString = System.Text.Encoding.UTF8.GetString(messageBytes);
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    logger.LogInformation("Info: Received one non-empty message");
                    // Get the body of the message and deserialize it.
                    var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
                    if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
                    {
                        // Send the message to the output as the temperature value is greater than the threshold.
                        using (var filteredMessage = new Message(messageBytes))
                        {
                             // Copy the properties of the original message into the new Message object.
                             foreach (KeyValuePair<string, string> prop in messageReceived.Properties)
                             {filteredMessage.Properties.Add(prop.Key, prop.Value);}
                             // Add a new property to the message to indicate it is an alert.
                             filteredMessage.Properties.Add("MessageType", "Alert");
                             // Send the message.
                             await output.AddAsync(filteredMessage);
                             logger.LogInformation("Info: Received and transferred a message with temperature above the threshold");
                        }
                    }
                }
            }
        }
        //Define the expected schema for the body of incoming messages.
        class MessageBody
        {
            public Machine machine {get; set;}
            public Ambient ambient {get; set;}
            public string timeCreated {get; set;}
        }
        class Machine
        {
            public double temperature {get; set;}
            public double pressure {get; set;}
        }
        class Ambient
        {
            public double temperature {get; set;}
            public int humidity {get; set;}
        }
    }
    
  3. Сохраните файл.

Создание и отправка решения IoT Edge

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

  1. В Visual Studio Code откройте интегрированный терминал, последовательно выбрав элементы Вид>Терминал.

  2. Войдите в Docker. Для этого введите представленную ниже команду в окне терминала. Выполните вход в систему, используя имя пользователя, пароль и сервер входа из реестра контейнеров Azure. Вы можете получить эти значения в разделе Ключи доступа в разделе реестра на портале Azure.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Возможно, появится предупреждение системы безопасности, в котором рекомендуется использовать --password-stdin. Для рабочих сценариев это лучшая методика, но мы не будем рассматривать ее в этом учебнике. Дополнительные сведения см. в описании команды docker login в справочнике.

  3. В обозревателе Visual Studio Code щелкните правой кнопкой мыши файл deployment.template.json и выберите Build and Push IoT Edge solution (Создать и отправить решение IoT Edge).

    Эта команда сборки и отправки позволяет запустить три операции. Во-первых, в решении создается папка с именем config, которая содержит полный манифест развертывания на основе информации из шаблона развертывания и других файлов решения. Во-вторых, выполняется docker build для сборки образа контейнера на основе подходящего файла dockerfile для целевой архитектуры. В-третьих, выполняется docker push для отправки образа в реестр контейнеров.

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

Просмотр образа контейнера

Visual Studio Code выводит сообщение об успешном завершении, когда образ контейнера передается в ваш реестр контейнеров. Если требуется лично убедиться в успешности выполнения, можно просмотреть образ в реестре.

  1. Перейдите в реестр контейнеров на портале Azure.
  2. Выберите репозитории служб>.
  3. Репозиторий csharpfunction отобразится в списке. Чтобы просмотреть дополнительные сведения о репозитории, выберите его.
  4. В разделе Теги должен отобразиться тег 0.0.1-amd64. Он указывает версию и платформу созданного образа. Эти значения устанавливаются в файле module.json в папке CSharpFunction.

Развертывание и запуск решения

Вы можете использовать портал Azure для развертывания модуля функции на устройстве IoT Edge, как и в кратком руководстве. Также в Visual Studio Code можно развертывать модули и проводить их мониторинг. В следующих разделах используются Azure IoT Edge и Центр Интернета вещей для Visual Studio Code, перечисленные в предварительных требованиях. Установите расширения, если вы еще не сделали этого.

  1. В обозревателе Visual Studio Code в разделе Центр Интернета вещей Azure разверните меню Устройства, чтобы отобразить список устройств Интернета вещей.

  2. Щелкните имя устройства IoT Edge правой кнопкой мыши, а затем выберите Create Deployment for Single Device (Создать развертывание для одного устройства).

  3. Перейдите в папку решения, содержащую CSharpFunction. Откройте папку конфигурации, выберите файл deployment.amd64.json и затем Select Edge Deployment Manifest (Выбрать манифест развертывания Edge).

  4. Разверните меню Модули для своего устройства, чтобы просмотреть список развернутых и запущенных модулей. Нажмите кнопку "Обновить". Появится новый запущенный модуль CSharpFunction, модуль SimulatedTemperatureSensor, а также $edgeAgent и $edgeHub.

    Может потребоваться несколько минут, чтобы новые модули отобразились. Устройство IoT Edge должно получить сведения о новом развертывании из Центра Интернета вещей, запустить новые контейнеры и затем сообщить о своем состоянии в Центр Интернета вещей.

    Снимок экрана: просмотр развернутых модулей в Visual Studio Code.

Просмотр созданных данных

Все сообщения, поступающие в Центр Интернета вещей, отображаются на всех устройствах, выполнив Центр Интернета вещей Azure: запуск встроенной конечной точки события в палитре команд. Чтобы остановить мониторинг сообщений, выполните команду Центр Интернета вещей Azure: остановить мониторинг встроенной конечной точки события в палитре команд.

Также можно отфильтровать представления, чтобы увидеть все сообщения, поступающие в Центр Интернета вещей с определенного устройства. Щелкните правой кнопкой мыши устройство в разделе Центр Интернета вещей Azure> Devices обозревателя Visual Studio Code и выберите "Начать мониторинг встроенной конечной точки события".

Очистка ресурсов

Если вы планируете перейти к следующей рекомендуемой статье, можно сохранить созданные и повторно используемые ресурсы и конфигурации. Это же устройство IoT Edge также можно использовать в качестве тестового устройства.

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

Удаление ресурсов Azure

Удаление ресурсов и групп ресурсов Azure является необратимым. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали центр Интернета вещей в группе ресурсов, содержащей ресурсы, которые нужно сохранить, удалите только ресурс Центра Интернета вещей, не удаляя всю группу ресурсов.

Удаление ресурсов:

  1. Войдите на портал Azure и щелкните Группы ресурсов.

  2. Выберите группу ресурсов, содержащую тестовые ресурсы IoT Edge.

  3. Просмотрите список ресурсов, содержащихся в группе ресурсов. Если вы хотите удалить их все, щелкните Удалить группу ресурсов. Если вы хотите удалить только некоторые из них, щелкните нужные ресурсы отдельно.

Следующие шаги

Из этого руководства вы узнали, как создать модуль Функции Azure, содержащий код для фильтрации необработанных данных, которые были созданы устройством IoT Edge.

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