Eine Einführung in die Windows Azure Startup Tasks

Azure LogoIn vielen Fällen decken die vorinstallierten Virtuellen Maschinen der Windows Azure Plattform alles ab, was das Entwicklerherz begehrt.
Doch was mache ich, wenn ich weitere Software in meiner Windows Azure Rolle benötige oder die Systemeinstellungen verändert werden müssen?
Hier kommen die Windows Azure Startup Tasks ins Spiel.

Dieser Blog Post gibt einen Überblick, welche Möglichkeiten die Windows Azure Startup Tasks bieten, um Problemstellungen, wie die oben genannten, zu lösen.

 

Wie funktionieren Windows Azure Startup Tasks

Mit Windows Azure Startup Tasks können Skripte bzw. Befehle, als Teil der Startroutine von Web- oder Worker-Rolle, ausgeführt werden.

Hierzu muss die ServiceDefinition.csdef angepasst werden:

<ServiceDefinition name="MyService"
   xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
   <WebRole name="WebRole1">
      <Startup>
         <Task commandLine="Startup.cmd"
               executionContext="elevated"
               taskType="simple" /> 
      </Startup> 
      <Sites>
         <Site name="Web">
            <Bindings>
               <Binding name="Endpoint1" endpointName="Endpoint1" />
            </Bindings>
         </Site>
       </Sites>
   </WebRole>
</ServiceDefinition>

 

  • Innerhalb des <Startup> Elements können eine oder mehrere <Task> Elements eingefügt werden.
    Mit der Reihenfolge der <Task> Elemente wird auch die Startreihenfolge der Startup Tasks festgelegt.
  • Der Wert des commandLine Attributes enthält den Namen des Programms oder Skriptes, welches ausgeführt werden soll (Relativer Pfad zum Stammverzeichnis der Applikation).
  • Der Wert des executionContext Attributs legt die Rechte des Startup Prozesses fest:

    • limited
      Das Startup Task wird mit den gleichen Rechten, wie die der Windows Azure Rolle, ausgeführt.
    • elevated
      Das Startup Task wird mit den Rechten eines Administrators ausgeführt.
      Das verwendete Benutzerkonto ist "NT AUTHORITYSYSTEM".
  • Der Wert des taskType Attributes gibt die Art des Startup Prozesses an:

    • simple (Standardwert)
      Die Ausführung des Startvorganges wird erst fortgesetzt, wenn das Startup Task beendet wurde.
    • background 
      Die Ausführung des Startvorganges wird parallel mit dem Startup Task ausgeführt.
      Diese Startup Task Art ist unter anderem dafür geeignet, Hintergrundprozesse zu initiieren.
    • foreground
      Ähnlich dem Background Startup Task
      Im Gegensatz zum Background Startup Task, kann die Windows Azure Rolle so lange nicht neu gestartet werden, bis der Startup Task beendet ist.

Hinweis
Die Startup Skripte bzw. Befehle sollten so gestaltet sein, dass sie auch mehrmals hintereinander gestartet werden können, ohne unerwünschte Seiteneffekte aufzuweisen.

 

Lebenszyklus einer Windows Azure Rolle

Zum besseren Verständnis möchte ich den Lebenszyklus einer Windows Azure Rolle kurz skizieren:

Lebenszyklus einer Windows Azure Rolle

Nachdem die cspkg und cscfg Dateien in die Windows Azure Plattform hochgeladen wurden, sucht der Fabric Controller passenden Hosts für die Virtuellen Maschinen und erzeugt mehrere Differential VHD Dateien.
Mehr Informationen zu diesem Thema:
Inside Windows Azure, the Cloud Operating System with Mark Russinovich

Hinweis
Der Fabric Controller hat nichts mit der Windows Server AppFabric oder Windows Azure AppFabric zu tun, sondern ist die Basissoftware, die die Windows Azure Plattform steuert.

Sobald die VMs gestartet wurden, werden die Startup Tasks in der angegebenen Reihenfolge gestartet.

Die IISConfigurator.exe führt anschließend die Konfiguration der Internet Information Services (IIS) durch.
Hierzu werden die Einträge des <Sites> Elements, aus der ServiceDefinition.csdef, verwendet.

Außerdem werden die OnStart, Run und später OnStop Methoden, der von RoleEntryPoint abgeleiteten Klasse, ausgeführt.

 

Tips & Tricks

Anbei noch ein paar Tips & Tricks zu diesem Thema.

Erstellen von Startup Skripten in Visual Studio

Beim Erstellen der Skriptdateien mit Visual Studio, muss man sicher stellen, dass in den Eigenschaften die "Copy to Output Directory" Einstellung auf "Copy always" gesetzt ist.

Dateieigenschaften - Copy to Output Directory

Außerdem muss die Datei mit dem "Unicode (UTF-8 without signature) – Codepage 65001" Encoding gespeichert sein.

Visual Studio 2010 Menü - File - Save As...

Save Button Contextmenü - Save with Encoding...

Advanced Save Options

 

Remote Desktops Verbindung zum Debuggen nutzen

Um die Remote Desktop Verbindung zum Debuggen nutzen zu können, sollte man die Startup Tasks auf den taskType="Background" stellen. Somit steht RDP auch bei fehlgeschlagenen Startup Tasks zur Verfügung.

 

PowerShell Skripte

Die PowerShell ist standardmäßig bei den Windows Azure VMs vorinstalliert.
Allerdings erlaubt die ExecutionPolicy nicht, dass unsignierte Skripte ausgeführt werden können.

Je nach verwendeten Betriebssystem bzw. osFamily Einstellungen können folgende Befehle vor bzw. zum ausführen von PowerShell Skripten benutzt werden.

Windows Server 2008 SP1 bzw. osFamily="1"
reg add HKLMSoftwareMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell
/v ExecutionPolicy /d Unrestricted /f
Windows Server 2008 R2 bzw. osFamily="2"
powershell -ExecutionPolicy Unrestricted ./MeinSkript.ps1

Check Also

Time Machine Backups nach Microsoft Azure

Seit einigen Jahren verwende ich eine Apple Time Capsule, um meine Time Machine Backups an einem zentralen Ort speichern zu können. Bislang hatte das für mich auch vollkommen ausgereicht. Seitdem ich jedoch immer mehr unterwegs bin, habe ich nach einer Lösung gesucht, die ich auch von unterwegs nutzen kann. In diesem Blog Post zeige ich deshalb, wie man Time Machine Backups nach Microsoft Azure machen kann.