In der Serie „Serverless mit Azure“ stellen wir vor, wie schnell und einfach man eine Azure Function erstellt und in Azure deployen kann.
Als konsequente Weiterentwicklung von DevOps in Richtung NoOps und und somit von Infrastructure und Platform as a Service hin zu Container und Functions as a Service, wird das Thema Serverless häufig genannt und gewinnt immer mehr an Aufmerksamkeit.
Serverless heißt übrigens nicht, dass es keine Server mehr gibt :-), schließlich muss der Code ja irgendwo laufen. Allerdings entfällt die Notwendigkeit, selbst irgendeinen Server bereitzustellen zu müssen. Dies wird von dem jeweiligen Plattformprovider (AWS, GCP, Azure) komplett übernommen und für Benutzer abstrahiert. Das ist übrigens nur ein Grund, den Serverless Technologien so interessant machen. Gerade bei Functions as a Service (ein Teilbereich von Serverless Technologien) werden nämlich nur Kosten erzeugt, wenn die Function tatsächlich ausgeführt wird. Im Vergleich dazu erzeugen beispielsweise Bare Metal Server oder VMs dauerhaft Kosten.
Außerdem skalieren Serverless Technologien extrem gut und im Falle von Azure Functions sogar automatisch, bei erhöhter Last.
Voraussetzungen
- Der Einfachheit halber verwenden wir vorerst Visual Studio, weil die Integration zu Azure relativ gut funktioniert. Deshalb hier die Voraussetzung einer Visual Studio Installation.
- Um die Azure Function zu deployen brauchen wir natürlich auch einen Azure Account und eine Subscription. Azure Functions sind bis zu einem monatlichen Aufruf von 1000000 kostenlos.
Vorbereitung
Zunächst öffnen wir Visual Studio und erstellen ein neues Projekt. In dem Wizard wählen wir das Azure Functions Template aus und spezifizieren im folgenden Schritt den Namen und Pfad des Projekts.
Anschließend können wir einen Trigger für unsere Function auswählen. Der Trigger definiert, bei welchem Ereignis unsere Function ausgeführt werden soll. Hier werden wir erst einmal den HTTP Trigger nehmen. Im weiteren Verlauf der Artikelserie werden wir auch noch verschiedene andere Trigger behandeln.
Wenn wir jetzt auf Erstellen klicken, sollte Visual Studio das Projekt für uns erstellen.
Analyse & Anpassung
Nachdem Visual Studio das Projekt erstellt hat, können wir erstmal die verschiedenen Elemente und den Code analysieren und ggf. anpassen. Zu den erzeugten Elementen gehört eine Visual Studio Solution mit einem Projekt und innerhalb des Projekts, einer .cs Datei. Diese enthält den Code unserer Function.
Standardmäßig nennt Visual Studio die .cs Datei „Function1.cs“ oder ähnlich. Da diese Benennung etwas zu generisch ist, können wir das an dieser Stelle anpassen. Das gleiche gilt für den Wert in Zeile 15, welcher den Namen der Function in Azure wiederspiegeln wird. Ansonsten sehen wir verschiedene Elemente im Code, wie in etwa Logausgaben in Zeile 20 und das Auswerten des Query-Parameters „name“. Eventuell noch interessant ist in Zeile 17 die Angabe des Triggers. Für den Trigger wird noch angegeben, dass die Function sowohl bei GET als auch bei POST Requests ausgeführt werden soll.
Lokale Ausführung
An dieser Stelle können wir das Ganze zunächst einmal lokal ausführen bevor wir es in Azure deployen. Dadurch können wir testen, ob alles so funktioniert wie wir uns das vorstellen. Dazu einfach in Visual Studio auf den Play Button oben in der Leiste klicken. Daraufhin sollte sich eine Konsole öffnen. Diese sollte zeigen, dass die Function läuft und die konfigurierten Http Endpunkte auflisten.
Jetzt können wir einen Http Request auf den Endpunkt absetzen, was in der folgenden Ausgabe resultiert.
In der Ausgabe können wir verschiedene Dinge sehen, wie die Ausführungsdauer, die HTTP Request Methode und den HTTP Code der Antwort.
Ausführung auf Azure
Wir haben also jetzt verifiziert, dass unsere Azure Function soweit funktioniert. Im nächsten Schritt können wir die Function auf Azure deployen und testen.
Deployment auf Azure
Durch die gut funktionierende Integration von Azure in Visual Studio, ist das deployen unserer Azure Function sehr einfach und komfortabel. Dazu einfach das Kontextmenü des Visual Studio Projekts auswählen.
Anschließend öffnet sich ein Wizard, der uns dabei hilft verschiedene Einstellungen für das deployment auf Azure vorzunehmen. Als erstes müssen wir einen Nutzungsplan definieren, wobei wir entweder einen vorhanden auswählen oder einen neuen erstellen können. Wir werden die Standardauswahl beibehalten und einen neuen Nutzungsplan definieren.
Als nächstes müssen wir einen sogenannten App Service definieren, innerhalb dessen unsere Azure Function laufen wird. Man kann sich den App Service wie eine übergeordnete Instanz vorstellen, in der man generelle Konfigurationen von Apps vornehmen kann. Schließlich ist eine Azure Function auch eine App, wenn auch eine kleine.
Für den App Service müssen wir verschiedene Dinge konfigurieren. Beispielsweise unter welcher Subscription und an welchem Standort der App Service laufen soll. Das ist übrigens wichtig für die Abrechnung.
Bezüglich der Ressourcengruppe und der Azure Storage habe ich jetzt jeweils neue Einträge angelegt und diese zugewiesen. Wenn wir jetzt auf Erstellen drücken, wird alles vorbereitet und wir können die Azure Function jederzeit deployen.
Azure Function testen
Wenn das deployen auf Azure fehlerfrei ausgeführt wurde, sollte unserer Function öffentlich verfügbar sein. Die Website-URL in der Zusammenfassung des letzten Schritts innerhalb von Visual Studio ist leider etwas irreführend, also müssen wir das Azure Portal besuchen um die URL der Azure Function zu ermitteln.
Dort können wir entweder über „alle Ressourcen“ zu den Azure Functions, oder indem wir in der Suchleiste oben nach dem Namen der Azure Function suchen.
Jetzt müssen wir in der linken Leiste, innerhalb der Funktionsgruppe, unsere Function selbst anklicken. In dieser Übersicht können wir jetzt entweder die Function direkt ausführen oder die vollständige URL der Function abrufen um selbst einen HTTP Request abzusetzen.
Achtung: Die Funktions-URL sieht in etwa so aus: https://myfirstazurefunctionnoi.azurewebsites.net/api/HelloWorldFunction?code=a37Ndj/vhxCQ7tqsIS33wFsKRH4zqDjBeRDFJhK06BHv4808Axkx4w==. Wenn man diese URL aufruft wird man die Meldung bekommen, dass ein Query Parameter fehlt. Mit dem automatisch generierten Code von Visual Studio erwartet die Function einen Query Parameter namens „name“. Also die vollständige URL sieht dann folgendermaßen aus: https://myfirstazurefunctionnoi.azurewebsites.net/api/HelloWorldFunction?code=a37Ndj/vhxCQ7tqsIS33wFsKRH4zqDjBeRDFJhK06BHv4808Axkx4w==&name=noah. Dann sollte auch als Response „Hallo, noah“ zurückkommen oder eben der Name den man als Parameter übergeben hat.
Etwas komfortabler ist die Variante, die Function direkt über die Azure Web Oberfläche aufzurufen.
Fazit
Das Erstellen und Deployen einer Azure Function ist Dank Visual Studio sehr einfach und komfortabel. Natürlich war das jetzt eine triviale Azure Function ohne signifikante Funktionen, allerdings werden wir im Laufe der Artikelserie noch viele verschiedene Aspekte und Szenarien beleuchten.
Der nächste Artikel wird beispielweise zeigen, wie man innerhalb einer Azure Function, Daten in eine Cosmos DB speichern und auslesen kann.