Gemeinsam mit Visual Studio 2017.3 wurde auch die finale Version der Visual Studio Tools für Azure Functions veröffentlicht. Damit können C# Entwickler endlich mit den gewohnten Tools Lösungen für Azure Functions erstellen. In diesem Beitrag wird erklärt was Azure Functions sind, wie sie funktionieren und was die Visual Studio Tools können.
Azure Functions
Mit Azure Functions bietet Microsoft eine ereignisbasierte und serverlose Rechenumgebung an. Functions sind also die direkte Antwort auf Amazons AWS Lambda. Auch wenn hier von „serverlos“ gesprochen wird, gibt es natürlich weiterhin Server, auf denen die Applikationen ausgeführt werden. Der große Unterschied liegt darin, dass man als Kunde nichts davon mitbekommt. Man konfiguriert lediglich die Function selbst und nicht die Anzahl der Prozessoren oder die Größe des Arbeitsspeichers etc. Und egal wie viel oder wenig Leistung eine Applikation benötigt, Azure Functions skalieren vollkommen automatisch und somit zahlt der Kunde auch nur das, was tatsächlich an Leistung in Anspruch genommen wurde.
Wie der Name schon vermuten lässt, sind Azure Functions nicht für ganze Webapplikationen gedacht, sondern für einzelne Funktionen. Diese werden auf Grund von Ereignissen ausgeführt. Dazu stehen bereits einige vorgefertigte sogenannte „Trigger“ zur Verfügung, wie z.B. BlobTrigger, HTTPTrigger, Webhooks und TimerTrigger.
Kosten
Verrechnet werden bei Azure Functions nur die tatsächlich benötigten Ressourcen. Das bringt auf der einen Seite natürlich den Vorteil, dass keine Fixkosten entstehen, auf der anderen Seite den Nachteil, dass im Vorhinein die Kosten nur schwer abschätzbar sind.
Microsoft hat als Abrechnungseinheit die Ausführungszeit definiert und es gibt dazu auch ein Berechnungsbeispiel auf der Produktseite. Um ein besseres Gefühl dafür zu bekomme haben wir testhalber einige unserer Bots auf Azure Functions umgestellt. Die Ergebnisse und Erfahrungen werde ich in einem eigenen Post zusammenfassen.
Das Abrechnungsmodell nach benötigten Ressourcen ist zwar das bevorzugte Modell bei Functions, aber es besteht die Möglichkeit einen normalen App Service Plan zu verwenden. Das kann bei Functions, die sehr häufig ausgeführt werden oder viele Ressourcen benötigen, von Vorteil sein.
Technische Funktionsweise
Die Basis für Azure Functions bildet das Azure WebJobs SDK. Mit WebJobs können ereignisbasiert Background Tasks in Azure Web Apps ausgeführt werden. Da sie aber immer in einer Web App laufen, sind sie was Skalierung und Kosten betreffen auch an diese gebunden.
Für Azure Functions wurde ein eigenes Scripting Modell für das WebJobs SDK entwickelt. Dadurch lassen sich Functions in verschiedenen Sprachen wie JavaScript, C#, Python, F#, PowerShell und viele mehr erstellen.
Da C# keine Skriptsprache ist, wurde das .csx Dateiformat eingeführt. Damit lassen sich Functions in C# erstellen, ohne dass der Code vorher kompiliert werden muss. Das hat allerdings den Nachteil, dass das Skript erst bei der Ausführung kompiliert wird, was wiederum zu Lasten der Performance geht. Des Weiteren gibt es für csx Skripte keinen so umfangreichen Tooling-Support, wie man es als .NET Entwickler eigentlich gewohnt ist.
Visual Studio Tools für Azure Functions
Die ersten Preview Versionen der Visual Studio Tools wurden bereits Ende des letzten Jahres veröffentlicht. Damit konnten neue Functions über einen Assistenten angelegt und konfiguriert werden und man konnte direkt aus Visual Studio nach Azure deployen. Leider gab es einige Einschränkungen, die es für größere Projekte kaum nutzbar machte.
Unterstützt wurden nur die vorhin erwähnten C# Skripte im .csx Format und kein klassisches C#. IntelliSense war nur sehr eingeschränkt verfügbar; Es war nicht möglich neue Dateien in Visual Studio hinzuzufügen und es konnten keine anderen Projekte referenziert werden.
Es hat einige Zeit gedauert, aber in der finalen Version 1.0 wurden diese Einschränkungen nun beseitigt. Functions Projekte in Visual Studio sind jetzt „normale“ C# Projekte. Das heißt sie werden ganz normal kompiliert, was zu einer besseren Performance führt, es gibt volle Unterstützung für IntelliSense und es ist möglich seine gewohnten Tools für Code Analyse und Unit Testing zu verwenden.
Ein paar Probleme gibt es leider immer noch. So sind z.B. keine Assembly Redirects möglich. Um dieses Problem zu beheben sind allerdings grundlegende Änderungen in der Runtime notwendig. Microsoft arbeitet zwar bereits daran, aber bis zur Fertigstellung wird noch einiges an Zeit vergehen.
Fazit
Mit Azure Functions lassen sich sehr einfach ereignisbasierte Micro Services erstellen, die automatisch skalieren und die nach tatsächlich benötigten Ressourcen abgerechnet werden. Mit den Visual Studio Tools für Azure Functions können C# Entwickler nun auch mit ihren gewohnten Tools eigene Functions Projekte erstellen. Ein möglicher Anwendungsfall sind z.B. Chatbots. Wie man mit dem Microsoft Bot Framework und Azure Functions einen Bot erstellt, zeige ich im nächsten Beitrag.