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

Gilt für:IoT Edge 1.4 checkmark IoT Edge 1.4

Wichtig

IoT Edge Version 1.4 wird unterstützt. Wenn Sie ein früheres Release verwenden, finden Sie weitere Informationen unter Aktualisieren von IoT Edge.

Mithilfe von Azure Functions können Sie Code bereitstellen, mit dem Ihre Geschäftslogik direkt auf Ihren Azure IoT Edge-Geräten implementiert wird. In diesem Tutorial erfahren Sie Schritt für Schritt, wie Sie eine Azure-Funktion erstellen und bereitstellen, die Sensordaten auf dem simulierten IoT Edge-Gerät filtert. Sie verwenden das simulierte IoT Edge-Gerät, das Sie in den Schnellstartanleitungen erstellt haben. In diesem Tutorial lernen Sie Folgendes:

  • Erstellen einer Azure-Funktion mithilfe von Visual Studio Code
  • Erstellen und Veröffentlichen eines Docker-Images in einer Containerregistrierung unter Verwendung von Visual Studio Code und Docker
  • Bereitstellen des Moduls über die Containerregistrierung auf Ihrem IoT Edge-Gerät
  • Anzeigen gefilterter Daten

Diagram of function architecture, showing how to stage and deploy a function module.

Die Azure-Funktion, die Sie in diesem Tutorial erstellen, filtert die von Ihrem Gerät generierten Temperaturdaten. Die Funktion sendet Nachrichten nur dann an Azure IoT Hub (Upstream), wenn die Temperatur einen angegebenen Schwellenwert überschreitet.

Wenn Sie kein Azure-Abonnement haben, erstellen Sie ein kostenloses Azure-Konto, bevor Sie beginnen.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, sollten Sie das Tutorial zum Einrichten Ihrer Entwicklungsumgebung für die Entwicklung von Linux-Containern durcharbeiten: Entwickeln von Azure IoT Edge-Modulen mit Visual Studio Code. Nach Abschluss dieses Tutorials sollten Sie über die folgenden Komponenten verfügen:

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

Erstellen eines Funktionsprojekts

Der Azure IoT Edge für Visual Studio Code, den Sie in den Voraussetzungen installiert haben, stellt Verwaltungsfunktionen sowie einige Codevorlagen bereit. In diesem Abschnitt verwenden Sie Visual Studio Code zum Erstellen einer IoT Edge-Projektmappe, die eine Azure-Funktion enthält.

Erstellen eines neuen Projekts

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

  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 showing where to add your Docker image repository name in Visual Studio Code.

Hinzufügen von Registrierungsanmeldeinformationen

Die Umgebungsdatei Ihrer Lösung speichert die Anmeldeinformationen für Ihre Containerregistrierung und gibt sie an die IoT Edge-Runtime weiter. 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 Ihre Anmeldeinformationen bereits in der Datei enthalten sind. 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 Werten für Benutzername und Kennwort, die Sie aus der Azure-Containerregistrierung kopiert haben. Sie können sie erneut finden, indem Sie zu Ihrer Containerregistrierung in Azure wechseln und nach ihnen auf der Seite Einstellungen>Zugriffsschlüssel suchen.
  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. Wenn Sie für die Produktionsszenarien bereit sind, empfehlen wir Ihnen, eine Authentifizierungsoption mit den geringstmöglichen Rechten, z. B. Dienstprinzipale, auszuwählen. Weitere Informationen finden Sie unter Verwalten des Zugriffs auf die Containerregistrierung.

Festlegen der Zielarchitektur auf AMD64

Die Ausführung von Azure Functions-Modulen auf IoT Edge wird nur auf Linux AMD64-basierten Containern unterstützt. Die Standardzielarchitektur für Visual Studio Code ist Linux AMD64, aber wir 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 einigen zusätzlichen Code hinzu, damit Ihr Modul CSharpFunction die Nachrichten im Edge-Bereich verarbeitet, bevor es sie an IoT Hub weiterleitet.

  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 Telemetriedaten zur Umgebungs- und Gerätetemperatur und leitet die Nachricht nur dann an IoT Hub weiter, wenn die Gerätetemperatur über einem festgelegten 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-Projektmappe erstellt und CSharpFunction geändert, um Nachrichten herauszufiltern, bei denen die gemeldete Gerätetemperatur unter dem zulässigen Schwellenwert liegt. Nun müssen Sie die Projektmappe als Containerimage erstellen und per Push an die Containerregistrierung übertragen.

  1. Öffnen Sie das in Visual Studio Code integrierte Terminal, indem Sie Ansicht>Terminal wählen.

  2. Melden Sie sich bei Docker an. Geben Sie dazu den nachstehenden Befehl im Terminal ein. Melden Sie sich mit dem Benutzernamen, Kennwort und Anmeldeserver aus Ihrer Azure-Containerregistrierung an. Diese Werte finden Sie im Azure-Portal im Abschnitt Zugriffsschlüssel Ihrer Registrierung.

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

    Möglicherweise wird Ihnen in einem Sicherheitshinweis die Verwendung von --password-stdin empfohlen. 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 Datei deployment.template.json, und klicken Sie anschließend auf Build and Push IoT Edge solution (IoT Edge-Projektmappe erstellen und übertragen).

    Der Befehl zum Erstellen und Übertragen per Push startet drei Vorgänge. Zuerst erstellt er in der Projektmappe einen neuen Ordner mit dem Namen config. Darin ist das vollständige Bereitstellungsmanifest gespeichert, das aus Informationen in der Bereitstellungsvorlage und anderen Projektmappendateien erstellt wurde. Danach führt er docker build zum Erstellen des Containerimages aus, das auf der entsprechenden Dockerfile-Datei 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 beim ersten Mal einige Minuten dauern, aber er ist bei der nächsten Ausführung von Befehlen schon schneller.

Anzeigen des Containerimages

Visual Studio Code gibt eine Erfolgsmeldung aus, wenn das Containerimage an die Containerregistrierung übertragen wurde. Wenn Sie selbst überprüfen möchten, ob die Ausführung erfolgreich war, können Sie das Image in der Registrierung anzeigen.

  1. Navigieren Sie im Azure-Portal zu Ihrer Azure-Containerregistrierung.
  2. Wählen SieDienste>Repositorys aus.
  3. Die Liste sollte das Repository csharpfunction enthalten. Wählen Sie dieses Repository aus, um weitere Details anzuzeigen.
  4. Im Abschnitt Tags sollte das Tag 0.0.1-amd64 angezeigt werden. Dieses Tag gibt die Version und die Plattform des erstellten Images an. Diese Werte sind in der Datei „module.json“ im Ordner „CSharpFunction“ festgelegt.

Bereitstellen und Ausführen der Projektmappe

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

  1. Erweitern Sie im Visual Studio Code-Explorer im Abschnitt Azure IoT Hub den Bereich Geräte, um Ihre IoT-Geräteliste 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. Navigieren Sie zum Projektmappenordner mit 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“. Nun sollte das neue CSharpFunction-Modul zusammen mit dem SimulatedTemperatureSensor-Modul sowie mit $edgeAgent und $edgeHub ausgeführt werden.

    Es kann etwas dauern, bis die neuen Module angezeigt werden. Ihr IoT Edge-Gerät muss die neuen Bereitstellungsinformationen von IoT Hub abrufen, die neuen Container starten und dann den Status an IoT Hub zurückmelden.

    Screenshot showing how to view deployed modules in Visual Studio Code.

Anzeigen der generierten Daten

Sie können alle bei der IoT Hub-Instanz eingehenden Nachrichten auf all Ihren Geräten anzeigen, indem Sie in der Befehlspalette Azure IoT Hub: Start Monitoring Built-in Event Endpoint (Überwachung des integrierten Ereignisendpunkts starten) auswählen. Wenn Sie die Nachrichtenüberwachung beenden möchten, führen Sie in der Befehlspalette den Befehl Azure IoT Hub: Stop Monitoring Built-in Event Endpoint (Überwachung des integrierten Ereignisendpunkts beenden) aus.

Sie können die Ansicht auch filtern, um alle Nachrichten anzuzeigen, die von einem bestimmten Gerät an Ihre IoT Hub-Instanz gesendet werden. Klicken Sie im Abschnitt Azure IoT Hub>Geräte des Visual Studio Code-Explorers mit der rechten Maustaste auf das Gerät, und wählen Sie Überwachung des integrierten Ereignisendpunkts starten aus.

Bereinigen von Ressourcen

Falls Sie mit dem nächsten empfohlenen Artikel fortfahren möchten, können Sie die erstellten Ressourcen und Konfigurationen beibehalten und wiederverwenden. Sie können auch dasselbe IoT Edge-Gerät als Testgerät weiter nutzen.

Andernfalls können Sie die in diesem Artikel erstellten lokalen Konfigurationen und Azure-Ressourcen löschen, um Kosten 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 bereits vorhandenen Ressourcengruppe erstellt haben, die Ressourcen enthält, die Sie behalten möchten, löschen Sie nicht die Ressourcengruppe, sondern nur die IoT-Hub-Ressource.

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 in Ihrer Ressourcengruppe enthalten sind. Wenn Sie alle löschen möchten, klicken Sie auf Ressourcengruppe löschen. Wenn Sie nur einige Ressourcen löschen möchten, klicken Sie auf die jeweiligen Ressourcen, 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.