Übung: Erstellen eines Workflows mithilfe von Durable Functions

Abgeschlossen

In dieser Übung lernen Sie anhand des Beispielszenarios aus der vorherigen Lektion, wie Sie mit Durable Functions einen Genehmigungsworkflow im Azure-Portal erstellen.

Erstellen einer Funktions-App

  1. Melden Sie sich beim Azure-Portal mit demselben Konto an, das Sie zum Aktivieren der Sandbox verwendet haben.

  2. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Azure-Dienste die Option Ressource erstellen aus. Der Bereich Ressource erstellen wird angezeigt.

  3. Suchen Sie nach Funktions-App, und wählen Sie das Suchergebnis aus. Wählen Sie Verbrauch und anschließend die Schaltfläche Auswählen aus. Der Bereich Funktions-App erstellen wird angezeigt.

  4. Füllen Sie auf der Registerkarte Grundlagen die folgenden Werte für jede Einstellung aus.

    Einstellung Wert BESCHREIBUNG
    Projektdetails
    Subscription Concierge-Abonnement Gibt das Abonnement an, unter dem diese neue Funktions-App erstellt wird.
    Ressourcengruppe Wählen Sie in der Dropdownliste [Name der Sandboxressourcengruppe] aus. Gibt den Namen der Ressourcengruppe an, in der die Funktions-App erstellt werden soll. Wir erstellen eine Funktions-App in der Sandbox-Ressourcengruppe, die zugewiesen wurde, als die Sandbox aktiviert wurde, nämlich [Name der Sandbox-Ressourcengruppe].
    Instanzendetails
    Name der Funktions-App [Global eindeutiger Name] Gibt den Namen Ihrer neuen Funktions-App an. Gültige Zeichen sind a-z, 0-9 und -.
    Veröffentlichen Code Gibt an, dass die Funktion Code anstelle eines Containers verwendet.
    Laufzeitstapel Node.js Gibt an, dass der Beispielcode in diesem Modul in JavaScript geschrieben ist.
    Version 20 LTS Gibt die Version des Runtimestapels an.
    Region [Wählen Sie einen Eintrag in der Liste nach diesem Abschnitt aus.] Wählen Sie die nächstgelegene Region aus, die auch in den folgenden zulässigen Sandboxregionen aufgeführt wird.
    Betriebssystem
    Betriebssystem Windows Gibt das Betriebssystem an, das die Funktions-App hostet.
    Planen

    Mit der kostenlosen Sandbox können Sie Ressourcen in einem Teil der globalen Azure-Regionen erstellen. Wählen Sie eine Region aus der folgenden Liste aus, wenn Sie Ressourcen erstellen:

    • USA, Westen 2
    • USA Süd Mitte
    • USA (Mitte)
    • East US
    • Europa, Westen
    • Asien, Südosten
    • Japan, Osten
    • Brasilien, Süden
    • Australien, Südosten
    • Indien, Mitte
  5. Wählen Sie Weiter – Speicher aus.

  6. Geben Sie auf der Registerkarte Speicher die folgenden Werte für die jeweiligen Einstellungen ein.

    Einstellung Wert BESCHREIBUNG
    Storage
    Speicherkonto [Global eindeutiger Name] Diese Eigenschaft gibt den Namen des neuen Speicherkontos an, das von Ihrer Funktions-App verwendet wird (dieser muss nicht mit dem global eindeutigen Namen übereinstimmen, den Sie für Ihre Funktion festgelegt haben). Speicherkontonamen müssen zwischen 3 und 24 Zeichen lang sein und dürfen nur Zahlen und Kleinbuchstaben enthalten. In diesem Dialogfeld wird das Feld automatisch mit einem dynamisch generierten eindeutigen Namen aufgefüllt. Sie können aber auch einen anderen Namen oder sogar ein vorhandenes Konto verwenden.
  7. Klicken Sie auf Weiter: Netzwerk. Übernehmen Sie die Standardeinstellungen.

  8. Wählen Sie Weiter: Überwachung aus.

  9. Geben Sie auf der Registerkarte Überwachung den folgenden Wert für die Einstellung ein.

    Einstellung Wert BESCHREIBUNG
    Application Insights
    Aktivieren von Application Insights Nein Gibt an, dass Application Insights für dieses Modul deaktiviert ist.
  10. Wählen Sie Überprüfen und erstellen aus, und überprüfen Sie die Optionen, die Sie konfiguriert haben. Wenn Sie mit den Optionen zufrieden sind, wählen Sie Erstellen aus, um die Funktions-App bereitzustellen.

Warten Sie auf den Abschluss der Bereitstellung, bevor Sie fortfahren. Die Bereitstellung kann einige Minuten dauern.

Installieren des npm-Pakets „durable-functions“

Da die Durable Functions in JavaScript erstellt werden sollen, muss das npm-Paket durable-functions installiert werden. Gehen Sie hierzu folgendermaßen vor:

  1. Wählen Sie Zu Ressource wechseln aus, um Ihre Funktions-App auszuwählen. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie im linken Menübereich unter Entwicklungstools die Option App Service-Editor (Vorschau) und dann Editor öffnen aus. Der Schnellstartbereich von App Service-Editor wird in einem neuen Browserfenster angezeigt.

  3. Markieren Sie im linken Menübereich den Ordner WWWROOT.

  4. Wählen Sie auf der linken Symbolleiste das Symbol Konsole öffnen aus.

    Dadurch wird die Konsole gestartet. Mit dieser Konsole können Sie auf den Webserver zugreifen, der Ihre Funktionen hostet, und den Code für Ihre Funktionen schreiben.

  5. Erstellen Sie eine neue package.json-Datei.

    • Führen Sie in der Konsole die folgenden Befehle aus, um die neue JSON-Datei zu erstellen und im Editor zu öffnen.

      touch package.json
      open package.json
      
    • Fügen Sie den folgenden Code hinzu.

      {
        "name": "example",
        "version": "1.0.0"
      }
      

      Ersetzen Sie example durch den Namen Ihres Pakets. Beispielsweise könnten Sie den global eindeutigen Namen verwenden, den Sie zuvor für Ihre Funktion angegeben haben.

  6. Drücken Sie STRG+S, um die Datei zu speichern, und dann STRG+Q, um das Dokument zu schließen.

  7. Kehren Sie zum Azure-Portal zurück.

  8. Wählen Sie auf der linken Menüleiste unter Entwicklungstools die Option Konsole aus. Der Bereich Konsole wird für Ihre Funktions-App angezeigt.

  9. Führen Sie den folgenden Befehl aus:

    npm install durable-functions
    

    Dieser Befehl weist den Knotenpaket-Manager an, das durable-functions-Paket und alle erforderlichen Abhängigkeiten zu installieren. Die Installation kann einige Minuten in Anspruch nehmen, und in Node Package Manager werden möglicherweise einige Warnungen angezeigt, die Sie ignorieren können.

    Hinweis

    Wenn Sie aufgefordert werden, eine neuere Version von npm zu installieren, verwenden Sie den im Fehler angegebenen Befehl, um die neuere Version zu installieren, und installieren Sie dann das Paket durable-functions, nachdem die neue Version installiert wurde.

    Warten Sie, bis alle Pakete installiert wurden.

  10. Scrollen Sie im Menübereich auf der linken Seite nach oben, und wählen Sie Übersicht, dann auf der Menüleiste oben Neu starten und anschließend in der Eingabeaufforderung für den Neustart Ja aus.

    Warten Sie, bis der Neustart abgeschlossen wurde, bevor Sie fortfahren.

Erstellen der Clientfunktion zum Übermitteln eines Entwurfsvorschlags

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Zuletzt verwendete Ressourcen die Option Alle anzeigen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie auf der Übersicht die Registerkarte Funktionen in der Mitte des Bildschirms aus.

  3. Wählen Sie die Schaltfläche Im Azure-Portal erstellen aus. Der Bereich Funktion erstellen wird angezeigt.

  4. Geben Sie unter Vorlage auswählen im Feld Filter den Text HTTP-Starter für Durable Functions ein, und wählen Sie diese Vorlage aus der Liste aus. Diese Vorlage erstellt eine langlebige Funktion, die als Reaktion auf eine HTTP-Anforderung ausgeführt wird.

  5. Geben Sie unter Vorlagendetails im Feld Neue Funktion den Namen HttpStart für die Funktion ein, und wählen Sie im Feld Autorisierungsstufe die Option Funktion aus. Wählen Sie dann Erstellen aus. Der Bereich HttpStart für Ihre Funktion wird angezeigt.

  6. Klicken Sie auf der linken Seite des Menübereichs unter Developer (Entwickler) auf Programmieren und testen. Der Bereich Codieren und testen wird für Ihre Funktion angezeigt.

    Der Code für die Datei index.js wird im Editor angezeigt. Die Datei sollte in etwa wie das folgende Beispiel aufgebaut sein:

    const df = require("durable-functions");
    
    module.exports = async function (context, req) {
        const client = df.getClient(context);
        const instanceId = await client.startNew(req.params.functionName, undefined, req.body);
    
        context.log(`Started orchestration with ID = '${instanceId}'.`);
    
        return client.createCheckStatusResponse(context.bindingData.req, instanceId);
    };
    
  7. Wählen Sie in der Dropdownliste für die Dateien in Ihrer Funktion die Option function.json aus, um die mit Ihrer neuen Funktion verknüpften Bindungen anzuzeigen. Diese Informationen umfassen alle Authentifizierungsanforderungen sowie die HTTP-Methoden, die die Funktion auslösen können. Diese Datei legt auch fest, dass die Funktion ein Client ist, der den Orchestrierungsprozess startet. Die Datei sollte in etwa wie das folgende Beispiel aufgebaut sein:

    {
      "bindings": [
        {
          "authLevel": "function",
          "name": "req",
          "type": "httpTrigger",
          "direction": "in",
          "route": "orchestrators/{functionName}",
          "methods": [
            "post",
            "get"
          ]
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        },
        {
          "name": "starter",
          "type": "orchestrationClient",
          "direction": "in"
        }
      ]
    }
    

    Hinweis

    Eine Bindung ordnet Ressourcen und anderen Elementen einen Trigger zu. Es handelt sich um einen deklarativen Mechanismus, durch den Verweise auf andere Dienste und Funktionen in Ihrem Code nicht mehr hart codiert werden müssen.

Erstellen der Orchestratorfunktion

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Zuletzt verwendete Ressourcen die Option Alle anzeigen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie auf der Seite Übersicht die Registerkarte Funktionen in der Mitte des Bildschirms aus.

  3. Wählen Sie in der Menüleiste Funktionen die Option Erstellen aus. Der Bereich Funktion erstellen wird angezeigt.

  4. Geben Sie unter Vorlage auswählen im Feld Filter den Text Orchestrator für Durable Functions ein, und wählen Sie diese Vorlage aus der Liste aus. Diese Vorlage erstellt eine langlebige Funktion, die die Ausführung von Funktionen orchestriert.

  5. Geben Sie unter Vorlagendetails im Feld Neue Funktion den Namen OrchFunction für die Funktion ein, wählen Sie dann Erstellen. Der Bereich OrchFunction für die Funktion wird angezeigt.

  6. Klicken Sie auf der linken Seite des Menübereichs unter Developer (Entwickler) auf Programmieren und testen. Der Bereich Codieren und testen wird für Ihre Funktion angezeigt.

    Der Code für die Datei index.js wird im Editor angezeigt.

  7. Ersetzen Sie den vorhandenen Code durch folgenden Code:

    const df = require("durable-functions");
    
    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
    
        /*
        * We will call the approval activity with a reject and an approved to simulate both
        */
    
        outputs.push(yield context.df.callActivity("Approval", "Approved"));
        outputs.push(yield context.df.callActivity("Approval", "Rejected"));
    
        return outputs;
    });
    

    Dieser Code ruft eine Aktivitätsfunktion mit dem Namen Approval auf, die Sie bald erstellen. Der Code in der Orchestratorfunktion ruft die Approval-Funktion zweimal auf. Beim ersten Mal wird das Akzeptieren des Angebots simuliert, und beim zweiten Mal wird die Ablehnungslogik für Vorschläge getestet.

    Die von jedem Aufruf zurückgegebenen Werte werden kombiniert und an die Clientfunktion zurückgegeben. In einer Produktionsumgebung würde Ihre Orchestrierungsfunktion mehrere Aktivitätsfunktionen aufrufen, die die Entscheidung zum Annehmen/Ablehnen treffen, und das Ergebnis dieser Aktivitäten zurückgeben.

  8. Wählen Sie auf der oberen Menüleiste Speichern aus, um die neue Funktion zu speichern.

Erstellen der Aktivitätsfunktion

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Zuletzt verwendete Ressourcen die Option Alle anzeigen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie auf der Seite Übersicht die Registerkarte Funktionen in der Mitte des Bildschirms aus.

  3. Wählen Sie in der Menüleiste Funktionen die Option Erstellen aus. Der Bereich Funktion erstellen wird angezeigt.

  4. Geben Sie unter Vorlage auswählen im Feld Filter den Text Aktivität für Durable Functions ein, und wählen Sie diese Vorlage aus der Liste aus. Diese Vorlage erstellt eine Durable Function, die ausgeführt wird, wenn eine Orchestratorfunktion eine Aktivität aufruft.

  5. Geben Sie unter Vorlagendetails im Feld Neue Funktion den Namen Approval für die Funktion ein und wählen Sie dann Erstellen aus. Der Bereich Approval für Ihre Funktions-App wird angezeigt.

  6. Klicken Sie auf der linken Seite des Menübereichs unter Developer (Entwickler) auf Programmieren und testen. Der Bereich Codieren und testen wird für Ihre Funktion angezeigt.

    Der Code für die Datei index.js wird im Editor angezeigt.

  7. Ersetzen Sie den vorhandenen Code durch folgenden Code:

    module.exports = async function (context) {
        return `Your project design proposal has been -  ${context.bindings.name}!`;
    };
    

    Diese Funktion gibt eine Nachricht mit dem Status des Vorschlags zurück. Der Ausdruck context.bindings.name wird entweder Accepted oder Rejected sein, je nachdem, welcher Parameter vom Orchestrator an die Funktion übergeben wurde. In der Praxis würden Sie die Logik, die die Vorgänge zum Annehmen oder Ablehnen verarbeitet, zu dieser Funktion hinzufügen.

  8. Wählen Sie auf der oberen Menüleiste Speichern aus, um die neue Funktion zu speichern.

Sicherstellen des Starts des Durable Functions-Workflows

  1. Wählen Sie im Menü des Azure-Portals oder auf der Startseite unter Zuletzt verwendete Ressourcen die Option Alle anzeigen und dann Ihre Funktions-App aus. Der Bereich Funktions-App wird angezeigt.

  2. Wählen Sie die Registerkarte Funktionen in der Mitte der Seite aus.

  3. Wählen Sie die Funktion HttpStart aus. Der Bereich HttpStart für Ihre Funktion wird angezeigt.

  4. Wählen Sie auf der oberen Menüleiste Funktions-URL abrufen aus, und kopieren Sie die URL. Die URL sollte folgendem Beispiel entsprechen:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Sie verwenden diese URL zum Ausführen Ihrer Funktionen.

  5. Öffnen Sie ein neues Browserfenster, und navigieren Sie zu der URL, die Sie kopiert haben. Ersetzen Sie in der URL den Platzhalter {functionName} durch OrchFunction. Die URL sollte in etwa wie das folgende Beispiel aussehen:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Die Antwortnachricht enthält mehrere URI-Endpunkte, die Sie zum Überwachen und Verwalten der Ausführung verwenden können. Sie sollte folgendem Beispiel ähneln:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  6. Kopieren Sie den Wert für statusQueryGetUri, und navigieren Sie in Ihrem Webbrowser zu dieser URL. Sie sollten eine Antwortnachricht erhalten, die folgendem Beispiel ähnelt:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Completed",
      "input": null,
      "customStatus": null,
      "output": [
        "Your project design proposal has been -  Approved!",
        "Your project design proposal has been -  Rejected!"
      ],
      "createdTime": "2019-04-16T15:23:03Z",
      "lastUpdatedTime": "2019-04-16T15:23:35Z"
    }
    

    Denken Sie daran, dass die Orchestrierungsfunktion die Aktivitätsfunktion zweimal ausführt. Beim ersten Mal gibt die Aktivitätsfunktion an, dass der Projektvorschlag angenommen wurde. Beim zweiten Mal wird der Vorschlag abgelehnt. Die Orchestrierungsfunktion kombiniert die Nachrichten aus beiden Funktionsaufrufen und gibt sie an die Clientfunktion zurück.