Azure Functions zur Erweiterung der Microsoft Power Platform und Dynamics 365 CE

Geschrieben von Alan Rachid am 23.12.2024

Wie bereits in meinem vorherigen Artikel über Azure Functions beschrieben, lerne ich derzeit für das Azure Developer Zertifikat (AZ-204) von Microsoft. Um das Gelernte zu festigen, schreibe ich Blogartikel zu relevanten Themen. In meiner täglichen Arbeit beschäftige ich mich hauptsächlich mit Geschäftsanwendungen, die mit der Microsoft Power Platform oder Microsoft Dynamics 365 CE umgesetzt werden. Dabei versuche ich die Azure-Technologien, die für die Anwendungsentwicklung genutzt werden können, immer in den Kontext der Power Platform oder Dynamics 365 CE zu stellen.,

Ein relevanter Grund für mich, mit Microsoft-Technologien zu arbeiten, ist die Möglichkeit, verschiedenste Werkzeuge eng miteinander zu verzahnen, um eine wertschöpfende und innovative Geschäftsanwendung zu implementieren. Microsoft Azure ist die Basis für Microsoft Dynamics 365 und die Power Platform. Alle Low Code Tools und First Party Apps werden auf Microsoft Azure gehostet und nutzen in der einen oder anderen Weise die Funktionalitäten von Microsoft Azure.,

Im Folgenden werden Szenarien beschrieben, in denen der Einsatz von Azure Functions im Kontext von Microsoft Power Platform- oder Dynamics 365 CE-Anwendungen sinnvoll sein kann. Viele der beschriebenen Möglichkeiten sind auch mit Low-Code-Tools wie Power Automate oder Azure Logic Apps möglich. Dieser Artikel nimmt keine Wertung vor, ob der Einsatz von „echter“ Programmierung oder Low-Code für die Szenarien besser oder schlechter ist. Wie immer gilt: Nutze die Technologie, die für dein Anwendungsszenario und deine Ressourcenverfügbarkeit am sinnvollsten ist.,

Kurze Auffrischung zu Azure Functions

Azure Functions ist ein Software-as-a-Service-Angebot von Microsoft, das es Entwickler:innen ermöglicht, sich auf das Schreiben von Code zu konzentrieren. Es handelt sich um ein ereignisgesteuertes System, bei dem ein Trigger eine Function aufruft und bei erfolgreicher Ausführung eine Antwort an verschiedene Systeme senden kann (Output Binding). Eine Azure Function ist im besten Fall klein und auf einen Anwendungsfall fokussiert. Im Kontext von Microsoft Dynamics 365 CE und der Power Platform können Azure Functions beispielsweise über ein Plugin aufgerufen oder noch einfacher als WebHook registriert werden. Damit kann auf praktisch jedes Ereignis einer Geschäftsanwendung reagiert werden. Für mehr Infos kannst du meinen ersten Blog-Artikel über Azure Functions lesen.

Integration mit Drittsystemen

Im produktiven Betrieb ist eine Geschäftsanwendung in der Regel kein eigenständiger Monolith. Meist sind die Systeme in eine bestehende IT-Landschaft mit bereits vorhandenen Anwendungen integriert. Diese unterschiedlichen Anwendungen sind oft für Teilschritte eines Geschäftsprozesses verantwortlich, so dass zumindest Daten zwischen den Systemen synchronisiert werden müssen oder Funktionen aus einem System von einem anderen System aufgerufen werden. Azure Functions sind ein bewährtes Werkzeug, wenn es darum geht, Anwendungen, die auf der Microsoft Power Platform laufen, mit anderen Systemen zu integrieren. Theoretisch kann zwischen Inbound-Integration und Outbound-Integration unterschieden werden. Bei der Inbound Integration wird eine Nachricht von einem Drittsystem zur Verarbeitung an unsere Power Platform- oder Dynamics 365-Anwendung gesendet, um Daten zu aktualisieren oder eine Funktion aufzurufen. Bei der Outbound Integration teilen wir einem Drittsystem mit, dass es etwas tun soll. Mit Azure Functions können beide Szenarien abgebildet werden.

Angenommen, wir haben ein Fundraising-System für eine gemeinnützige Organisation entwickelt, in dem unter anderem Spenden verbucht werden sollen, die über verschiedene Spendenkanäle eingehen können, z.B. über eine Bank oder einen Online-Zahlungsdienstleister. In diesem Szenario muss unser System in der Lage sein, Transaktionen sowohl von der Bank als auch vom Online-Zahlungsdienstleister zu verarbeiten. Hier kann mit Hilfe einer Azure-Funktion die Integration mit dem Online-Zahlungsdienstleister umgesetzt werden, indem dieser beim Eingang einer neuen Online-Spende eine Nachricht in eine dafür vorgesehene Warteschlange (Azure Service Bus) sendet. Diese Nachricht wird von einer Azure Function empfangen und die darin enthaltenen Informationen werden in das Zieldatenmodell unserer Anwendung übertragen und schließlich wird ein Datensatz in Dataverse erstellt. Der Service Bus muss nicht zwingend zwischen dem Drittsystem und der Azure Function geschaltet werden.

Im obigen Szenario, in dem die Azure Function verwendet wird, um eine eingehende Spende von einem Drittsystem in unserem Fundraising-System anzulegen und zu verbuchen (Inbound-Integration), kann eine weitere Azure Function verwendet werden, um das Drittsystem zu informieren, dass die Spende verbucht wurde. In diesem Szenario wird in der Power Platform Umgebung ein WebHook auf das entsprechende Systemereignis registriert. Dieser WebHook ruft dann eine zweite Azure Function auf, die alle relevanten Transformationsschritte durchführt, um die Verbuchung im Zahlungssystem zu vermerken. Im besten Fall stellt das Zahlungssystem eine API zur Verfügung, die dann von der Azure Function aufgerufen werden kann.

Auslagern von ressourcenintensiven bzw. zeitgesteuerten Aufgaben

Als Entwickler der Power Platform sind wir alle mit den Einschränkungen vertraut, denen wir unterliegen, wenn wir ein Plugin oder eine Custom Workflow Activity schreiben. Alle Operationen müssen innerhalb des 2-Minuten-Limits ausgeführt werden. Außerdem rät Microsoft davon ab, Parallelisierung innerhalb von Codeerweiterungen zu verwenden, da dies zu unerwünschtem Verhalten führen kann. Bei der Implementierung einer Anforderung, bei der absehbar ist, dass diese sehr viele Ressourcen benötigt oder den Anspruch hat, Aufgaben parallel auszuführen, empfiehlt sich die Verwendung von Azure Functions. Die Azure Function kann dann je nach Anwendungsfall entweder über einen Ribbon-Button per http-Aufruf oder über die Ausführung eines Plugins/WebHooks gestartet werden. Eine Azure Function, die auf einem Consumption Plan gehostet wird, kann bis zu 10 Minuten laufen (https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale?utm_source=chatgpt.com). Zusätzlich kann innerhalb einer Azure Function Instanz die Möglichkeit der Parallelisierung genutzt werden, um eine Performancesteigerung zu erreichen. Typische Szenarien für die Parallelisierung könnten die Batch-Verarbeitung mehrerer Datensätze oder generell die Verarbeitung großer Datenmengen sein.

Im Kontext des Fundraising-Systems ist zum Beispiel die Berechnung von Zielgruppen für Spender:innen ein guter Anwendungsfall für die Nutzung von Azure Functions. Spender:innen werden von gemeinnützigen Organisationen in der Regel auf Basis ihres Spendenverhaltens der letzten X Jahre in Zielgruppen (Mid-Level-Spender/Major-Spender/...) unterteilt. Bei der Zielgruppendefinition und -berechnung müssen relevante Spendenpositionen sowie Lastschriften abgefragt und eine komplexe Logik zur Berechnung der aktuellen Zielgruppe durchgeführt werden. Dies innerhalb des Fundraising-Systems könnte das System unnötig belasten.

Das regelmäßige Starten einer Hintergrundaktivität, die alle X Stunden läuft, ist mit den Standardwerkzeugen von der Power Platform und Microsoft Dynamics 365 CE ebenfalls nicht möglich. Hierfür eignen sich ebenfalls Azure Functions, da diese basierend auf einem Zeitplan automatisch gestartet werden können.

Komplexe Workflows ausführen

Entwickler, die noch etwas ältere Versionen von Microsoft Dynamics CRM kennen, wissen, wie aufwändig es sein kann, komplexe Workflows zu implementieren, die mehrere Schritte nacheinander ausführen. Die klassischen Workflows innerhalb der Power Platform sind nicht intuitiv zu erstellen und stoßen ab einer gewissen Komplexität an ihre Grenzen. Natürlich gibt es die Möglichkeit, die klassischen Workflows mit Hilfe von Custom Workflow Activities zu erweitern, aber Microsoft selbst rät mittlerweile davon ab. Mit Hilfe von Power Automate sind Benutzer:innen auch in der Lage, komplexe Workflows zu implementieren und Power Automate verfügt über eine Vielzahl von Möglichkeiten, die fast jedes Szenario abbildbar machen.Ab einer gewissen Größe und Komplexität wird Power Automate auch schwer wartbar und unübersichtlich. Azure Durable Functions ist eine Erweiterung von Azure Functions, mit der sich zustandsabhängige Workflows implementieren lassen. Es gibt verschiedene Anwendungsmuster für Azure Durable Functions. Wir konzentrieren uns heute auf das Function-Chaining. Beim Function-Chaining gibt es eine Orchestrator-Function, die nacheinander untergeordnete Azure Functions aufruft. Die Azure Functions können untereinander Informationen austauschen, indem sie zum Beispiel auf einem gemeinsamen Function-Context arbeiten. Der Function-Context ist ein Objekt, das wir selbst als Datenstruktur erstellen.

Um im Kontext unserer Fundraising-Anwendung zu bleiben, ist ein mögliches Anwendungsszenario die Verarbeitung von Einträgen aus CAMT-Dateien (einheitliches Format zum Übertragen von Banktransaktionen). Ein Eintrag in der CAMT-Datei enthält unter anderem Informationen zur Autraggeber:in und zum Verwendungszweck. In einer Durable Azure Function zur Transaktionsverarbeitung kann die Orchestrator-Funktion zunächst eine Unterfunktion „Autraggeber:in identifizieren“ aufrufen. Diese Funktion speichert die Spender:in im geteilten Function-Context ab. Eine weitere Funktion „Spendenzweck identifizieren“, die nach der ersten Funktion aufgerufen wird, versucht aus dem Verwendungszweck der Banktransaktion einen Spendenzweck zu extrahieren und speichert diesen im Erfolgsfall ebenfalls im geteilten Function Context ab. Nach diesem Prinzip können weitere Funktionen aufgerufen werden.

Zusammenfassung

In diesem Blog-Artikel haben ich unterschiedliche Anwendungsszenarien beschrieben, in denen es meiner Meinung nach Sinn ergibt, Azure Functions einzusetzen. Hierbei bin ich auf die folgenden drei Fälle eingegangen:

  • Integration mit Drittsystemen: Azure Functions sind gut einsetzbar zum Aufbau von Schnittstellen zwischen Drittsystemen und Apps, die auf der Power Platform laufen.
  • Auslagern von ressourcenintensiven oder zeitgesteuerten Aufgaben: Die Power Platform besitzt Limitierungen, die die Laufzeit von Code-Komponenten einschränkt. Wenn es absehbar ist, dass eine Anforderung sehr zeitintensiv ist, ist es ratsam, diese nicht in der Power Platform selbst zu implementieren. Außerdem gibt es keine Mechanismen, die zeitgesteuert Aufgaben starten können. In beiden Szenarien könne Azure Functions eingesetzt werden.
  • Komplexe Workflows ausführen: Mithilfe von Azure Durable Functions haben wir neben Power Automate oder Azure Logic Apps ein modernes Werkzeug zur Hand, mit dem man Workflows abbilden kann.

If you have any questions about our best practices or need support with implementing Microsoft Power Platform or Dynamics 365, please feel free to reach out to us. We look forward to connecting with you.

Nachricht senden