Windows Azure IaaS Preview

Im Rahmen des Meet Windows Azure Events hat Scott Guthrie die neuen IaaS Funktionen von Windows Azure vorgestellt. Dieser Blog Post gibt einen ersten kurzen Einblick und Erfahrungsbericht zur Anlage einer Windows 2012 Server VM.

Anmeldung zur Preview

Um die Azure IaaS Services nutzen zu können, muss man sich zunächst unter https://account.windowsazure.com/PreviewFeatures für die Nutzung der Beta Dienste freischalten lassen. In meinem Fall ist das innerhalb von Sekunden geschehen. Kein Vergleich zur teils tagelangen Wartezeit bei der Freischaltung der VM-Role Beta in der Vergangenheit. Der erste Pluspunkt ist damit schon gesammelt.

Provisionierung

Die Erzeugung der VM gestaltet sich äußerst einfach. Im WindowsAzure Administrationsportal startet man den Wizzard zur Erstellung einer neuen VM:

image

und bekommt danach die Auswahl der bereits vordefinierten “Grundsysteme” auf deren die eigene VM basieren soll. In der Auswahl finden sich neben den erwarteten Windows 2008 R2 und Windows 2012 RC sowie einem Microsoft SQL Server 2012 auch Linux Distributionen von OpenLogic, Suse und Ubuntu.

image

In den Wizzard Schritten 2 und 3 werden noch elementare Informationen wie gewünschter “virtual machine name”, Admin Password und gewünschte Instanzengröße abgefragt. Nach Eingabe der Informationen startet auch schon die Erzeugung der VM.

 

VM Anlage

In meinem Fall war nach 9 Minuten eine voll funktionsfähige VM mit Windows 2012 RC fertiggestellt und zur Verwendung online. Da sich die IaaS Funktionen noch offiziell im Beta Stadium befinden darf hier sicherlich mit einer nochmals verbesserten Performance gerechnet werden, sobald das Feature in den Produktivbetrieb geht. Wobei 9 Minuten für die komplette Erzeugung einer VM (incl. Konfiguration und Start) ein Wert ist, der nach meiner Erfahrung in manchen on-premise Umgebungen nicht zur Verfügung steht.

image

Jedwede weitere Konfiguration oder Installation von Software innerhalb der VM kann bequem über eine RDP Verbindung erfolgen. Der Start der RDP Verbindung ist komfortabel über das Portal möglich.

 

Diagnose Daten / Auslastung

Einen großen Fortschritt stellt aus meiner Sicht die sofortige Bereitstellung von Diagnose Daten kurz nach dem Start der VM dar. War es bisher zumindest aufwendig Daten zur Auslastung und Diagnose von VMs zu sammeln, stellt das neue Dashboard hier eine sehr einfache und übersichtliche Darstellung zur Verfügung.

image

Meet Windows Azure; Windows Azure Spring Release

 

imageScott Guthrie hat in der Nacht vom 07.06. zum 08.06.2012 in seiner Key-Note zum “Meet Windows Azure” Event die Features des aktuellen Azure Releases vorgestellt.

Aus meiner Sicht wurden drei absolute Highlights vorgestellt:

IaaS Unterstützung 

image

Die aktuell verfügbare Beta der VM-Role hatte bisher einige “challenges” für uns Entwickler. Unter anderem ist sie state-less. D. h. nach einem Reboot waren alle Informationen die lokal innerhalb der VM gehalten wurden unwiederbringlich verloren. Workarounds sind verfügbar (z. B. ein NTFS formatiertes BLOB Drive oder die Azure Storage Dienste) es blieben aber immer kleine “Aber” bestehen. Diese Probleme gehören ab sofort der Vergangenheit an. Scott hat in seiner Keynote die neuen IaaS Funktionen von Azure vorgestellt. Nicht nur dass die zukünftigen VMs persistent sind und Ihren Status auch nach einem Reboot behalten, man kann jetzt mit ein paar Mausklicks aus bereitgestellten OS-Images die benötigte VM zusammenstellen. Zusätzlich benötigte Software (z. B. Legacy Database oder Software die bisher mit Startup Tasks nicht oder nur schwer installiert werden konnte) kann einfach installiert werden. Unterstützt werden neben Windows als Betriebssystem auch diverse Linux Distributionen. Der Installation eines eigenen Sharepoint Servers, SQL Servers oder einer Legacy App die bisher nur mit Workarounds in einer Azure-Role betrieben werden konnte steht nichts mehr im Wege.

image

Scott ging noch einen Schritt weiter. In einem Slide wurde gezeigt, wie Vhd basierte VMs nicht nur on-premise oder in Azure gehostet werden können. Nein es wurde ausdrücklich von “Other Service Providers” gesprochen.

Damit ist es möglich VMs nicht nur in Azure zu hosten und zu betreiben. Sollte man aus welchen Gründen auch immer die VMs nicht mehr in Azure hosten, kann diese zu einem anderen Provider gegeben werden. Cool!

web sites

Ebenfalls mit ein paar Mausklicks ist es möglich aus Visual Studio (VS 2010 und VS 2012) ein Webprojekt (kein Azure Projekt) zu erstellen und in einem kostenlosen (!!)  shared multi tenant environment innerhalb von Azure zu hosten.

In der Demo wurde gezeigt, wie einfach es ist, durch ein paar Einstellungen im neuen Azure Admin Portal die Applikation aus dem “shared environment” in eine dedizierte Umgebung zu migrieren. D. h. sobald der Traffic auf einer Anwendung sich erhöht und z. B. die Performance des “shared environment” nicht mehr ausreicht, kann diese sehr einfach auf eine dedizierte VM migriert werden.

Damit jedoch nicht genug. Es ist sehr einfach möglich Open Source Projekte ebenfalls in eine “web site” zu integrieren. Möchte man beispielsweise seinen Blog innerhalb von Azure auf Basis von wordpress betreiben oder eine Umbraco basierte Site aufbauen, so war dies bisher immer mit Aufwand verbunden. Erstellen der Azure Role, Installation der nötigen Datenbank, Installation von wordpress oder Umbraco usw.

Visual Studio stellt jetzt einen neue Funktion “Create from template” zur Verfügung. Auf Basis des entsprechenden Templates wird die notwendige Infrastruktur (Datenbank, wordpress oder Umbraco etc.) automatisch in der Azure Role installiert und steht nach wenigen Minuten zur Verfügung.

 

VPN Unterstützung

Der bisherige Azure Connect Service wurde essentiell erweitert und verbessert. Es ist nun möglich, komplette on-premise Netzwerke mit Cloud Diensten in einem VPN miteinander zu verbinden. Microsoft kooperiert hier mit diversen Herstellern von VPN Soft-, und Hardware. Dies ermöglicht es im Azure Administrations Portal die notwendigen Azure Dienste zu konfigurieren und danach die passende Konfiguration für die lokalen Router, Firewalls etc. vom Portal zu laden und damit die on-premise Hardware entsprechend zu konfigurieren. Netzwerkadministratoren werden diese Funktionalität zu schätzen wissen.

Migration ASP.NET Anwendung nach Windows Azure; Membership DB

Vor kurzem hatte ich die Aufgabe eine existierende ASP.NET Anwendung welche Authentifizierung und Autorisierung über die Forms 2.0 Authentication und die in ASP.NET integrierten Controls und Funktionen verwendet nach Windows Azure zu migrieren.

In einem ersten Schritt soll die Applikation nach Windows Azure migriert werden. Auf Sicht ist die Verwendung des AppFabric ACS (Access Control Service) geplant.

Bei der Migration sollten zwei Punkte beachtet werden:

1: Erzeugung SQL Server Tabellen und Schema

Nachdem im Azure Service Portal eine neue Datenbank angelegt wurde, muss das entsprechende Datenbank Schema angelegt werden. Bei einem on-premise SQL Server übernimmt dies das mit Visual Studio installierte Tool aspnet_regsql.

aspnet_regsql

Leider kann das Tool zum Erzeugen der notwendigen Tabellen und Felder nicht verwendet werden. Auch die Migration einer existierenden on-premise Datenbank mit den bekannten Migrationstools funktioniert leider meist nicht.

Abhilfe schafft nur die manuelle Erzeugung der notwendigen Tabellen. Die notwendigen T-SQL Statements können finden sich hier eine detaillierte Anleitung findet sich ebenfalls bei MSDN.

Achtung:

Verwendet man ein lokal installiertes “Sql Server Management Studio” bzw. die entsprechende Express Edition zur Anlage der Tabellenstruktur ist darauf zu achten, dass die “R2” Version verwendet wird. Die Vorgängerversionen werfen einen Fehler beim Connect zur SQL Azure Datenbank.

2: “Trusted Security” vs. “SQL Server Login”

Viele (gerade kleinere) Anwendungen arbeiten mit einer SQL Server Datenbank Datei im App_Data Verzeichnis und damit mit „Trusted Security“ beim Login zum SQL Server.

SQL Azure kennt nun nur den “SQL Server Login”. Deshalb muss der korrespondierende Connection String (meist in der Web.config) geändert werden:

  <?xml version="1.0"?>
  <configuration>
    <connectionStrings>
      <remove name="cpHydraDB" />

      <!--Connection String with DB as attached Instance of SQL Server-->
      <!--Membership Provider-->
      <!--
	<add name="cpHydraDB" 
   	  connectionString="data source=.SQLEXPRESS;
	  User Id=xx; Pwd=xx; 
	  Initial Catalog=C:xxCPHYDRAAPP_DATACPHYDRA.MDF" 
	  providerName="System.Data.SqlClient"/>-->

        <add name="cpHydraDB"
          connectionString="data source=xx.database.windows.net;
	  User Id=xx; Pwd=xx; 
	  Initial Catalog=aspnetdb"
          providerName="System.Data.SqlClient"/>

...

Beachtet man diese zwei Punkte, ist es ein leichtes eine existierende ASP.NET Applikation mit Membership Provider nach Windows Azure zu migrieren.

Debugging Azure Role in lokaler Development Fabric; Diagnostics API

DDC_2012_BannerSpeaker

Letzte Woche hatte ich auf der DDC 2012 am Expertentisch noch eine sehr interessante Diskussion zum Thema Windows Azure Diagnostics API. Wie versprochen hier eine kurze Einführung und Zusammenfassung des Themas. Sowie eine Empfehlung, wie das lokale Debuggen eines Azure Services erleichtert wird.

 

Problemstellung

Zur Überwachung und Abrechnung von Azure Cloud Services (WebRole / WorkerRole) liefert das Azure Diagnostics API Funktionen an die Hand, die das Leben sehr viel einfacher machen.

Sollte mal wieder keine Visual Studio Ultimate Edition zur Verfügung stehen und damit auch kein Intelli-Trace hilft das Diagnostics API auch evtl. Fehler nachvollziehbar zu machen. Gerade deshalb finden sich häufig Kommandos wie:

        protected void Page_Load(object sender, EventArgs e)
        {
            System.Diagnostics.Trace.TraceInformation(
                String.Format("Page_Load {0}",
                DateTime.Now.ToString()));
        }

im Source Code um an markanten Stellen den Programmablauf nachvollziehen zu können. Sobald man einen Service nun in der lokalen Development Fabric entwickelt, kann es sehr schnell zu dem Phänomen führen, dass die Trace Aufrufe nicht sofort ersichtlich sind und nicht im Storage Emulator erscheinen.

Allgemein arbeitet das Diagnostics API nach folgendem Verfahren:

Diagnostics_Overview

1: Cloud Service startet und konfiguriert DiagnosticMonitor

2: DiagnosticMonitor sammelt und verwaltet Trace Info vom Cloud Service und von Windows Datenquellen (IIS Logs, Failed Reqeust Logs, Perf. Counters, Event Logs)

3: Speichert Info im lokalen Filesystem der virtuellen Maschine welche den Cloud Service ausführt.

4: Transferiert in regelmäßigen Abständen oder auf Anforderung die Trace Informationen in einen gültigen Azure Storage Account.

Gerade der Punkt 4 stellt sich hier als Problem dar. Selbst in der lokalen Entwicklungsumgebung (Development Fabric) wird das Verhalten des Diagnostic Monitor simuliert. Dieser überträgt dementsprechend die Trace Informationen nur zeitverzögert in den lokalen Storage Emulator. Dadurch verlieren die Trace Informationen deutlich an Wert.

Lösungsansatz

Beim lokalen Entwickeln bzw. debuggen wird nicht der TraceListener der als Default beim Erstellen eines neuen Cloud Service in der web.config eingebunden wird verwendet sondern ein Listener, der die Trace Ausgaben direkt in den Development Storage schreibt.

<configuration>
  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <!-- Default Trace Listener wird ersetzt -->
        <!--<add type="Microsoft.WindowsAzure.Diagnostics.
             DiagnosticMonitorTraceListener, 
             Microsoft.WindowsAzure.Diagnostics, 
             Version=1.0.0.0, Culture=neutral, 
             PublicKeyToken=31bf3856ad364e35" 
             name="AzureDiagnostics" />-->

        <!-- Trace Listener, welcher direkt in Storage schreibt -->
        <add name="azureLog" 
             type="AzureDiagnostics.TableStorageTraceListener, 
             AzureDiagnostics" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

Der TraceListener <<TableStorageTraceListener>> wird von Microsoft zur Verfügung gestellt und kann einfach geladen werden. Am Ende findet sich ein Link zu einer Beispielapplikation in welcher der Listener ebenfalls enthalten ist.

Als unschön stellt sich nun dar, dass die Web.config vor dem Deploy wieder manuell geändert werden muss um den vorherigen TraceListener zu aktivieren. Visual Studio stellt hier mit den „Visual Studio Configuration Transforms“ aber auch ein elegantes Mittel zum Lösen des Problems zur Verfügung. Einfach im “Configuration Manager” eine neue Build Konfiguration auf Basis der existierenden “Debug” Konfiguration erzeugen. Im Beispiel habe ich sie “Debug – DirectTrace” genannt.

Diagnostics_Configuration

Nun in Visual Studio in der Datei “Web.Debug – DirectTrace.config”

Diagnostics_SolutionNavigator

folgende Transformierung anlegen:

<configuration 
  xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
  </system.web>

  <system.diagnostics>
    <trace autoflush="true">
      <listeners xdt:Transform="Replace">
        <add name="azureLog" 
             type="AzureDiagnostics.TableStorageTraceListener,
             AzureDiagnostics" />
      </listeners>
    </trace>
  </system.diagnostics>

</configuration>

Unter Verwendung der neuen Build Konfiguration kann nun lokal mit dem TraceListener, der sofort in den lokalen Storage Emulator schreibt, gearbeitet werden.

Leider findet sich  noch ein Bug im Azure SDK 1.6.0 der die Transformierung nicht korrekt durchführt. Um den Bug zu umgehen, muss manuell im Projektfile der Azure Solution der Eintrag:

<packagewebrole>true</packagewebrole>

unterhalb von

<Project ...="">
  <PropertyGroup>
    ...
    <packagewebrole>true</packagewebrole>

eingefügt werden.

Beim späteren Cloud Deploy muss nun nichts besonderes beachtet werden, da der neue TraceListener hier nicht zur Verwendung kommt.

Ich hoffe ich kann mit der obigen Beschreibung und der Beispielapplikation alle noch offenen Fragen von der DDC klären.

dotnet Cologne 2012–Identitätskontrolle

DotNetCologneAm 04. Mai war es wieder soweit: Die dotnet Cologne hatte zum vierten mal seine Pforten für die .NET Community geöffnet.

In meinem Talk zum Aufbau von Single Sign-On Lösungen (“Identitätskontrolle”) habe ich im Live-Coding Teil eine Beispielapplikation erstellt welche den Windows Azure Access Control Service verwendet. Auf vielfachen Wunsch findet sich hier der Source Code der erstellten C# Solution.

Die zugehörige Konfiguration des Windows Azure Access Control Service steht ebenfalls online zur Verfügung. Es sollte also keine Probleme beim Nachvollziehen des Beispiels geben.

Wer sich selbst ein Bild von der dotnet Cologne machen möchte kann einen Blick auf das Video vom Konferenztag werfen.

Windows Azure Access Control Service

Im Rahmen der MSDN WebCast Serie „Dienste der Windows Azure Platform“ habe ich einen WebCast zum Thema Windows Azure Access Control Service erstellt.

Alle die sich einen Überblick über die Verwendung von Claims, Active Directory Federation Service (ADFS) und Windows Identity Foundation (WIF) in Verbindung mit dem Windows Azure Access Control Service verschaffen wollen können den WebCast hier herunterladen.

Viel Spaß damit.