Freigeben über


Tutorial: Bereitstellen von Azure-Funktionen als IoT Edge-Module

Gilt für:Häkchen für IoT Edge 1.5 IoT Edge 1.5

Wichtig

IoT Edge 1.5 LTS ist das unterstützte Release. IoT Edge 1.4 LTS wurde am 12. November 2024 eingestellt. Wenn Sie ein früheres Release verwenden, finden Sie weitere Informationen unter Aktualisieren von IoT Edge.

Verwenden Sie Azure Functions, um Code bereitzustellen, der Ihre Geschäftslogik direkt auf Ihren Azure IoT Edge-Geräten ausführt. In diesem Lernprogramm erfahren Sie, wie Sie eine Azure-Funktion erstellen und bereitstellen, die Sensordaten auf einem simulierten IoT Edge-Gerät filtert. Verwenden Sie das simulierte IoT Edge-Gerät, das Sie in den Schnellstarts erstellt haben. In diesem Tutorial lernen Sie Folgendes:

  • Erstellen einer Azure-Funktion mit Visual Studio Code
  • Verwenden von Visual Studio Code und Docker zum Erstellen eines Docker-Images und Veröffentlichen in einer Containerregistrierung
  • Stellen Sie das Modul von der Container-Registry auf Ihrem IoT Edge-Gerät bereit
  • Gefilterte Daten anzeigen

Diagramm, das die Funktionsarchitektur zeigt, einschließlich wie man ein Funktionsmodul vorbereitet und bereitstellt.

Die in diesem Lernprogramm erstellte Azure-Funktion filtert Temperaturdaten, die von Ihrem Gerät generiert werden. Die Funktion sendet nur Nachrichten an Azure IoT Hub, wenn die Temperatur über einem angegebenen Schwellenwert liegt.

Wenn Sie nicht über ein Azure-Konto verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.

Voraussetzungen

Bevor Sie dieses Lernprogramm starten, folgen Sie dem Lernprogramm zum Einrichten Ihrer Entwicklungsumgebung für die Linux-Containerentwicklung: Entwickeln von Azure IoT Edge-Modulen mit Visual Studio Code. Wenn Sie fertig sind, haben Sie die folgenden Voraussetzungen:

Um ein IoT Edge-Modul mit Azure Functions zu entwickeln, installieren Sie diese zusätzlichen Voraussetzungen auf Ihrem Entwicklungscomputer:

Erstellen eines Funktionsprojekts

Azure IoT Edge für Visual Studio Code bietet Ihnen Verwaltungsfunktionen und Codevorlagen. In diesem Abschnitt verwenden Sie Visual Studio Code, um eine IoT Edge-Lösung mit einer Azure-Funktion zu erstellen.

Erstellen eines neuen Projekts

Führen Sie die folgenden Schritte aus, um eine anpassbare C#-Funktionslösungsvorlage zu erstellen.

  1. Öffnen Sie Visual Studio Code auf Ihrem Entwicklungscomputer.

  2. Öffnen Sie die Befehlspalette in Visual Studio Code, indem Sie Ansicht>Befehlspalette auswählen.

  3. Fügen Sie der Befehlspalette den Befehl Azure IoT Edge: New IoT Edge Solution hinzu, und führen Sie ihn aus. Folgen Sie diesen Anweisungen in der Befehlspalette, um Ihre Projektmappe zu erstellen:

    • Ordner auswählen: Wählen Sie den Speicherort auf Ihrem Entwicklungscomputer aus, an dem Visual Studio Code die Projektmappendateien erstellen soll.
    • Lösungsnamen angeben: Geben Sie für Ihre Lösung einen aussagekräftigen Namen ein (beispielsweise FunctionSolution), oder übernehmen Sie den Standardnamen.|
    • Modulvorlage auswählen: Wählen Sie Azure Functions – C# aus.
    • Modulnamen angeben: Nennen Sie Ihr Modul CSharpFunction.
    • Geben Sie eine Docker-Imagerepository für das Modul an. Ein Imagerepository enthält den Namen Ihrer Containerregistrierung und den Namen Ihres Containerimages. Ihr Containerimage wird aus dem vorherigen Schritt übernommen. Ersetzen Sie localhost:5000 durch den Wert für Anmeldeserver aus Ihrer Azure-Containerregistrierung. Den Anmeldeserver können Sie im Azure-Portal auf der Seite Übersicht Ihrer Containerregistrierung ermitteln. Die endgültige Zeichenfolge sieht wie folgt aus: <Registrierungsname>.azurecr.io/csharpfunction.

    Screenshot, der zeigt, wo Sie den Namen des Docker-Imagerepositorys in Visual Studio Code hinzufügen.

Hinzufügen von Registrierungsanmeldeinformationen

Die Umgebungsdatei in Ihrer Lösung speichert die Anmeldeinformationen für Ihre Containerregistrierung und teilt sie mit der IoT Edge-Laufzeit. Die Runtime benötigt diese Anmeldeinformationen, um Ihre privaten Images per Pull auf Ihr IoT Edge-Gerät zu übertragen.

Die IoT Edge-Erweiterung in Visual Studio Code versucht, Ihre Anmeldeinformationen für die Containerregistrierung per Pullvorgang aus Azure abzurufen und in die Umgebungsdatei einzufügen. Überprüfen Sie, ob Sich Ihre Anmeldeinformationen bereits in der Datei befinden. Fügen Sie sie jetzt hinzu, wenn dies nicht der Fall ist:

  1. Öffnen Sie die .env-Datei im Visual Studio Code-Explorer.
  2. Aktualisieren Sie die Felder mit den Benutzernamen - und Kennwortwerten , die Sie aus Ihrer Azure-Containerregistrierung kopiert haben. Um sie erneut zu finden, wechseln Sie zu Ihrer Containerregistrierung in Azure, und suchen Sie auf der Seite "Zugriffstasteneinstellungen>".
  3. Speichern Sie diese Datei.

Hinweis

In diesem Tutorial werden die Administratoranmeldeinformationen für die Azure Container Registry verwendet, die für Entwicklungs- und Testszenarien geeignet sind. Verwenden Sie für die Produktion eine Authentifizierungsoption mit minimalen Rechten wie Service-Prinzipale. Weitere Informationen finden Sie unter Verwalten des Zugriffs auf die Containerregistrierung.

Festlegen der Zielarchitektur auf AMD64

Azure Functions-Module auf IoT Edge werden nur für Linux AMD64-basierte Container unterstützt. Die Standardzielarchitektur für Visual Studio Code ist Linux AMD64, aber Sie legen sie hier explizit auf Linux AMD64 fest.

  1. Öffnen Sie die Befehlspalette, und suchen Sie nach Azure IoT Edge: Standardzielplattform für Edge-Projektmappe festlegen.

  2. Wählen Sie in der Befehlspalette die Zielarchitektur AMD64 aus der Optionsliste aus.

Aktualisieren des Moduls mit benutzerdefiniertem Code

Fügen Sie Code hinzu, damit Ihr CSharpFunction-Modul Nachrichten am Edge verarbeitet, bevor sie an IoT Hub weitergeleitet werden.

  1. Öffnen Sie im Visual Studio Code-Explorer Module>CSharpFunction>CSharpFunction.cs.

  2. Ersetzen Sie den Inhalt der Datei CSharpFunction.cs durch den folgenden Code. Dieser Code empfängt Telemetrie zu Umgebungs- und Maschinentemperatur und leitet die Nachricht nur dann an IoT Hub weiter, wenn die Computertemperatur über einem definierten Schwellenwert liegt.

    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. Speichern Sie die Datei .

Erstellen und Pushen Ihrer IoT Edge-Projektmappe

Im vorherigen Abschnitt haben Sie eine IoT Edge-Lösung erstellt und die CSharpFunction so geändert, dass Nachrichten mit gemeldeten Computertemperaturen unter dem zulässigen Schwellenwert gefiltert werden. Erstellen Sie nun die Lösung als Containerimage, und übertragen Sie sie an Ihre Containerregistrierung.

  1. Öffnen Sie das integrierte Terminal von Visual Studio Code. Wählen Sie Terminal anzeigen> aus.

  2. Melden Sie sich beim Docker im Terminal an. Verwenden Sie den Benutzernamen, das Kennwort und den Anmeldeserver aus Ihrer Azure-Containerregistrierung. Rufen Sie diese Werte aus dem Abschnitt "Access Keys " Ihrer Registrierung im Azure-Portal ab.

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

    Sie können eine Sicherheitswarnung erhalten, die die Verwendung von --password-stdin empfiehlt. Diese bewährte Methode wird für Produktionsszenarien empfohlen, aber sie ist nicht Gegenstand dieses Tutorials. Weitere Informationen finden Sie in der docker login-Referenz.

  3. Klicken Sie im Visual Studio Code-Explorer mit der rechten Maustaste auf die deployment.template.json Datei, und wählen Sie dann "Build" und "Push IoT Edge Solution" aus.

    Der Befehl zum Erstellen und Übertragen per Push startet drei Vorgänge. Zunächst wird ein neuer Ordner in der Lösung namens Config erstellt, der über das vollständige Bereitstellungsmanifest verfügt, das aus der Bereitstellungsvorlage und anderen Lösungsdateien erstellt wird. Anschließend wird docker build zum Erstellen des Containerimages ausgeführt, das auf der entsprechenden Dockerfile für Ihre Zielarchitektur basiert. Und schließlich führt er docker push aus, um das Imagerepository per Push in Ihre Containerregistrierung zu übertragen.

    Dieser Vorgang kann mehrere Minuten dauern, aber es ist schneller, wenn Sie die Befehle das nächste Mal ausführen.

Anzeigen des Containerimages

Visual Studio Code zeigt eine Erfolgsmeldung an, wenn Ihr Containerimage an die Containerregistrierung übertragen wird. Um den Vorgang zu bestätigen, sehen Sie sich das Bild im Registry an.

  1. Wechseln Sie im Azure-Portal zu Ihrer Azure-Containerregistrierung.
  2. Wählen SieDienste>Repositorys aus.
  3. Das Csharpfunction-Repository wird in der Liste angezeigt. Wählen Sie dieses Repository aus, um weitere Details anzuzeigen.
  4. Im Abschnitt Tags siehst du das Tag 0.0.1-amd64. Dieses Tag zeigt die Version und Plattform des von Ihnen erstellten Images an. Diese Werte werden in der module.json Datei im Ordner "CSharpFunction " festgelegt.

Bereitstellen und Ausführen der Projektmappe

Verwenden Sie das Azure-Portal, um Ihr Funktionsmodul wie in der Schnellstartanleitung auf einem IoT Edge-Gerät bereitzustellen. Sie können Module auch aus Visual Studio Code bereitstellen und überwachen. In den folgenden Abschnitten werden die in den Voraussetzungen aufgeführten Erweiterungen Azure IoT Edge und IoT Hub für Visual Studio Code verwendet. Installieren Sie die Erweiterungen jetzt, wenn Sie dies noch nicht getan haben.

  1. Erweitern Sie im Visual Studio Code-Explorer im Abschnitt Azure IoT Hub die Option Geräte, um die Liste der IoT-Geräte anzuzeigen.

  2. Klicken Sie mit der rechten Maustaste auf den Namen Ihres IoT Edge-Geräts, und wählen Sie dann Create Deployment for Single Device (Bereitstellung für einzelnes Gerät erstellen) aus.

  3. Wechseln Sie zum Lösungsordner mit der CSharpFunction. Öffnen Sie den Konfigurationsordner, und wählen Sie die Datei deployment.amd64.json und anschließend Select Edge Deployment Manifest (Edge-Bereitstellungsmanifest auswählen) aus.

  4. Erweitern Sie unter Ihrem Gerät den Bereich Module, um eine Liste mit bereitgestellten und ausgeführten Modulen anzuzeigen. Klicken Sie auf die Schaltfläche Aktualisieren. Sie können die neue CSharpFunction zusammen mit dem SimulatedTemperatureSensor-Modul, $edgeAgent und $edgeHub laufen sehen.

    Es kann einige Momente dauern, bis die neuen Module angezeigt werden. Das IoT Edge-Gerät ruft seine neuen Bereitstellungsinformationen aus IoT Hub ab, startet die neuen Container und meldet dann den Status zurück an IoT Hub.

    Screenshot, der zeigt, wie Sie bereitgestellte Module in Visual Studio Code anzeigen.

Anzeigen der generierten Daten

Zeigen Sie alle Nachrichten an, die von Ihren Geräten aus an Ihren IoT-Hub gelangen, indem Sie Azure IoT Hub ausführen: Starten sie den integrierten Ereignisendpunkt der Überwachung in der Befehlspalette. Um die Überwachung von Nachrichten zu beenden, wählen Sie Azure IoT Hub: Überwachung des integrierten Ereignisendpunkts beenden in der Befehlspalette.

Um die Ansicht zu filtern und Nachrichten von einem bestimmten Gerät zu sehen, klicken Sie mit der rechten Maustaste auf das Gerät im Abschnitt "Azure IoT Hub>Devices" des Visual Studio Code-Explorers und wählen Sie "Überwachung des integrierten Ereignisendpunkts starten" aus.

Bereinigen von Ressourcen

Wenn Sie den nächsten empfohlenen Artikel fortsetzen möchten, behalten Sie die von Ihnen erstellten Ressourcen und Konfigurationen bei, und verwenden Sie sie wieder. Sie können auch dasselbe IoT Edge-Gerät als Testgerät weiter nutzen.

Löschen Sie andernfalls die lokalen Konfigurationen und die Azure-Ressourcen, die Sie in diesem Artikel erstellt haben, um Gebühren zu vermeiden.

Löschen von Azure-Ressourcen

Das Löschen von Azure-Ressourcen und -Ressourcengruppen kann nicht rückgängig gemacht werden. Achten Sie daher darauf, dass Sie nicht versehentlich die falsche Ressourcengruppe oder die falschen Ressourcen löschen. Wenn Sie den IoT Hub in einer vorhandenen Ressourcengruppe erstellt haben, die Ressourcen enthält, die Sie behalten möchten, löschen Sie nur die IoT Hub-Ressource selbst, nicht die Ressourcengruppe.

So löschen Sie die Ressourcen:

  1. Melden Sie sich beim Azure-Portal an, und wählen Sie anschließend Ressourcengruppen aus.

  2. Wählen Sie den Namen der Ressourcengruppe aus, die Ihre IoT Edge-Testressourcen enthält.

  3. Überprüfen Sie die Liste der Ressourcen, die Ihre Ressourcengruppe enthält. Wenn Sie alle löschen möchten, klicken Sie auf Ressourcengruppe löschen. Wenn Sie nur einige Ressourcen löschen möchten, wählen Sie die jeweiligen Ressourcen aus, um sie einzeln zu löschen.

Nächste Schritte

In diesem Tutorial haben Sie ein Azure-Funktionsmodul mit Code zum Filtern von Rohdaten erstellt, die von Ihrem IoT Edge-Gerät generiert werden.

In den nächsten Tutorials erfahren Sie, wie Ihnen Azure IoT Edge noch dabei helfen kann, Daten in geschäftliche Erkenntnisse auf Edge-Ebene zu verwandeln.