Samouczek: wdrażanie usługi Azure Functions jako modułów usługi IoT Edge

Dotyczy:Znacznik wyboru usługi IoT Edge 1.5 IoT Edge 1.5 Znacznik wyboru usługi IoT Edge 1.4 IoT Edge 1.4

Ważne

Obsługiwane są wersje usługi IoT Edge 1.5 LTS i IoT Edge 1.4 LTS. Usługa IoT Edge 1.4 LTS kończy się 12 listopada 2024 r. Jeśli korzystasz z wcześniejszej wersji, zobacz aktualizację Azure IoT Edge.

Możesz użyć usługi Azure Functions, aby wdrożyć kod implementujący Twoją logikę biznesową bezpośrednio na urządzeniach usługi Azure IoT Edge. Ten samouczek przeprowadzi Cię przez proces tworzenia i wdrażania funkcji platformy Azure, która filtruje dane czujników na symulowanym urządzeniu usługi IoT Edge. Używasz symulowanego urządzenia usługi IoT Edge utworzonego w przewodnikach Szybki start. Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Tworzenie funkcji platformy Azure za pomocą programu Visual Studio Code.
  • Użyj programu Visual Studio Code i platformy Docker, aby utworzyć obraz platformy Docker i opublikować go w rejestrze kontenerów.
  • Wdrażanie modułu z rejestru kontenerów na urządzeniu usługi IoT Edge.
  • Wyświetlanie filtrowanych danych.

Diagram architektury funkcji przedstawiający sposób przygotowania i wdrożenia modułu funkcji.

Funkcja platformy Azure utworzona w tym samouczku filtruje dane temperatury generowane przez urządzenie. Funkcja wysyła komunikaty nadrzędne do usługi Azure IoT Hub tylko wtedy, gdy temperatura przekroczy określony próg.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Przed rozpoczęciem tego samouczka wykonaj samouczek konfigurowania środowiska projektowego na potrzeby tworzenia kontenerów systemu Linux: opracowywanie modułów usługi Azure IoT Edge przy użyciu programu Visual Studio Code. Po ukończeniu tego samouczka należy spełnić następujące wymagania wstępne:

Aby utworzyć moduł usługi IoT Edge za pomocą usługi Azure Functions, zainstaluj dodatkowe wymagania wstępne na maszynie dewelopera:

Tworzenie projektu funkcji

Usługa Azure IoT Edge dla programu Visual Studio Code zainstalowana w wymaganiach wstępnych zapewnia możliwości zarządzania, a także niektóre szablony kodu. W tej sekcji użyjesz programu Visual Studio Code do utworzenia rozwiązania usługi IoT Edge zawierającego funkcję platformy Azure.

Tworzenie nowego projektu

Wykonaj następujące kroki, aby utworzyć szablon rozwiązania funkcji języka C#, który można dostosować.

  1. Otwórz program Visual Studio Code na maszynie deweloperskiej.

  2. Otwórz paletę poleceń programu Visual Studio Code, wybierając pozycję Wyświetl>paletę poleceń.

  3. W palecie poleceń dodaj i uruchom polecenie Azure IoT Edge: nowe rozwiązanie usługi IoT Edge. Postępuj zgodnie z następującymi monitami w palecie poleceń, aby utworzyć rozwiązanie:

    • Wybierz folder: wybierz lokalizację na komputerze deweloperskim dla programu Visual Studio Code, aby utworzyć pliki rozwiązania.
    • Podaj nazwę rozwiązania: dodaj opisową nazwę rozwiązania, taką jak FunctionSolution lub zaakceptuj wartość domyślną.|
    • Wybierz szablon modułu: wybierz pozycję Azure Functions — C#.
    • Podaj nazwę modułu | Nadaj modułowi nazwę CSharpFunction.
    • Podaj repozytorium obrazów platformy Docker dla modułu. Repozytorium obrazów zawiera nazwę rejestru kontenerów oraz nazwę obrazu kontenera. Obraz kontenera jest wstępnie wypełniony z ostatniego kroku. Zastąp wartość localhost:5000 wartością serwera logowania z rejestru kontenerów platformy Azure. Serwer logowania można pobrać ze strony Przegląd rejestru kontenerów w witrynie Azure Portal. Ostateczny ciąg będzie wyglądał następująco: <nazwa rejestru>.azurecr.io/csharpfunction.

    Zrzut ekranu przedstawiający miejsce dodawania nazwy repozytorium obrazów platformy Docker w programie Visual Studio Code.

Dodawanie poświadczeń rejestru

Plik środowiska rozwiązania przechowuje poświadczenia dla rejestru kontenerów i udostępnia je środowisku uruchomieniowemu usługi IoT Edge. Środowisko uruchomieniowe wymaga tych poświadczeń, aby ściągnąć prywatne obrazy na urządzenie usługi IoT Edge.

Rozszerzenie usługi IoT Edge w programie Visual Studio Code próbuje ściągnąć poświadczenia rejestru kontenerów z platformy Azure i wypełnić je w pliku środowiska. Sprawdź, czy poświadczenia znajdują się już w pliku. Jeśli nie, dodaj je teraz:

  1. W eksploratorze programu Visual Studio Code otwórz .env plik.
  2. Zaktualizuj pola, używając nazwy użytkownika i hasła, które zostały skopiowane z usługi Azure Container Registry. Możesz je znaleźć ponownie, przechodząc do rejestru kontenerów na platformie Azure i przeglądając stronę kluczy Ustawienia> Access.
  3. Zapisz ten plik.

Uwaga

W tym samouczku są używane poświadczenia logowania administratora dla usługi Azure Container Registry, które są wygodne w scenariuszach tworzenia i testowania. Gdy wszystko będzie gotowe do scenariuszy produkcyjnych, zalecamy opcję uwierzytelniania z najmniejszymi uprawnieniami, taką jak jednostki usługi. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do rejestru kontenerów.

Ustaw architekturę docelową na AMD64

Uruchamianie modułów usługi Azure Functions w usłudze IoT Edge jest obsługiwane tylko w kontenerach opartych na systemie Linux AMD64. Domyślna architektura docelowa programu Visual Studio Code to Linux AMD64, ale w tym miejscu ustawimy ją jawnie na linux AMD64.

  1. Otwórz paletę poleceń i wyszukaj usługę Azure IoT Edge: ustaw domyślną platformę docelową rozwiązania Edge.

  2. W palecie poleceń wybierz architekturę docelową AMD64 z listy opcji.

Aktualizowanie modułu przy użyciu kodu niestandardowego

Dodajmy dodatkowy kod, aby moduł CSharpFunction przetwarzał komunikaty na brzegu przed przekazaniem ich do usługi IoT Hub.

  1. W eksploratorze programu Visual Studio Code otwórz moduły >CSharpFunction>CSharpFunction.cs.

  2. Zastąp zawartość pliku CSharpFunction.cs następującym kodem. Ten kod odbiera dane telemetrii dotyczące temperatury otoczenia i maszyny oraz przesyła dalej komunikat do usługi IoT Hub tylko wtedy, gdy temperatura maszyny przekracza zdefiniowaną wartość progową.

    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. Zapisz plik.

Kompilowanie i wypychanie rozwiązania usługi IoT Edge

W poprzedniej sekcji utworzono rozwiązanie usługi IoT Edge i zmodyfikowano polecenie CSharpFunction, aby odfiltrować komunikaty z zgłaszanymi temperaturami maszyny poniżej akceptowalnego progu. Teraz należy skompilować to rozwiązanie jako obraz kontenera i wypchnąć go do rejestru kontenerów.

  1. Otwórz zintegrowany terminal programu Visual Studio Code, wybierając pozycję Wyświetl>terminal.

  2. Zaloguj się do platformy Docker, wprowadzając następujące polecenie w terminalu. Zaloguj się przy użyciu nazwy użytkownika, hasła i serwera logowania z rejestru kontenerów platformy Azure. Te wartości można pobrać z sekcji Klucze dostępu rejestru w witrynie Azure Portal.

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

    Może zostać wyświetlone ostrzeżenie o zabezpieczeniach, które zaleca użycie polecenia --password-stdin. Chociaż najlepsze rozwiązanie jest zalecane w przypadku scenariuszy produkcyjnych, wykracza poza zakres tego samouczka. Aby uzyskać więcej informacji, zobacz dokumentację logowania platformy Docker.

  3. W eksploratorze programu Visual Studio Code kliknij prawym przyciskiem myszy plik deployment.template.json i wybierz polecenie Kompiluj i wypychaj rozwiązanie usługi IoT Edge.

    Polecenie kompilacji i wypychania uruchamia trzy operacje. Najpierw tworzy nowy folder w rozwiązaniu o nazwie config , który zawiera pełny manifest wdrożenia, który jest zbudowany z informacji w szablonie wdrożenia i innych plikach rozwiązań. Po drugie uruchamia docker build polecenie w celu skompilowania obrazu kontenera na podstawie odpowiedniego pliku dockerfile dla architektury docelowej. Następnie zostanie uruchomione polecenie docker push , aby wypchnąć repozytorium obrazów do rejestru kontenerów.

    Ten proces może potrwać kilka minut po raz pierwszy, ale jest szybszy przy następnym uruchomieniu poleceń.

Wyświetlanie obrazu kontenera

Program Visual Studio Code generuje komunikat o powodzeniu po wypchnięciu obrazu kontenera do rejestru kontenerów. Jeśli chcesz osobiście potwierdzić pomyślne zakończenie operacji, możesz wyświetlić obraz w rejestrze.

  1. W witrynie Azure Portal przejdź do rejestru kontenerów platformy Azure.
  2. Wybierz pozycję Repozytoria usług>.
  3. Na liście powinno zostać wyświetlone repozytorium csharpfunction. Wybierz to repozytorium, aby wyświetlić więcej szczegółów.
  4. W sekcji Tagi powinien zostać wyświetlony tag 0.0.1-amd64. Ten tag odzwierciedla wersję i platformę skompilowanego obrazu. Te wartości są ustawiane w pliku module.json w folderze CSharpFunction.

Wdrażanie i uruchamianie rozwiązania

Za pomocą witryny Azure Portal możesz wdrożyć moduł funkcji na urządzeniu usługi IoT Edge, tak jak w przewodniku Szybki start. Możesz również wdrażać i monitorować moduły z poziomu programu Visual Studio Code. W poniższych sekcjach są używane usługi Azure IoT Edge i IoT Hub dla programu Visual Studio Code wymienione w wymaganiach wstępnych. Zainstaluj rozszerzenia teraz, jeśli jeszcze tego nie zrobiono.

  1. W eksploratorze programu Visual Studio Code w sekcji Azure IoT Hub rozwiń węzeł Urządzenia , aby wyświetlić listę urządzeń IoT.

  2. Kliknij prawym przyciskiem myszy nazwę urządzenia usługi IoT Edge, a następnie wybierz pozycję Utwórz wdrożenie dla pojedynczego urządzenia.

  3. Przejdź do folderu rozwiązania, który zawiera moduł CSharpFunction. Otwórz folder config, wybierz plik deployment.amd64.json , a następnie wybierz pozycję Wybierz manifest wdrożenia usługi Edge.

  4. W obszarze urządzenia rozwiń węzeł Moduły , aby wyświetlić listę wdrożonych i uruchomionych modułów. Kliknij przycisk Odśwież. Powinna zostać wyświetlona nowa funkcja CSharpFunction uruchomiona wraz z modułem SimulatedTemperatureSensor oraz $edgeAgent i $edgeHub.

    Wyświetlenie nowych modułów może zająć kilka chwil. Urządzenie usługi IoT Edge musi pobrać nowe informacje o wdrożeniu z usługi IoT Hub, uruchomić nowe kontenery i zgłosić stan usłudze IoT Hub.

    Zrzut ekranu przedstawiający sposób wyświetlania wdrożonych modułów w programie Visual Studio Code.

Wyświetlanie wygenerowanych danych

Wszystkie komunikaty docierające do centrum IoT hub ze wszystkich urządzeń można wyświetlić, uruchamiając usługę Azure IoT Hub: Rozpocznij monitorowanie wbudowanego punktu końcowego zdarzeń w palecie poleceń. Aby zatrzymać monitorowanie komunikatów, uruchom polecenie Azure IoT Hub: Zatrzymaj monitorowanie wbudowanego punktu końcowego zdarzeń w palecie poleceń.

Możesz również filtrować widok, aby wyświetlać wszystkie komunikaty przychodzące do centrum IoT Hub z określonego urządzenia. Kliknij prawym przyciskiem myszy urządzenie w sekcji Urządzenia usługi Azure IoT Hub>w eksploratorze programu Visual Studio Code i wybierz pozycję Rozpocznij monitorowanie wbudowanego punktu końcowego zdarzeń.

Czyszczenie zasobów

Jeśli zamierzasz przejść do kolejnego zalecanego artykułu, możesz zachować utworzone zasoby oraz konfiguracje i użyć ich ponownie. Możesz także nadal używać tego samego urządzenia usługi IoT Edge jako urządzenia testowego.

W przeciwnym razie możesz usunąć konfigurację lokalną i zasoby platformy Azure utworzone podczas pracy z tym artykułem, aby uniknąć naliczania opłat.

Usuwanie zasobów platformy Azure

Usuwanie zasobów i grup zasobów platformy Azure jest nieodwracalne. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub niewłaściwej grupy zasobów. Jeśli centrum IoT zostało utworzone w istniejącej grupie zasobów zawierającej zasoby, które chcesz zachować, usuń tylko sam zasób centrum IoT, a nie grupę zasobów.

Aby usunąć zasoby:

  1. Zaloguj się do witryny Azure Portal, a następnie wybierz pozycję Grupy zasobów.

  2. Wybierz nazwę grupy zasobów, która zawiera zasoby testowe usługi IoT Edge.

  3. Przejrzyj listę zasobów zawartych w grupie zasobów. Jeśli chcesz usunąć je wszystkie, możesz wybrać pozycję Usuń grupę zasobów. Jeśli chcesz usunąć tylko niektóre z nich, możesz kliknąć poszczególne zasoby, aby usunąć je pojedynczo.

Następne kroki

W tym samouczku utworzono moduł funkcji platformy Azure z kodem umożliwiającym filtrowanie nieprzetworzonych danych generowanych przez urządzenie usługi IoT Edge.

Kontynuuj pracę z kolejnymi samouczkami, aby dowiedzieć się o innych metodach, za pomocą których usługa Azure IoT Edge może ułatwiać przekształcanie danych w analizy biznesowe na brzegu sieci.