Bevor wir in das Tutorial einsteigen, sollten wir uns erst einmal anschauen, was Azure Functions überhaupt sind:

Bei Azure Functions handelt es sich um eine Lösung, mit der man kleinere Codefragmente (Funktionen) erstellen und in der Cloud ausführen kann. Bei der Implementierung kann man sich ganz auf das Lösen des jeweiligen Problems konzentrieren und muss sich nicht auch noch um die Infrastruktur kümmern (Serverless Computing).

Die Funktionen können unter anderem mit C#, JavaScript, F# und Java entwickelt werden. Eine Einschränkung gibt es aber bezüglich Java: Unterstützung gibt es erst ab der Version 2.x der zugrundeliegenden Azure Functions Runtime. Darüber hinaus befindet sich diese Version im Vorschaustatus, kann also nicht für Produktivsysteme genutzt werden. Weitere Informationen zu den unterstützten Sprachen gibt es unter https://docs.microsoft.com/de-de/azure/azure-functions/supported-languages. In der Runtime Version 1.x, die wir auch in unseren Beispielen nutzen werden, unterstützen nur C#, JavaScript und F# alle Features der Azure Functions.
Das Schöne an der Azure Functions Runtime ist, dass diese Open Source ist und unter https://github.com/Azure/azure-functions-host eingesehen werden kann.

Das Gegenstück in der AWS Welt wären die AWS Lambdas. Wie auch bei AWS Lambdas ist die Laufzeit einer Funktion zeitlich begrenzt. Standardmäßig erfolgt ein Timeout nach 5 Minuten, dieses kann noch auf 10 Minuten erweitert werden. Danach ist aber definitiv Schluss. Ein weiteres Limit definiert der maximal nutzbare Arbeitsspeicher von 1.536 MB.

In dem Beispiel mit dem wir gleich anfangen, nutzen wir NodeJs. Unsere kleine Beispielanwendung (Keine Angst, kein Hello World!) erstellen wir direkt über das Azure Portal. Neben der direkten Erstellung im Portal gibt es auch die Option, den Code lokal in der gewohnten Entwicklungsumgebung zu bauen. Dieser kann dann mittels GitHub, BitBucket, OneDrive etc. bereitgestellt werden. In diesem Fall werden die neusten Updates per Pull nach Azure übertragen und sind sofort live.

Nun aber zu unserem Beispiel: Das Ziel unserer Azure Funktion ist es, alle 120 Sekunden mittels der Random User Generator API einen User zu beziehen. Zur Kontrolle geben wir den Namen des Users aus und zusätzlich die kompletten Daten, die wir über den REST-Endpoint erhalten haben.

Nach dem Einloggen im Azure Portal (https://portal.azure.com) befinden wir uns auf dem Dashboard (Abbildung 1). Am Anfang ist hier noch nicht viel zu sehen. Wenn wir die Funktion erstellt haben, werden wir diese unter dem Punkt „Alle Ressourcen“ wiederfinden und können darüber direkt zur Funktion springen.

Abbildung 1
Abbildung_1

Um eine Funktion anlegen zu können, müssen wir zuerst eine Funktionen-App erstellen. Die Funktionen-App hostet unsere eigentlichen Funktionen. Und da eine Funktionen-App mehrere Funktionen hosten kann, können wir Funktionen zu logischen Einheiten gruppieren.

Um nun eine neue Funktionen-App anzulegen, drücken wir auf den Punkt „Ressource erstellen“ (Abbildung 2, roter Pfeil). In den Bereich, der nun aufpoppt, können wir aus einer Vielzahl angebotener Services wählen. Azure Functions sind unter dem Punkt „Compute“ zu finden.

Abbildung 2
Abbildung_2

Nach der Auswahl der Funktionen-App können die nötigen Einstellungen vorgenommen werden. Wir geben unserer App den Namen „Function-UserData“ und wählen als Standort „Westeuropa“ aus. Den Rest lassen wir so wie er ist (Abbildung 3). Nach dem Drücken des Buttons „Erstellen“ werden unsere Angaben überprüft und die Funktionen-App wird bereitgestellt. Dieser Vorgang kann etwas dauern.

Wenn die Bereitstellung erfolgt ist bekommen wir eine Mitteilung. Diese kann auch nachträglich angesehen werden, wenn wir auf die Glocke im oberen rechten Bereich des Portals drücken.

Abbildung 3
Abbildung_3

Nach dem Anlegen gelangen wir z. B. über den Favoriten „Funktionen-Apps“ zu unserer gerade erstellten Funktionen-App (Abbildung 4). Wenn wir unsere Function-UserData aufklappen könnten wir mit dem Plus-Symbol am Punkt „Funktionen“ unsere eigentlichen Funktionen anlegen. Als Szenario wählen wir den Timer und als Sprache JavaScript (Abbildung 5). Bei dieser Ansicht handelt es sich um den Schnellstart, der uns die gängigsten Szenarien zum Starten oder Triggern einer Funktion anzeigt. Darüber hinaus wird die Funktion mit Beispiel-Code erstellt. Unter dem Link „Benutzerdefinierte Funktion“ werden uns alle unterstützten Trigger angeboten.

Nach dem Anlegen landen wir direkt im Code Editor und sehen dort, wie oben erwähnt, den Beispiel-Code, den wir auch ausführen können.

Abbildung 4
Abbildung_4

Abbildung 5
Abbildung_5

Eine Funktion besteht aus drei Dateien. Einer „function.json“, einer „index.js“ und einer „readme.md“. Die „function.json“ ist die Konfigurations-Datei unserer Funktion. Hier können wir in unserem Beispiel den ausgewählten Trigger (Timer-Trigger) einsehen und bearbeiten. Den Quellcode unserer Funktion finden wir in der „index.js“. Die „readme.md“ dient der Dokumentation. Die genannten Dateien können in der Editor-Ansicht unter dem Punkt „Dateien anzeigen“ angezeigt werden.

Unsere Funktion sollte ja wie eingangs erwähnt alle zwei Minuten Random-User-Daten über die Random User Generator API (https://randomuser.me/api/) beziehen. Dazu öffnen wir die „index.js“ und ändern den Code ab, so wie es in Abbildung 6 zu sehen ist. Die roten Pfeile zeigen die Ü„nderungen an.

Abbildung 6
Abbildung_6

Nach dem Speichern und Ausführen sollten wir unter „Protokolle“ das Ergebnis sehen (grüner Pfeil in Abbildung 6). Glückwunsch! Die Funktion ruft nun die Random User Generator API auf und bezieht User Daten.
Aktuell passiert dies aber noch im Fünf-Minuten-Takt. Damit die Funktion alle zwei Minuten ausgeführt wird, müssen wir den Timer Trigger abändern. Diese Ü„nderung kann man in der „function.json“ vornehmen, in dem man beim Key „schedule“ die 5 durch eine 2 ersetzt („0 */2 * * * *“). Alternativ kann man auch über den Punkt „Integrieren“ (Abbildung 7) die Eigenschaften des Timer Triggers ändern.

Abbildung 7
Abbildung_7

Führen wir die Funktion nun wieder im Code Editor aus, sehen wir unter dem Punkt „Protokolle“, dass dieser alle zwei Minuten ausgeführt wird.

Damit sind wir schon am Ende unseres kleinen Beispiels angekommen, das hoffentlich zeigen konnte, wie einfach das Erstellen einer Azure Funktion mittels des Code-Editors von der Hand geht. Man hat die Möglichkeit eine Funktion sowohl programmatisch wie auch über die Oberfläche des Portals zu ändern (siehe Ü„nderung des Trigger-Intervalls). Durch das direkte Arbeiten in der Azure Cloud bekommt man direktes Feedback ob der eigene Code lauffähig ist.
Im nächsten Blog erweitern wir die hier erstellte Funktion um eine Anbindung zum ServiceBus und verlagern die Entwicklung aus dem Azure Portal in die lokale Umgebung.

Alle Beiträge von davidgreineropitz

Schreibe einen Kommentar