Anfang des Jahres hatte ich bereits die Datenbank meines Blogs, der auf Basis der BlogEngine.NET läuft, auf SQL Azure umgezogen.
Dies ging, mit Hilfe des SQL Migration Wizards, schnell und problemlos von statten.
Mit der Veröffentlichung der BlogEngine.NET Version 2.5.0.9, die u.a. den Database File Store Provider als neues Feature aufweist, waren die Weichen gestellt, um auch den Webserver "schnell und einfach" in eine Windows Azure Rolle umzuziehen.
Allerdings hatte ich mir das, auf Grund meiner bisherigen Erfahrungen mit der Windows Azure Plattform, einfacher vorgestellt…
Mit diesem Blog Post möchte ich eine Miniserie starten, die über Problemstellungen der Migration meines Blogs auf die Windows Azure Plattform berichtet.
Das Problem
Während meiner regelmäßigen Arbeit mit Windows Azure, stellte das Thema "Zeitzoneneinstellungen des Servers" nie ein Problem dar.
Mit dem Umzug meines Blogs sollte sich dies allerdings ändern.
Trotz der richtigen Uhrzeiten der Blog Posts in der SQL Azure Datenbank, waren plötzlich die Posts im RSS Feed, sowie in dem Web Frontend, um 2 Stunden vordatiert.
Einer kurzer Blick auf die Web Rolleninstanzen verriet relativ schnell die Ursache:
Die Web Rolle (Region: Europe North) läuft in der Zeitzone "(UTC) Dublin, Edinburgh, Lisbon, London".
Mein Blog geht allerdings von UTC+1, plus einer Stunde Sommerzeit, aus.
Die Lösung
Somit blieben mir 2 Lösungen:
- Der BlogEngine.NET in den Einstellungen erklären, dass die Serverzeitabweichung 2 Stunden beträgt
- Die Zeitzone des Servers auf "(UTC+2) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna" umstellen
Langfristig gesehen fand ich Option 2 (Das Umstellen der Zeitzone des Servers) die bessere Wahl, da ich weitere Applikationen auf diese Web Rolle migrieren werde.
Somit begann ich im Internet zu suchen, wie man denn die Zeitzoneneinstellungen per Kommandozeile umstellen kann.
Bei Windows Server 2008 R2 bzw. der Windows Azure osFamily="2" wäre dies mit dem TZUtil Befehl möglich gewesen.
Da ich aber aus verschiedenen Gründen noch die osFamily="1", und somit Windows Server 2008, einsetze, blieb nur der Weg über die Registry.
In einem TechNet Blog Post von Michael Murgolo, fand ich allerdings noch eine Alternative, die mit PowerShell Skripten das gleiche Ziel verfolgt. (TechNet Download: PSTimeZoneScripts.zip)
Mit den PowerShell Skripten ausgerüstet, erstellte ich folgendes Skript:
reg add "HKLMSoftwareMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell" /v ExecutionPolicy /d Unrestricted /f powershell.exe "%~dp0Set-TimeZone.ps1" "-name 'W. Europe Standard Time'" >> log.txt 2>> err.txt
Die erste Zeile ermöglicht das Ausführen von nicht signierten PowerShell-Skripten.
Die zweite Zeile setzt die Zeitzone mittels des o.g. PowerShell Skripts
Anschließend musste das Skript nur noch als Startup Task in der ServiceDefinition.csdef registriert werden:
<ServiceDefinition name="WASetTimezone" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Startup> <Task commandLine="StartupSetTimeZone.cmd" executionContext="elevated" taskType="simple" /> </Startup> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> </WebRole> </ServiceDefinition>
Weitere Informationen unter: