ÖCK ÄNNER 2015 - Azure für Entwickler

Werbung
ÜR
ÖCK
ÄNNER 2015
Inhaltsverzeichnis
Kapitel
Titel
1
2
3
4
5
6
7
8
Microsoft Azure, der Einstieg in „die Cloud“
Azure Webseiten
Azure SQL
Azure Storage
Azure Virtuelle Maschinen
Azure mit der Powershell
Visual Studio Online
Beispielprojekt
Hamboeck / Azure für Entwickler
Über dieses Buch
Der Einstieg in Microsoft Azure ist aufgrund der vielen angebotenen Dienste nicht ganz
einfach. Dieses Buch soll Abhilfe schaffen.
Der erste Teil dieses Buches richtet sich an Entwickler, oder Teamleiter, die einen Einsteig
in die Microsoft Cloud Plattform wagen wollen.
In acht Kapiteln werden dem Leser schrittweise verschiedene Dienste in der Cloud näher
gebracht, bis ein abschließendes Projekt eine mögliche Anwendung implementiert.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
Über den Autor
Berndt Hamböck ist leidenschaftlicher .NET Softwareentwickler. Seine Schwerpunkte liegen
auf der Microsoft Azure Plattform, sowie der mobilen Entwicklung mit Xamarin.
Des Weiteren ist er fasziniert von den SQL Server Business Intelligence Server und Tools,
und dem Bereich Big Data mit Machine Learning.
Die Spiele-Entwicklung mit Unity und Visual Studio ist da ein spannendes Freizeitvergnügen,
für das Ihm allerdings selten Zeit bleibt.
"Die Microsoft Azure Plattform ist eine
faszinierende
Technologine
Möglichkeit
zu testen
hochverfügbar
Preisen
der
zu
ganzen
und
Welt
Berndt Hamböck
Autor
Bei Fragen, oder Anregungen zu dem Buch schreiben Sie einfach eine E-Mail an:
[email protected]
Falls Sie dem Autor auf Twitter folgen möchten dann ist auch das möglich:
©Soft-Dat GmbH - Berndt Hamböck 2014
diese
vernünftigen
Verfügung zu stellen"
@BerndtHamboeck
neue
zur
Hamboeck / Azure für Entwickler
1
1
Microsoft Azure, der Einstieg in
„die Cloud“
In diesem Kapitel

werden die Vorteile einer Cloud Lösung beschrieben.

werden die Vorbehalte für einen möglichen Cloud-Einstieg beschrieben.

wird erklärt, wo sich „die Microsoft Cloud“ befindet.

werden die Fülle vorhandener Dienste aufgeführt.

wird der eigene Azure-Account angelegt.
Für einen Techniker ist es in der heutigen Zeit - der auch noch sein eigenes Tagesgeschäft zu
betreuen hat - sehr schwer jede Technologie – die interessant erscheint - selbst
auszuprobieren. Man weicht also auf Magazine, Blog-Einträge, Twitter Feeds und Release
Notes aus um sich ein erstes Bild zu machen. Da ist es dann umso verständlicher, wenn man
durch diverse Presseartikel „der Cloud“ ein wenig skeptisch gegenüber steht und vielleicht
auch den eigenen Einstieg in „die Cloud“ dann erst einmal auf unbestimmte Zeit verschiebt.
Das ist meiner Meinung nach sehr schade, denn Microsoft gibt sich auf diesem Gebiet sehr
viel Mühe und hat in diesem Bereich in den letzten Jahren wirklich sehr viel Arbeit, Zeit und
Geld investiert. Wir als (mögliche) Anwender der Cloud können hier profitieren und sollten
dies auch. In diesem Kapitel sehen wir uns mögliche Vorteile einer Cloud-Lösung an und
werden
auch
einen
kostenlosen
30-Tage
Account
anlegen.
Ausprobieren kostet ja erst einmal nichts.
©Soft-Dat GmbH - Berndt Hamböck 2014
Frei
nach
dem
Motto:
2
Hamboeck / Azure für Entwickler
1.1
Was ist „die Cloud“?
Dafür lassen sich bestimmt viele Definitionen finden, aber für Entwickler – für die dieses
Buch geschrieben wurde – bedeutet es, dass sich Anwendungen und Daten nicht mehr auf
dem lokalen Rechner, sondern auf fremden Servern, in einem, oder mehreren Datacenter
befinden. Der Cloud-Betreiber stellt in diesen Datacenter verschiedene Dienste zur
Verfügung. Applikationen und Daten nutzen diese verschiedenen Dienste, dabei gelangt nur
zur Abrechnung, was im Abrechnungszeitraum auch tatsächlich verwendet wurde. Die
Dienste stehen bei Bedarf weltweit zur Verfügung und können auf Wunsch entsprechend
(hoch-) skaliert werden.
1.2
Was ist Azure?
Microsoft Azure ist die Cloud-Lösung von Microsoft. Microsoft kündigte im Jahr 2008 erstmals
eine eigene Cloud-Lösung an: ursprünglich mit dem Namen „Windows Cloud“, danach unter
„Windows Azure“, seit 2014 mit dem Namen „Microsoft Azure“. Microsoft setzt mit Azure
neue Maßstäbe, wenn es um die Möglichkeiten für Infrastrukturlösungen geht oder was
Lösungen für das Entwickler-Team anbelangt. Azure stellt einzelne Dienste zur Verfügung
und es kommen laufend neue Dienste hinzu: alleine auf der TechEd 2014 Europe in
Barcelona wurden in der Keynote sechs weitere davon präsentiert.
1.3
Vorteile einer Cloud Lösung
Ich denke, daß ein (teilweiser) Umstieg auf eine Cloud-basierte Lösung in einem
Unternehmen fünf Vorteile mit sich bringen kann:
1.
Es wird nur bezahlt, was auch tatsächlich an Leistung beansprucht und
verwendet wird.
2.
Es fallen monatliche, (weitgehend) berechenbare Kosten an.
3.
Die Definition von Standard Systemen wird gefördert.
4.
Ein vereinfachtes und schnelleres Deloyment zu Endanwendern wird unterstützt.
5.
Man benötigt weniger In-House Techniker.
Zu den Kosten möchte ich etwas später noch in diesem Kapitel kommen, die anderen
Vorteile sollten in den nachfolgenden Kapiteln deutlich herausgearbeitet werden. Trotz dieser
unbestreitbaren Vorteile, sind natürlich auch Gegenargumente zu erwarten, wenn von dem
Wunsch einer firmenübergreifenden Cloud-Lösung die Rede ist.
1.4
Vorbehalte gegen eine Cloud Lösung
Ich sehe den Vorgesetzten förmlich vor mir, wenn Sie ihm einen Einstieg einer CloudLösung vorschlagen. Den Vortrag, den Sie sich möglicherweise anhören dürfen, wo denn die
Daten überall auftauchen würden, was das denn nur wieder kosten würde, und überhaupt,
wie man auf so eine Schnapsidee kommen kann.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
3
Abbildung 1.1: Viele Vorbehalte existieren, die einem Einstieg in die Cloud entgegenstehen.
Neben all den - teilweise auch leider unsachlichen - Presseartikeln bestehen natürlich
manche Ängste durchaus zu Recht, und sollten natürlich auch angesprochen und diskutiert
werden, bevor ein etwaiger Einstieg in die Cloud erfolgen kann. Das sind Punkte, wie etwa:

Security – wo, und wie sicher sind meine Daten?

Kontrolle – habe ich diese weiterhin über meine Daten?

Kosten – habe ich hier die volle Kostenkontrolle?
Diesen
Themen
sollten
wir
uns
eingehender
widmen,
bevor
wir
ein
mögliches
Einstiegszenario – für Entwickler - in Microsoft Azure andenken.
1.5
Security – wo, und wie sicher sind meine Daten?
Microsoft speichert alle Daten, die sie bereit sind in der Cloud abzulegen, in sogenannten
Azure-Regionen, wo sich die Datacenter befinden. Derzeit gibt es davon weltweit über 100
dieser Datacenter in 17 Regionen. Microsoft selbst nutzt diese für ihr eigenes Angebot an
Cloud-Diensten. Davon gibt es mittlerweile mehr als 200, einige davon sind uns
wohlbekannt, wie Bing, MSN, Outlook.com, Office 365, OneDrive, Skype, Xbox Live und eben
die gesamte Microsoft Azure Plattform.
©Soft-Dat GmbH - Berndt Hamböck 2014
4
Hamboeck / Azure für Entwickler
Abbildung 1.2: Alle Azure Regionen weltweit auf einen Blick.
Zur Zeit (Dezember 2014), verwenden mehr als 1 Milliarde Anwender und 20 Millionen
Microsoft-Kunden diese Dienste.
Um die Erhaltung dieser Dienste kümmert sich das Microsoft Cloud Infrastructure &
Operations (MCIO) Team. Seit der Eröffnung des ersten Datacenter im Jahr 1989 –
mittlerweile gibt es mehr als 100 davon –ca. $15 Milliarden wurden in die Infrastruktur
investiert, und wenn man den Focus in Betracht zieht, den die Azure Plattform für Microsoft
hat, dann ist kein Ende der Investitionen abzusehen.
Die Sicherheit der Daten garantiert Microsoft auf verschiedene Art und Weise. Das
beginnt
mit
physischen
Kontrollen,
wie
Videoüberwachung,
Ausweiskontrollen
und
Fingerabdrucksensoren in den Datacenter. Von den anwesenden Security-Diensten ganz zu
schweigen. Ausgemusterte Festplatten, die geheime Daten beinhalten, werden ausnahmslos
vernichtet.
Bleibt immer noch der Zugriff auf die Daten über das Internet selbst. Hier setzt Microsoft
verschiedene Mechanismen ein, um sich zu schützen, lässt aber auch externe Prüfer in die
Datacenter, die Überprüfungen durchführen und z. B. folgende Zertifizierungen vergeben:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
5
Tabelle 1.1 Azure Datacenter Zertifizierungen
Zertifizierung
ISO/IEC 27001:2005
SOC 1 and SOC 2 SSAE 16/ISAE 3402
Cloud Security Alliance Cloud Controls Matrix
Federal Risk and Authorization Management Program (FedRAMP)/ Federal
Information Security Management Act (FISMA)
Payment Card Industry (PCI) Data Security Standards (DSS) Level 1
1.6
Kontrolle – habe ich diese weiterhin über meine Daten?
Möglicherweise ist es firmenintern nicht einfach zu vertreten, wenn die eigenen Daten das
eigene Rechenzentrum verlassen sollen und quasi an den Cloud-Anbieter übergeben werden
sollen. Auch aus rechtlicher Sicht kann dies zu Problemen führen, da die Daten z. B. die EU
nicht verlassen dürfen. Glücklicherweise kann der Ablageort der eigenen Daten definiert
werden. Dass die Daten in einer der 17 Azure Regionen gespeichert werden, das ist soweit
einmal klar, aber in welcher dieser Regionen, bzw. in welchem Datacenter? Nun, die Wahl
des Speicherortes liegt in erster Linie einmal bei uns selbst, da für die Azure Dienste
während des Anlegens die Region anzugeben, bzw. auszuwählen ist. Der Ort kann durch
Vorgaben definiert sein (Stichwort EU), oder beispielsweise auch durch die Lokation der
Anwender vorgegeben sein – die Daten sollten aus Performance-Gründen möglichst nahe bei
den Anwendern gespeichert sein. Oder verschiedene Dienste, die zusammenarbeiten
(Stichwort: geringer Network-Traffic) – wie z .B. Azure Webseiten und Azure SQL – sollten
sich per Definition möglichst im gleichen Datacenter befinden. Die Azure-Region und die
zugehörigen Orte sind in Tabelle 1.2 zu sehen, die Auswahl erfolgt wie gesagt nach eigenen
Kriterien.
Tabelle 1.2 Azure Datacenter nach Region
Azure Region
Ort
Central US
Iowa
©Soft-Dat GmbH - Berndt Hamböck 2014
6
Hamboeck / Azure für Entwickler
East US
Virginia
East US 2
Virginia
US Gov Iowa
Iowa
US Gov Virginia
Virginia
North Central US
Illinois
South Central US
Texas
West US
California
North Europe
Ireland
West Europe
Netherlands
East Asia
Hong Kong
Southeast Asia
Singapore
Japan East
Saitama Prefecture
Japan West
Osaka Prefecture
Brazil South
Sao Paulo State
Australia East
New South Wales
Australia Southeast
Victoria
Jetzt sind uns die Orte bekannt, aber ist es immer eine gute Lösung, wenn die Daten nur
an einer einzigen Stelle gelagert werden? Was würde im Falle eines Desasters im Datacenter
in Irland passieren? Natürlich wären diese im SCHLIMMSTEN Fall verloren, aber wir als
Azure-Dienst-Anwender können hier einiges dagegen tun - das bedeutet aber nicht nur
Backups der Daten anzulegen (schaden wird es dennoch niemals). Wir können uns nämlich
auch dafür entscheiden, wie unsere Daten und in welche Regionen unsere Daten repliziert
werden. Wir sehen das später im Kapitel über den Azure Storage.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
7
Wir wissen also, wo unsere Daten gespeichert sind, bzw. wo die Maschinen tatsächlich
physikalisch existieren (wenn die genauen Orte auch ein kleines Geheimnis von Microsoft
sind). Wichtig ist für uns, dass wir jederzeit auf unsere (virtuellen) Maschinen und unsere
Daten zugreifen können. Und das ist 24h x 7 Tage lang gegeben. Wir können über das Azure
Management Portal jederzeit unsere Dienste einsehen, anlegen, bearbeiten, oder auch
löschen. Auch eigene Lösungen können mit den Azure Management APIs entwickelt werden,
wie wir ebenfalls in einem eigenen Kapitel sehen werden.
Kosten – habe ich hier die volle Kostenkontrolle?
1.7
Zuerst einmal kann gesagt werden, dass sowohl der Start mit Microsoft Azure kostenlos
ist, als auch das Beenden des Accounts und der zugehörigen Abonnements nichts kostet.
Für einen Azure Account können mehrere Abonnements angelegt werden, z. B. eines über
eine bestehende MSDN Subscription, worüber dann einige Dienste abgerechnet werden
sollen (um die MSDN-Gutschrift aufzubrauchen), ein weiteres Abonnement, über welches
Kosten über eine bestimmte Kreditkarte abgerechnet werden, usw.
Alles
was
nun
zwischen
dem
Anmelden
und
der
Abmeldung
passiert
kostet
möglicherweise Geld. Wieviel? Nun, das hängt von folgenden Faktoren ab:

Der Anzahl der genutzten Diensten

Möglicherweise von der Region des genutzten Dienstes

Der Dauer der Nutzung des Dienstes im Monat
Wichtig ist an dieser Stelle, es wird nur verrechnet, was auch verbraucht wurde, bei
den meisten Services ist das auf die Minute genau (und nicht automatisch z. B. ein ganzer
Monat), bzw. der tatsächliche (von Azure ausgehende) Datenverkehr. Vorberechnen und
überprüfen
lassen
sich
die
Kosten
im
Preisrechner,
dieser
http://azure.microsoft.com/de-de/pricing/calculator/
Abbildung 1.3: Kategorien des Kostenrechners
©Soft-Dat GmbH - Berndt Hamböck 2014
ist
hier
zu
finden:
8
Hamboeck / Azure für Entwickler
Der Preisrechner unterteilt die Dienste in fünf verschiedene Kategorien und es lässt sich
ein „was-wäre-wenn“ Szenario auf einfachste Weise sofort online durchspielen.
Falls z. B. eine SQL-Server Web-Edition benötigt wird, auf den keine allzu großen
Herausforderungen zukommen werden, dann reicht vermutlich eine Maschine mit 1 Core, 3.5
GB Ram und 10GB SSD-Speicherplatz. Dieser kommt auf €89.76 im Monat – falls dieser 24h
x 7 Tage zur Verfügung steht.
Abbildung 1.4: Beispiel des Kostenrechners
Sobald ein Azure Account aktiviert wurde (und somit auch ein Abonnement angelegt
wurde), und Dienste in Verwendung sind, sind die aktuell anfallenden Kosten jederzeit online
einsehbar. Die verbrauchte Datenmenge, oder Rechenzeit ist aufgelistet und das gesamte
Guthaben, bzw. der anfallende Rechnungsbetrag aufgelistet, diese Details ist jederzeit
abrufbar unter: http://manage.windowsazure.com/.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
9
Abbildung 1.5: Aktuelle Kosten im Blick.
Des Weiteren ist es möglich eine Abrechnungsbenachrichtigung einzurichten, um per EMail informiert zu werden, sobald eine festgelegte Summe überschritten wird. Es kann dann
©Soft-Dat GmbH - Berndt Hamböck 2014
10
Hamboeck / Azure für Entwickler
dementsprechend reagiert werden, indem Dienste (z. B. virtuelle Maschinen) beendet
werden, oder der Ressourcen-Verbrauch reduziert wird (z. b. Speicherplatz, Redundanzen).
Wie man somit sehen kann, komplette Kostenkontrolle, jederzeit und überall, ich denke
das klingt so verlockend, dass man es direkt einmal ausprobieren sollte.
1.8
Der eigene Azure Account – über MSDN
Sollte ein MSDN-Abonnement vorhanden sein, dann lohnt sich die Anmeldung, bzw. das
Anlegen eines Azure Abonnements über das MSDN Portal, da hier jedes Monat Gutschriften
zum Verbrauch von Azure Services zur Verfügung stehen. Die Höhe hängt von der Art der
MSDN Subscription ab. Nachfolgend sind die aktuellen Guthaben (Stand Dezember 2014) für
die
jeweilige
MSDN-Subscription
aufgelistet
–
inklusive
einer
etwaigen
Anwendungsmöglichkeit für die Premium-Edition.
Abbildung 1.6: MSDN-Credits
Diese Guthaben reichen auch für einen längeren Zeitraum, da beim MSDN-Abonnement
auch reduzierte Stundensätze inkludiert sind. Es wird ein Rabatt in Höhe von 33% auf
virtuelle Windows-Computer und ein Rabatt in Höhe von 25% auf Cloud-Dienste, HDInsight
und Webseiten gewährt. Des Weiteren kann die vom MSDN-Abonnement abgedeckte
Software zu Entwicklungs- und Testzwecken ohne weitere Kosten unter Azure, z. B. für
virtuelle Maschinen genutzt, werden. Um ein Abonnement mit den Azure Benefits anzulegen,
muss
man
sich
im
MSDN
Portal
anmelden
und
über
©Soft-Dat GmbH - Berndt Hamböck 2014
die
Management
Seite
Hamboeck / Azure für Entwickler
11
https://msdn.microsoft.com/subscriptions/manage/ den Link für das Aktivieren von Microsoft
Azure verwenden.
Abbildung 1.7: Aktivieren der MSDN-Benefits
Sollte noch kein Azure Account bestehen, dann ähneln sich die Schritte wie im nächsten
Abschnitt beschrieben. Falls schon ein Azure Account vorhanden ist können die MSDNBenefits ebenfalls genutzt werden, da es ja kein Problem ist, mehrere Abonnements
anzulegen.
1.9
Der eigene Azure Account – als Trial
Um in die Microsoft Azure Plattform einzusteigen, benötigt man einen Azure Account.
Diesen kann man einmalig pro Microsoft Account für 30 Tage kostenlos verwenden, bzw. für
Testzwecke einsetzen. Um diesen Testzugang anzulegen, benötigt man einen Browser seiner
Wahl und schon kann es los gehen unter: http://azure.microsoft.com/
©Soft-Dat GmbH - Berndt Hamböck 2014
12
Hamboeck / Azure für Entwickler
Abbildung 1.8: Azure Startseite
Durch den Klick auf den Link rechts oben, bzw. unten in der Mitte kann es auch schon
fast losgehen mit der kostenlosen Testversion, zuvor sehen wir noch, was uns diese
Testversion bietet.
Abbildung 1.9: Features der Azure Testversion
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
13
Es ist deutlich zu erkennen, dass wir 1 Monat Zeit haben, um insgesamt bis zu €150,-- an
Azure-Diensten (in dieser Zeit) zu nutzen. Im nächsten Schritt werden wir aufgefordert uns
mit einem Microsoft-Konto (welches noch niemals einen Azure-Testaccount verwendet hat –
da ansonsten dieses Angebot nicht genutzt werden kann) anzumelden.
Abbildung 1.10: Anmelden mit dem Microsoft-Konto.
Nun folgen noch vier Schritte, um in den Genuss des Test-Abonnements zu kommen:

Eingabe der persönlichen Informationen (diese werden aus dem Microsoft-Konto
übernommen)

Eingabe einer Mobilfunknummer (auf diese wird umgehend eine SMS mit einem
Verifizierungscode gesendet)

Eingabe der Kreditkarteninformationen (diese werden aber nicht zur Verrechnung
verwendet, sondern zur (zusätzlichen) Feststellung der Identität benötigt)

Einverständniserklärung
©Soft-Dat GmbH - Berndt Hamböck 2014
14
Hamboeck / Azure für Entwickler
Abbildung 1.11: 4 Schritte zur Registrierung
Nach Eingabe der Informationen folgt die Zusammenfassung und durch Drücken des
“Kaufen”-Buttons wird das Azure Test-Abonnement gestartet. Gekauft wird nicht wirklich
etwas, da keinerlei Kosten anfallen können. Wird das Guthaben verbraucht, werden die
Azure Services gestoppt. Die Kreditkarte wird zu keinem Zeitpunkt belastet.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
15
Abbildung 1.12: Erstellen des Abonnements
Das Azure Abonnement wird erstellt und nach erfolgter Aktivierung erfolgt die
Weiterleitung zur Seite: https://account.windowsazure.com/Subscriptions.
Jetzt erhält man die Möglichkeit, den Azure Account vollständig zu aktivieren, das
bedeutet, dass bei weiterer Nutzung über den Testzeitraum hinaus, bzw. nach Verbrauch des
Guthabens, monatliche Kosten anfallen. Es besteht keinerlei Zwang dies an dieser
Stelle zu tun, die Default-Einstellungen sind in Ordnung, es muss nichts angepasst
werden, wenn Azure nur mit dem Guthaben für 30 Tage getestet werden möchte.
Abbildung 1.13: Test-Abonnement Aktivierungs-Information
©Soft-Dat GmbH - Berndt Hamböck 2014
16
Hamboeck / Azure für Entwickler
Jetzt ist der Blick frei für den aktuellen “Kontostand” des Azure Abonnements. 30 Tage
und €150 stehen zur Verfügung und warten darauf verwendet zu werden.
Abbildung 1.14: Übersicht Test-Abonnement
Nach dem Ablauf der 30 Tage, bzw. nach dem Verbrauch der €150 – was früher eintritt werden die Dienste gestoppt. Nach Ablauf der 30 Tage ist das Abonnment inaktiv
(abgelaufen), es kann aber wieder aktiviert werden, dann sind allerdings auch die
monatlichen Kosten für die anfallenden Dienste zu tragen. Optional kann auch ein neues
Abonnement angelegt werden und Azure Dienste in dieses neue Abonnement übernommen
werden.
Rechts oben befindet sich der Link zum Azure Portal, in dieses kann nun gewechselt
werden, um Azure Dienste anzulegen.
1.10
Das Management Portal
Nachdem der Test-Account angelegt wurde wird man zum Azure Management-Portal
unter der URL https://manage.windowsazure.com weitergeleitet. Da ja alle Dienste nicht
mehr vor Ort in einem, oder mehreren Datacenter von unserem aktuellen Standort liegen, ist
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
17
ein gutes Online-Verwaltungstool für den Cloud-Anwender essentiell. Dieses Verwaltungstool
nennt man das Azure Management Portal. Beim erstmaligen Einstieg wird man mit einem
Wizard begrüßt.
Abbildung 1.15: Einführungs-Wizard für das Azure Management Portal
Dieser Wizard stellt auf vier Seiten die wichtigsten Schritte zur Bearbeitung der Azure
Dienste vor. Der erste Schritt zeigt beispielsweise, wie man zur Abmeldung, oder zur
aktuellen Rechnungsübersicht gelangt.
©Soft-Dat GmbH - Berndt Hamböck 2014
18
Hamboeck / Azure für Entwickler
Abbildung 1.16: Demo Hauptmenü
Das Erstellen eines neuen Azure Services wird im nächsten Schritt erläutert.
Abbildung 1.17: Demo “Neu erstellen” für ein Service
Danach wird die Befehlsleiste vorgestellt, diese befindet sich immer am unteren
Bildschirmrand und passt sich dem aktuell gewählten Azure Service an.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
19
Abbildung 1.18: Demo Befehle für ein Azure Service
Hin und wieder gibt es Benachrichgungen in der Befehlsleiste zu sehen. Dies können
Warnungen sein, wie etwa ablaufende Test-Accouts, oder aktuelle Fehler, wenn etwas einmal
nicht klappen sollte, wie man sich das vorstellt, z. B. das Anlegen eines Azure Services.
Abbildung 1.19: Demo Benachrichtigungen
Nachdem der Wizard beendet wurde, erscheint das Portal so, wie man es bei jedem
weiteren Einstieg zu Gesicht bekommt. Auf der linken Seite ist der Bereich ALLE ELEMENTE
angewählt und in der Mitte sind diese Elemente aufgelistet. Es befindet sich zumindest ein
Element in dieser Auflistung, das Standardverzeichnis (Azure Active Directory).
©Soft-Dat GmbH - Berndt Hamböck 2014
20
Hamboeck / Azure für Entwickler
Abbildung 1.20: Azure Portal
Dieses kann man durch Anklicken des kleinen Pfeils
anwählen und gelangt so zu den
Details dieses Azure Services.
Abbildung 1.21: Details des Active Directory Services
Man gelangt wieder zurück zu der Übersichtsseite durch Drücken des großen ZurückButtons in der linken oberen Ecke.
Abbildung 1.22: Navigation zur Übersichtsseite
Diese Art der Navigation ist für alle zur Verfügung gestellten Azure Services gleich. Was
uns noch fehlt ist die Anwahl eines einzelnen Bereiches auf der linken Seite, um ein neues
Azure Service anzulegen. Bereiche gibt es einige zu entdecken, diese werden auch
regelmäßig erweitert und nachfolgend ist der aktuelle Stand von Dezember 2014 aufgeführt.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
1.11
21
Azure Dienste
Die Fülle an Azure-Diensten ist mittlerweile nahezu überwältigend und es fällt einem
relativ schwer hier noch Schritt zu halten, so schnell werden neuen Dienste zur Verfügung
gestellt, bzw. bestehende Dienste erweitert. Microsoft unterscheidet 4 verschiedene
Kategorien, um die Azure Dienste einzugliedern:

Compute, bzw. Server

Data-Services

App Services und

Netwerkdienste
Nachfolgend eine Aufstellung der verfügbaren Dienste, je nach Kategorie.
Diese sind, wie bereits erwähnt, eben eine ganze Menge an Diensten, ich werde in den
nächsten Kapiteln einige davon herausgreifen (diese sind in der Tabelle fett dargestellt) und
diese näher beschreiben. Da dieses Buch eher auf die Entwickler-Gemeinde abzielt sind dies
natürlich die Dienste, die für diese Zielgruppe relevant sein könnten. Alle anderen Dienste
finden eine kurze Erwähnung, bzw. Erläuterung.
©Soft-Dat GmbH - Berndt Hamböck 2014
22
Hamboeck / Azure für Entwickler
Tabelle 1.3 Azure Dienste nach Region
Azure Dienste (Dezember 2014)
COMPUTE
APP SERVICES
Websites
BizTalk Services
Virtual Machines
Active Directory
Mobile Services
Service Bus
Cloud Services
Media Services
Batch
Notification Hubs
DATA SERVICES
Multi-Factor Authentication
SQL Database
Scheduler
Storage
Visual Studio Online
HDInsight
CDN
Managed Cache
Automation
Backup
RemoteApp
Redis Cache
API Management
Site Recovery
Event Hubs
StorSimple
NETZWERK Dienste
Machine Learning
Virtual Network
DocumentDB
Traffic Manager
Azure Search
ExpressRoute
Data Factory
Stream Analytics
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
1.12
23
Zusammenfassung
Dieses Kapitel widmete sich Überlegungen, die für einen bzw. gegen einen möglichen CloudEinstieg stehen. Die Microsoft Cloud-Lösung befindet sich physisch in einer der 17 AzureRegionen mit den zugehörigen Orten. Es wird mittlerweile eine Fülle von Diensten
angeboten, es sollte also für nahezu jede Anwenderschicht etwas Passendes zu finden sein.
Die Azure-Cloud ist nicht gänzlich kostenlos, die Dienste verursachen monatliche Kosten, es
wird
allerdings
nur
das
abgerechnet,
was
auch
verbraucht
wurde,
dies
zumeist
minutengenau. Der Anwender behält die volle Kontrolle über die Kosten und diese werden
auch jederzeit transparent dargestellt und sind jederzeit einsehbar. Der eigene Azure
Account ist schnell angelegt, mit einer MSDN-Subscription sind monatliche Benefizien
verbunden, die auch genutzt werden sollten, da diese sonst verfallen. Ein 30-tägiges TestAbonnement kann einmalig für einen Microsoft-Account verwendet werden, mit diesem
stehen sofort €150,-- während der Testzeit zur Verwendung verschiedener Azure-Dienste zur
Verfügung. Ich kann nur sagen: Microsoft Azure, wir kommen! Ich bin mir ziemlich sicher,
dass wir, einmal dabei, immer auf „die Cloud“ zurückgreifen werden.
Im nächsten Kapitel werden wir unseren ersten Azure Dienst nutzen, die Azure
Webseiten.
©Soft-Dat GmbH - Berndt Hamböck 2014
24
Hamboeck / Azure für Entwickler
2
Azure Webseiten
In diesem Kapitel

werden die Vorteile von Azure Webseiten erläutert

werden zwei eigene Webseiten angelegt

verschiedene Deployment-Varianten beschrieben

Skalierungsmöglichkeiten dargestellt

Staging-Slots und Swaps verwenden

die Kosten für Azure-Webseiten ermittelt
Den sanftesten Einstieg in die Cloud-Entwicklung bieten mit Sicherheit die Azure Webseiten.
Diese sind, wie wir sehen werden, einfach zu konfigurieren und einfach zu deployen und
bieten den Vorteil, dass sich Entwickler nur noch um die Software zu kümmern haben, aber
nicht unbedingt um die physische Umgebung in der die Web-Applikation läuft.
Azure Webseiten dienen dazu, Web-Seiten oder aber auch komplette Web-Applikationen in
Azure zur Verfügung zu stellen. Es ist ein einzelner Dienst, der aber bei Bedarf mit weiteren
Azure Diensten – wie z. B. Datenbanken, Active Directory, Office365, oder Messaging kombiniert werden kann. Azure Webseiten stellt also eine Plattform für die eigene Webseite,
oder Web-Applikation zur Verfügung, beschränkt den Entwickler aber keineswegs, denn es
können auch Nicht-Microsoft-Dienste angebunden werden, wie Twitter oder DropBox.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
3.1
25
Warum Azure Webseiten?
Bisher waren wir als Entwickler gewohnt, eine Webseite bzw. eine ASP.Net Web-Applikation
in Visual Studio zu erstellen und diese dann in einen IIS zu deployen. Das InfrastrukturTeam stellte zumindest zwei Server zur Verfügung – einen für den Testbetrieb und einen für
den produktiven Betrieb. Wenn etwas im Betrieb nun nicht funktionierte, war entweder der
Fehler beim Entwickler zu suchen (die Web-Applikation funktioniert nicht entsprechend),
oder bei der Hardware, dem Netzwerk, dem Betriebssystem, der Installation, bzw.
Konfiguration des IIS auf dem Server – wobei hier meist das Infrastruktur-Team bei der
Behebung des Problems mithalf. Die volle Verantwortung liegt also so lange bei der eigenen
Mannschaft, so lange die Web-Applikation im eigenen Datacenter liegt, wie Abbildung 1 ganz
links darstellt.
Abbildung 3.1: Webseiten im eigenen Datacenter, oder unter Windows Azure.
Dies kann nun schrittweise vereinfacht werden, bis hin zu den Azure Webseiten, wo sich
Microsoft um alles, wirklich alles, außer der Web-Applikation selbst kümmert. Das bedeutet
nicht nur, dass Updates/Security Fixes automatisch eingespielt werden, sondern auch, dass
die Web-Applikation unter Last automatisch skaliert – sei es durch Load-Balancer, mit
stärkeren Maschinen bei Last, oder Geo-Redundanzen der Webseite. Dazwischen gibt es noch
als
Optionen
weitere
Abstufungen,
wie
die
eigene
virtuelle
Maschine,
oder
Web-
Applikationen, die sich in das Corporate-Network als Intranet-Anwendungen einfügen lassen.
Die Idee hinter den Azure Webseiten ist, erst einmal mit der eigenen Webseite oder WebApplikation einfach „loslegen“ zu können, diese jederzeit nach den eigenen Wünschen
©Soft-Dat GmbH - Berndt Hamböck 2014
26
Hamboeck / Azure für Entwickler
skalieren zu lassen, ohne sich um die Beschaffung und Inbetriebnahme der Infrastruktur zu
kümmern. Entwickelt werden kann mit jeder beliebigen Programmiersprache, sei es ASP.Net,
PHP, oder Node.JS.
Nach dem Deployment stehen Tools für das Monitoring der Performance, bzw. zur
Diagnose bei Fehlern und Problemen zur Verfügung. Im Azure Management Portal können
sofort Anpassungen durchgeführt werden, um einen reibungslosen Betrieb der Azure
Webseite zu erreichen. Für die weitere Entwicklung stehen Staging-Slots zur Verfügung, um
die Änderungen vorab testen zu können.
3.2
Anlegen der ersten eigenen Webseite
In diesem Abschnitt wollen wir zwei eigene Webseiten anlegen, eine für eine Webseite,
bzw. Web-Applikation und eine zweite, um eine Blogging-Webseite zu erstellen. Für das
Erstellen der Webseite gibt es verschieden Möglichkeiten, sei es durch Visual Studio, oder
das Azure Management Portal. Auch für das Deployment stehen fast schon unzählige
Varianten zur Verfügung, einige davon möchte ich beschreiben.
3.2.1
Über Visual Studio
Im Zuge des Erzeugens einer neuen ASP.NET-Web Applikation kann auch gleichzeitig die
Azure Webseite erzeugt werden. Dazu benötigt man Visual Studio 2015 und wählt ein neues
Projekt, Web und ASP.NET Web Application aus, vergibt einen sprechenden Namen (in
meinem Fall „svobi“).
Abbildung 3.2: Neue Web Applikation in Visual Studio
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
27
Im zweiten Schritt wird es gleich spannend, hier ist das Häkchen für „Host in the Cloud“
zu setzen.
Abbildung 3.3: Hosting Option aktivieren
Nach erfolgter Anmeldung mit dem Azure Account, besteht die Möglichkeit eine neue URL
zu vergeben, die Azure Subscription zu wählen, die Region und eine Datenbank.
Abbildung 3.4: Eintragen des Namens
©Soft-Dat GmbH - Berndt Hamböck 2014
28
Hamboeck / Azure für Entwickler
Falls die Azure Webseite schon existiert, erscheint eine entsprechende Fehlermeldung,
wäre die Webseite in Azure noch nicht reserviert, dann würde diese nun angelegt werden.
Ich möchte an dieser Stelle den Versuch abbrechen und das Anlegen einer Azure Webseite
im Management Portal vorstellen.
3.2.2
Im Azure Management Portal
Der erste Schritt, um eine neue Webseite im Azure Management Portal anzulegen, ist auf
den Reiter für die Webseiten zu wechseln. Der zweite Schritt ist den NEU-Button zu drücken,
der links unten im Portal ersichtlich ist.
Abbildung 3.5: Anwählen des Azure Webseiten-Bereichs im Portal und der Neu-Button
Nun ist der Auwahlbereich zu sehen, der Bereich SERVER und WEBSITE sind bereits
vorausgewählt. Es gibt nun drei verschiedene Möglichkeiten eine neue Webseite im Azure
Management Portal anzulegen.
Abbildung 3.6: Erfassen der Webseite
Die erste Variante ist die Schnellerfassung. Mit der Schnellerfassung sind folgende beiden
Werte auszuwählen:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
29

URL – Das Feld muss eine Zeichenfolge mit 2 bis 60 Zeichen enthalten und darf nur
Buchstaben, Zahlen und Bindestriche enthalten. Das erste und letzte Zeichen im Feld
muss jeweils ein Buchstabe oder eine Zahl sein. Die gesamte Adresse muss weltweit
eindeutig sein (im azurewebsites.net-Namensbereich). Die Webseite ist nach dem
Anlegen durch folgenden Link erreichbar: http://<url>.azurewebsites.net, in dem
Beispiel in Abbildung 3.6 also durch http://svobi.azurewebsites.net. Wir werden später
noch sehen, wie auch ein eigener Domänenname für die Azure Webseite verwendet
werden kann.

WEBHOSTINGPLAN – wo, d. h. in welcher Region und Datacenter die Webseite
physikalisch existiert. Falls dieser bereits exisitiert, dann kann optional auch ein neuer
Webhostingplan erstellt werden, um die Webseite in einer anderen Region abzulegen,
um beispielsweise den Anwendern in den USA, oder Asien die Webseite im wahrsten
Sinne des Wortes „näher zu bringen“.
Abbildung 3.7: Neuer Webhostingplan
Anschließend ist die Region zu wählen, diese legt wie in Kapitel 1 beschrieben den
Speicherort der Daten fest.
©Soft-Dat GmbH - Berndt Hamböck 2014
30
Hamboeck / Azure für Entwickler
Abbildung 3.8: Region für den neuen Webhostingplan
Durch Klick auf den Button wird die Webseite sofort angelegt und kann bereits im Browser
aufgerufen werden.
Die zweite Variante ist BENUTZERDEFINIERT ERSTELLEN.
Abbildung 3.9: Benutzerdefiniert erstellen
Durch die Anwahl dieses Punktes ändert sich der rechte Bereich und es kann zusätzlich
(optional) eine Datenbank ausgewählt werden und die Bereitstellungsvariante (Deployment)
konfiguriert werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
31
Abbildung 3.10: Eingabemaske bei benutzerdefinierter Erstellung
Natürlich können beide Punkte auch nachträglich konfiguriert werden, wenn zuvor die
SCHNELLERFASSUNG gewählt wurde, tatsächlich werden wir das Deployment später
nachträglich konfigurieren. Für die Datenbank stehen drei Auswahlmöglichkeiten zur
Verfügung.
Abbildung 3.11: Auswahl der Datenbank
©Soft-Dat GmbH - Berndt Hamböck 2014
32
Hamboeck / Azure für Entwickler
Für unsere Zwecke benötigen wir (vorerst) keine Datenbank. Falls Sie noch keine
Webseite angelegt haben, so tun Sie dies bitte nun – mit einem eigenen Namen, den Sie sich
bitte merken. Egal für welche Variante Sie sich entschieden haben (Schnellerfassung, oder
Benutzerdefiniert erstellen), es sollte jetzt eine neue Webseite – ihre eigene - vorhanden sein
(in meinem Beispiel ist das die „svobi“-Webseite). Sie können ihre eigene Webseite gleich
gerne
einmal
mit
dem
Browser
ihrer
Wahl
aufrufen
(die
URL
hierfür
ist
http://<URL>.azurewebsites.net).
Nun sollten wir noch gleich eine zweite Webseite anlegen. Der Dienst Azure Webseiten
liefert auch vorgefertigte Webseiten mit, die sofort einsatzbereit sind, den sogenannten
Katalog, womit wir bei der letzen, der dritten Variante wären.
Abbildung 3.12: Erstellung aus Katalog
Beispiele aus dem Katalog sind CRM Systeme, wie Drupal, Joomla, oder auch Wordpress,
oder leere ASP.NET, bzw. PHP, oder Node.JS Webseiten, es wird aber beispielsweise auch
Tomcat unterstützt. Wie man sehen kann, versucht Microsoft hier allen derzeitigen WebStandards genüge zu tun, ohne dabei auf irgend eine Art einzuschränken. Ich würde gerne
eine zweite Webseite anlegen, diese soll den Blog für die erste Webseite bereitstellen. Dazu
bietet sich aus dem Katalog die „BlogEngine.NET“ Vorlage an.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
33
Abbildung 3.13: BlogEngine.NET als Vorlage für die Webseite
Auf der zweiten Seite ist wiederum eine weltweit eindeutige URL, sowie die Region
einzutragen, bzw. auszuwählen.
©Soft-Dat GmbH - Berndt Hamböck 2014
34
Hamboeck / Azure für Entwickler
Abbildung 3.14: Name der Webseite mit BlogEngine.NET
Durch Drücken des
Buttons wird die zweite Webseite erstellt. Beide Webseiten stehen
nun im Browser zur Verfügung und zwar mit folgenden URLs:
http://svobi.azurewebsites.net/
http://svobiblog.azurewebsites.net/
Abbildung 3.15: Eigener Blog aud dem Azure Webseiten-Katalog
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
35
Die beiden Webseiten existieren nun, die „svobiblog“-Webseite macht was sie soll (diese
stellt einen Blog ins Internet), da ja ein Template verwendet wurde. Die erste Webseite
wartet allerdings noch, um mit Inhalt gefüllt zu werden. D. h. wir müssen unseren eigenen
Content auf diese Webseite bringen, zuvor sollten wir uns aber kurz ein wenig mit dem Azure
Management Portal und den Eigenschaften der Azure Webseiten beschäftigen.
3.3
Eigenschaften der Azure Webseite
Für unsere angelegten Azure Webseiten sehen wir uns nun an, wie man zu den
Eigenschaften navigiert und welche Bereiche es für eine Webseite gibt. Dazu wählen wir die
erste der beiden Webseiten aus.
Abbildung 3.16: Anwählen der Webseite im Azure Management Portal
Wir befinden uns nun im Bearbeitungsbereich für diese eine, gewählte, Webseite .
Abbildung 3.17: Bearbeiten der Webseite svobi
Es sind folgende Bereiche zu sehen:

DASHBOARD – Überblick und essentielle Informationen über die Webseite, wie die
Verbindungsdaten, Site-URL, FTP-Daten und Veröffentlichungsprofil (für Visual
Studio). Von hier können auch einige der Punkte direkt angewählt werden, die in
anderen Bereichen liegen (Protokolle, Diagnose, Skalierung konfigurieren, usw.).

BEREITSTELLUNGEN – Informationen über das Deployment (wann hat wer welche
Dateien eingespielt).
©Soft-Dat GmbH - Berndt Hamböck 2014
36
Hamboeck / Azure für Entwickler

ÜBERWACHEN – Informationen über die Webseite selbst (Anforderungen, Menge der
ausgehenden und eingehenden Daten, CPU-Zeit und HTTP-Serverfehler).

WEBAUFTRÄGE - Hintergrundtasks mit Verwendung von Webaufträgen (WebJobs),
diese können wiederkehrend, nach einem Zeitplan, oder bei Bedarf ausgeführt
werden.

KONFIGURIEREN – diverse Konfigurationseinstellungen, wie Domänennamen, SSLVerbindungen,
Authentifizierung/Authorisierung,
Standarddokumente,
Handlerzuordnungen und virtuelle Verzeichnisse. Dazu gehören auch DiagnoseEinstellungen die Webseite betreffend, aber auch der Webanwendung selbst. Des
weiteren findet man hier Entwicklereinstellungen, wie Applikations-Keys und
Connenction-Strings.

SKALIEREN – wählen des Hostingplans, dieser beeinflusst die Kosten und die
verbundene Leistungsfähigkeit der Webseite. Festlegen der Kapazität (Instanzgrösse
und Anzahl der Instanzen – optional nach Zeit).

VERKNÜPFTE RESSOURCEN – verwendete Datenbanken und Speicherkonten.

SICHERUNGEN – zeitgesteuerte Sicherungen auf ein Speicherkonto.
Einige dieser Bereiche werden wir im Laufe des Kapitels noch kennen lernen. Beginnen
wir aber nun mit dem Deployment einer Webseite, oder wie kommt nun der eigene Content
auf die eigene Azure Webseite.
3.4
Deployment einer eigenen Webseite
Es gibt verschiedene Möglichkeiten, um die eigene Web-Applikation zu einer Azure Webseite
zu deployen:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
37
Abbildung 3.18: Unterstützte Veröffentlichunsmethoden für Azure Webseiten
Außerdem besteht natürlich immer die Möglichkeit direkt aus Visual Studio seine WebApplikation zu einer Azure Webseite zu deployen.
3.4.1
Deployment mit Visual Studio 2015
Eine Web-Applikation in Visual Studio kann zu einer bestehenden Azure Webseite
deployed werden. Dazu muss im Solution Explorer die rechte Maustaste am Projekt gedrückt
werden und danach der Menüpunkt „Publish…“ im Popup-Menü angewählt werden.
Abbildung 3.19: Veröffentlichen aus Visual Studio über den Solution Explorer
Im neu erscheinenden Fenster muss “Microsoft Azure Websites“ gewählt werden und
Visual Studio listet alle bestehenden Webseiten für die Azure Subscription(s), auf die der
Anwender Zugriff hat, auf.
©Soft-Dat GmbH - Berndt Hamböck 2014
38
Hamboeck / Azure für Entwickler
Abbildung 3.20: Auswahl der Azure Webseite
Deployment mit Visual Studio ist also eine recht einfache Sache, aber sehen wir uns
andere Möglichkeiten an, beginnen wir mit den Git-Deployment-Optionen.
3.4.2
Git-Deployment zu einer Azure Webseite
Dazu wird ein Account auf github.com benötigt. Dabei wird zwischen einem kostenlosen
Account und einem Account, der monatlich $7 kostet, unterschieden. Bei einem kostenlosen
Account sind keine privaten Repositories möglich, es kann also jedermann auf den Source
Code zugreifen.
Nach dem Anlegen des Accounts muss ein Repository auf GitHub mit einem beliebigen
Namen angelegt werden. Dabei wird geprüft, ob der Name für das Repository noch verfügbar
ist.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
39
Abbildung 3.21: Anlegen des Repositories auf GitHub
Zusätzlich besteht die Möglichkeit ein .gitignore File (für Visual Studio) anzulegen, das ist
praktisch, da somit sofort alle Dateien ausgenommen sind, die von Visual Studio jederzeit
selbständig hergestellt werden können (z. B. Verzeichnisse, wie build, obj, debug, release,
usw.). Desweiteren ist eine Readme.md-Datei bei GitHub Projekten Standard, diese wird
angezeigt, wenn man sich im Browser das Repository ansieht.
Um nun in dieses GitHub-Repository zu deployen, sind 4 Schritte notwendig:
1. Im Azure Management Portal auf den Link
klicken.
2. GitHub als Quelle für den Source-Code wählen.
©Soft-Dat GmbH - Berndt Hamböck 2014
40
Hamboeck / Azure für Entwickler
Abbildung 3.22: GitHub als Quelle
3. Bei Githhub anmelden. Wird das erste Mal aus dem Azure Portal auf GitHub
zugegriffen, dann müssen die Berechtigungen für Microsoft Azure freigegeben werden.
Abbildung 3.23: Berechtigungen auf GitHub für Azure freigeben
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
41
Nach erneuter Eingabe des GitHub-Passwortes hat Azure die Zugriffsberechtigungen
auf das GitHub-Repository.
4. Auswählen des Repositories und der Branch.
Abbildung 3.24: Repository und Branch in GitHub
Nun wird jedes Mal, sobald Source-Code Änderungen in dem GitHub Repository
eingecheckt werden diese Änderungen automatisch von der Azure Webseite übernommen.
Eine zweite Option des Git-Deployments ist über ein lokal Git-Repository, also eines,
welches nicht auf GitHub gehostet wird.
3.5
Lokales Git-Repository und Deployment zu einer Azure
Webseite
Um mit Git lokal unter Windows arbeiten zu können, muss der GitHub Client für Windows
installiert werden, dieser ist frei verfügbar unter https://windows.github.com/
©Soft-Dat GmbH - Berndt Hamböck 2014
42
Hamboeck / Azure für Entwickler
Abbildung 3.25: Download von GitHub für Windows
Nachdem der ca. 43 MB große Installer heruntergeladen wurde und installiert wurde
stehen drei neue Programme auf dem PC zur Verfügung.
Abbildung 3.26: GitHub für Windows
Nun kann es auch schon mit dem Anlegen des eigenen, lokalen Git-Repositories losgehen,
dazu ist die GitHub-Applikation zu starten. Diese erfordert beim ersten Start die Login-Daten
für GitHub.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
43
Abbildung 3.27: GitHub-Windows Client, erster Start
Nach erfolgreicher Anmeldung ist der nächste Schritt das Anlegen eines neuen lokalen
Repositories, dies erfolgt durch Drücken des Buttons in der linken oberen Ecke.
Jetzt fehlen noch die Daten für das lokale Repository, wie soll es heißen und wo befindet
es sich auf der lokalen Festplatte.
©Soft-Dat GmbH - Berndt Hamböck 2014
44
Hamboeck / Azure für Entwickler
Abbildung 3.28: Anlegen des lokalen Repositories
Nachdem das Repository angelegt wurde schaltet die Ansicht um und wir erkennen, dass
es vorhanden ist und dass zwei Dateien angelegt wurden (.gitignore und .gitattributes).
Abbildung 3.29: Das angelegte lokale Repository
Nun sind drei Schritte notwendig, um die Webseite durch ein lokales Git-Repository zu
aktualisieren:
1. Im Azure Management Portal das Deployment durch das lokale Git-Repository
konfigurieren, das heißt im Bereich DASHBOARD für die Webseite auf den folgenden
Link klicken:
Es öffnet sich das Auswahlfenster, wo die Bereitstellungsmethode gewählt werden
kann, hier wählen wir “Lokales Git-Repository”.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
45
Abbildung 3.30: Bereitstellungsmethode Lokales Git-Repository
Wir erhalten die Bestätigung, dass das Repository bereit ist und nur noch auf Source
Code von uns wartet.
Abbildung 3.31: Azure Webseite ist bereit für das lokale Git-Repository
©Soft-Dat GmbH - Berndt Hamböck 2014
46
Hamboeck / Azure für Entwickler
2. Anlegen der lokalen Webseite im lokalen Git-Repository. In dem lokalen Verzeichnis
muss nun die Webseite angelegt werden, als Beispiel dient hier eine einfache
index.html Seite, diese kann z. B. erst einmal so aussehen und danach natürlich frei
erweitert werden, um zu einer richtig großen und schönen Webseite anzuwachsen:
<html>
<head></head>
<body>
<h1>Deployed durch lokales Git-Repository</h1>
</body>
</html>
Tabelle 3.1: index.html Seite
3. Nun fehlt noch das Einchecken, d. h. sozusagen das Commitment der Webseite zu
Azure.
Dazu wird die Git-Shell benötigt, die per Default wiederum die PowerShell verwendet.
Es muss in das lokale Git-Verzeichnis und darin in das Repository gewechselt werden
(in meinem Fall C:\GitDeploment\Svobi).
Abbildung 3.32: Git-Shell im lokalen Repository
Fast geschafft, nun müssen noch alle neuen Dateien zu Git hinzugefügt werden, dies
geschieht mit dem Befehl git add . und eingecheckt (committed) werden, das
wiederum erledigt der Befehl git commit –m „initial commit“ für uns. Das dauert
ein paar Sekunden und wir erhalten die Rückmeldung, was alles in dem Repository
passiert ist.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
47
Abbildung 3.33: Hinzufügen und einchecken in Git
Im Azure Management Portal lässt sich der Erfolg im Bereich BEREITSTELLUNGEN für
diese Webseite nachweisen. Es ist das Datum der Durchführung, sowie der Autor und das
Login für die Azure Webseite ersichtlich. Auf Wunsch sind auch die betroffenen Dateien
ersichtlich.
Abbildung 3.34: Erfolgreiche Bereitstellung
Die finale Kontrolle der Bereitstellung kann im Browser erfolgen, dazu ist die Adresse der
Azure Website mit dem Domänennamen azurewebsites.net zu kombinieren.
©Soft-Dat GmbH - Berndt Hamböck 2014
48
Hamboeck / Azure für Entwickler
Abbildung 3.35: Die veröffentlichten Änderungen
Während der Entwicklung kommt man mit diesen Möglichkeiten sehr gut zurecht. Sobald
man allerdings mit seiner Webseite in Produktion geht, ist es nicht mehr wünschenswert,
dass jede durchgeführte (committete) Änderung auch sofort online verfügbar ist. Erst nach
Überprüfung der Änderungen wäre es sinnvoll, wenn diese aktiv sind. Damit wären wir bei
einem weiteren Feature der Azure Webseite angelangt, dem Staging. Zuvor aber noch einmal
ein kleiner Ausflug zur Konfiguration, denn wir sollten uns vorab ansehen, welche
Funktionalität und Leistungsfähigkeit mit den Azure Webseiten zur Verfügung gestellt
werden, das kann wiederum frei konfugiert werden, wirkt sich aber wiederum auf die Kosten
aus, die jedes Monat anfallen.
3.6
Webhosting-Pläne
Im Azure Portal für eine angelegte Webseite unter dem Punkt SKALIERUNG finden wir den
WEBHOSTINGPLAN-MODUS.
Abbildung 3.36: Auswahl des Webhosting-Plans
Es gibt vier verschiedene Modi, das Verständnis derselben ist essentiell um die
Arbeitsweise der Webseite und auch deren Verrechnung zu verstehen.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
3.6.1
49
Modus Kostenlos
Im Modus KOSTENLOS können bis zu 10 Webseiten (pro Region) betrieben werden. Die
Web-Applikation muss eine 32-Bit WebApp sein. Der maximale Speicherplatz beträgt 1GB,
das Datenlimit (ausgehend) beträgt 165MB pro Tag. Auch die CPU-Zeit ist auf 60 Minuten
pro Tag beschränkt. Der maximal verwendete Memory-Speicher darf 1024MB in der Stunde
nicht
überschreiten.
Die
optional
verwendbare
MySQL
Datenbank
darf
20MB
nicht
überschreiten. All diese Limits gelten allerdings für ALLE Webseiten (bis zu 10) gemeinsam
pro Region. Wird eines der Limits überschritten zeigen die betreffenden Webseiten bei einem
Aufruf im Browser an, dass diese derzeit nicht erreichbar sind. Die Webseiten laufen nicht auf
einem eigenen Rechner, sondern mit anderen Azure Webseiten gemeinsam auf der gleichen
physikalischen Maschine.
3.6.2
Modus Freigegeben:
Im Modus FREIGEGEBEN können bis zu 100 Webseiten mit max. 10 Webhosting-Plänen
betrieben werden. Die Web-Applikation muss ebenfalls eine 32-Bit WebApp sein. Der
maximale Speicherplatz beträgt 1GB gemeinsam für alle Webseiten des Hosting-Plans.
Es gibt kein Datenlimit für ausgehende Daten, der Traffic wird allerdings verrechnet (mehr
dazu unter Kosten einer Webseite). Der maximal verwendete Memory-Speicher darf 1024MB
in der Stunde nicht überschreiten. Auch die CPU-Zeit ist auf 240 Minuten pro Tag beschränkt.
Diese Einschränkung gelten allerdings PRO Webseite und nicht wie im Modus KOSTENLOS für
alle Webseiten gemeinsam (das wiederum wirkt sich allerdings auch auf die Verrechnung
aus). Die Webseiten laufen ebenfalls mit anderen Webseiten auf der gleichen Maschine. Der
Vorteil ist, dass ab dem Modus FREIGEGEN ein eigener Domänenname mit der Azure
Webseite verbunden werden kann.
3.6.3
Modus Basic:
Im Modus BASIC können bis zu 500 Webseiten mit max. 10 Webhosting-Plänen betrieben
werden. Die Web-Applikation kann eine 32-Bit, oder 64-Bit WebApp sein. 1 Staging Slot ist
verfügbar. Ab diesem Modus laufen die Webseiten auf einer dedizierten physikalischen
Maschine, damit verbunden bestehen keine Einschränkungen bezüglich der Verwendung der
CPU-Zeit und des verwendeten Memorys. Microsoft garantiert eine Verfügbarkeit von 99.9%.
3.6.4
Modus Standard
Zusätzlich zu den Möglichkeiten, die der Modus BASIC bereits bietet ist es möglich noch
besser zu skalieren, vor allem Zeit- bzw. CPU-abhängige Skalierung ist in diesem Modus
möglich und es stehen 5 Staging Slots zur Verfügung.
©Soft-Dat GmbH - Berndt Hamböck 2014
50
Hamboeck / Azure für Entwickler
3.6.5
Welcher Modus ist der Richtige?
Für Azure-Einsteiger, bzw. für Webseiten-Betreiber, wo nur geringe Zugriffe zu erwarten
sind, ist der Modus KOSTENLOS bestimmt interessant. Ist mehr Traffic zu erwarten, oder
wird ein eigener Domänenname benötigt, dann ist der Modus SHARED eine günstige
Alternative, wenn es sich um wenige Webseiten handelt.
Handelt es sich um Webseiten, bzw. Web-Applikationen, die höhere Ansprüche stellen als die
bisher genannten, sind im Modus BASIC sehr gut aufgehoben. Muss allerdings abhängig von
der Last, oder zu einer bestimmten Zeit die Webseite besser skalieren, dann ist der Modus
STANDARD zu empfehlen. D. h. werden z. B. jeden Freitag aufwendige Berechnungen
angestoßen, dann kann im Modus STANDARD ein weiterhin reibungsloser Zugriff auf die
Webseite erreicht werden, trotz der höheren Belastung. Auch wenn plötzlich ein riesiger
Anstieg der Zugriffsraten erreicht wird, z. B. durch eine E-Mail-Promotion, dann wird
ebenfalls ein Zusammenbruch durch das automatische Skalieren erreicht werden können. Ein
genauer Vergleich der Limits der verschiedenen Modi ist im Anhang zu finden.
3.7
Skalieren der Webseite
Webhostingpläne - und die zugehörigen Webseiten - für KOSTENLOS und FREIGEGEBEN
teilen sich die Hardware mit anderen Webseiten. Das bedeutet nicht, dass hier Daten von
anderen Webseiten sichtbar, oder erreichbar wären, aber dass hier (auch aus diesem Grund)
keinerlei SLA von Seiten Microsoft garantiert werden kann. Skalierung gibt es hier ebenfalls
keine, es kann keine weitere Instanz der Webseite aktiviert werden, da das Limit in beiden
Modi bei einer Instanz liegt.
Abbildung 3.37: Skalierung im Modus Kostenlos/Freigegeben
Im Modus BASIC und STANDARD steht eine eigene Maschine zur Verfügung, d. h. nur die
eigene Webseite, bzw. Webseiten greifen auf Ressourcen dieser Maschine zu. Ab dem Modus
BASIC kann auch die Instanzgröße (Klein, Mittel, oder Groß) – der zugrunde liegenden
virtuellen Maschine - gewählt werden. Diese virtuelle Maschine wird von Azure automatisch
gemanaged, d. h. dass z. B: Betriebssystem-Updates automatisch eingespielt werden. Es
können bis zu drei Instanzen gewählt werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
51
Abbildung 3.38: Skalierung im Modus BASIC, Auswahl von 3 Instanzen
Die Istanzgrößen unterscheiden sichin der Anzahl der CPU-Kerne und in der Größe des
verfügbaren Arbeitsspeichers. Die ungewohnte Größe des Arbeitsspeichers ergibt sich
daraus, dass der Rest für das unterliegende OS der VM reserviert ist, bzw. benötigt wird.
Abbildung 3.39: Skalierungseinstellungen im Modus BASIC
Im Modus STANDARD können bis zu zehn Instanzen gewählt werden. Das Limit ist
allerdings nicht unbedingt sinnvoll, da ab ca. 8 Instanzen ein weiterer Webhostingplan im
Modus STANDARD im Preis günstiger ist. Zusätzlich zu BASIC kann hier noch abhängig von
der CPU-Last, oder nach einem Zeitplan skaliert werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
52
Hamboeck / Azure für Entwickler
Abbildung 3.40: Zusätzliche Skalierungseinstellungen im Modus STANDARD
Das Einrichten eines Zeitplanes ist relativ flexibel. Zu beachten ist, dass das Wochenende
am Freitag um Uhr 20:00 beginnt und am Montag um Uhr 08:00 endet. Generell beginnen
Tage per Default um Uhr 08:00 und enden um Uhr 20:00, dies kann natürlich angepasst
werden. Die Sommer- und Winterzeit wird je nach Region berücksichtigt.
Abbildung 3.41: Erstellen eines Zeitplans im Modus STANDARD
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
53
Wie erwähnt ist der Zeitplan eine gute Variante vorhersehbare hohe Lasten, wie den Tag,
bzw. Nacht-Rhythmus der Firmenkollegen, oder Kunden abzubilden, sowie wiederkehrende
Lasten, wie komplexe Berechnungen zu bestimmten Tagen abzufangen. Allerdings sind nicht
aller Ereignisse vorhersehbar, so können schon mal Zugriffe auf die eigene Webseite
(unvorhersehbar) in die Höhe schnellen, was eine erhöhte CPU-Last zur Folge hat, was
möglicherweise die Webseite in die Knie zwingt. Dem kann aber mit der Einstellung NACH
METRIK SKALIEREN vorgebeugt werden.
Dabei ist die Einstellung auf CPU zu setzen und die Grafik daneben liefert eine Übersicht,
wie viele Instanzen in den letzten Tagen verwendet wurden. Im Gegensatz zu BASIC kann
nun die minimale Instanzenanzahl (in Abbildung 3.X sind das 2) und die maximale
Instanzenanzahl (in dem Beispiel wurden 5 gewählt) konfiguriert werden. Zusätzlich wird der
gewünschte CPU-Bereich festgelegt (zwischen 60% und 80%). Azure überprüft alle fünf
Minuten die CPU-Leistung und erhöht, bzw. reduziert die Instanzen entsprechend dem
gemessenen Wert. Eine minimale Instanzenanzahl von 1 kann somit für maximal ca. 5
Minuten unangenehme Folgen für den Zugriff auf die Webseite haben.
Abbildung 3.42: Zusätzliche Skalierungseinstellungen bei Standard
Die zusätzlichen Einstellungsmöglichkeiten im Modus STANDARD sind ein klarer Vorteil zu
BASIC, da hier unter Umständen Kosten eingespart werden können, da die zusätzlichen
Instanzen nur dann verwendet werden, wenn die Einstellungen für die CPU-Last, oder des
Zeitplans zuschlagen. Also genau nach dem Prinzip: „Pay only what you use“. Werden die
zusätzlichen Instanzen nur manches Mal (über das Monat) verwendet, werden nur die
Minuten der zusätzlichen
Nutzung verrechnet. Wird niemals die CPU-Last erreicht und
existiert kein zusätzlicher Zeitplan, dann wird auch nur für 1 Instanz bezahlt.
©Soft-Dat GmbH - Berndt Hamböck 2014
54
Hamboeck / Azure für Entwickler
3.8
Deployment mit Staging
Ein sogenannter Staging-Slot, im Modus BASIC steht 1 zur Verfügung, im Modus
Standard stehen 5 zur Verfügung, dient dazu, Änderungen an der Webseite bereit zu stellen.
Das Test-Team, oder noch besser der Auftraggeber der Webseite kann die Änderungen
testen und diese anschließend final frei geben. Idealerweise hat das QA-Team einen eigenen
Staging-Slot. Sobald die Änderungen abgenommen wurden kann der Produktionsslot und der
Staging-Slot unterbrechungsfrei getauscht werden. D. h. es findet keinerlei Ausfall der
Webseite statt.
Wichtig zu verstehen ist, welche Einstellungen bei dem Switch zwischen der Produktion
und dem Staging-Slot übernommen werden und welche nicht, da es hier sehr leicht zu
ungewollten
Fehlern
kommen
kann
(z.
B.
bei
Datenbankverbindungen).
Konfigurationseinstellungen, die sich beim Swap ändern, sind im Bereich KONFIGURIEREN zu
finden:

Allgemeine Einstellungen

App-Einstellungen (VORSICHT)

Verbindungszeichenfolgen (VORSICHT)

Handlerzuordnungen

Virtuelle Anwendungen und Verzeichnisse

Monitoring und Diagnose-Einstellungen
Einstellungen, die nicht übernommen werden:

Publishing endpoints

SSL-Zertifikate

Eigene Domännamen

Sowie die Skalierungseinstellungen (Bereich SKALIERUNG)
Man kann erkennen, dass das Azure Staging dazu gedacht ist, die Version in einem
Staging-Slot bereit zu stellen, die auch in Produktion gehen soll. In dem Staging-Slot sollten
vor dem Switch die Einstellungen, z. B. für die Verbindungszeichenfolgen kontrolliert werden,
da diese auf die Produktiv-Datenbank zeigen sollte und nicht auf eine Test-Datenbank. Nach
dem Swap können die Einstellungen wieder geändert werden, um z. B. der QA wiederum die
Möglichkeit für Tests zu geben. Aber wie bereits erwähnt wäre ein eigener Staging-Slot für
die QA besser, um hier Fehler zu vermeiden.
Um einen Staging-Slot anlegen zu können, muss sich die Webseite im Modus BASIC (1
Staging Slot), oder STANDARD (5 Staging-Slots) befinden. Die beiden Modi KOSTENLOS und
FREIGEGBEN unterstützen kein Deployment mit Staging!
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
55
Abbildung 3.42: Staging ist nur in BASIC und STANDARD verfügbar
Ist der Modus für die Webseite BASIC, oder STANDARD kann das Staging konfiguriert
werden, und zwar im Bereich DASHBOARD.
Abbildung 3.44: Bereich DASHBOARD, um Staging einzurichten
Hier ist rechts der Link zu finden, um die Konfiguration für den Staging-Slot zu starten:
Der Name des Staging-Slots ist einzugeben, z. B. staging, der finale Name beinhaltet den
Namen der Webseite mit ebendiesem Namen in Klammern, in meinem Fall also svobi
(staging). Zusätzlich kann die bestehende Konfiguration aus der aktuell produktiven Version
gecloned werden, oder falls schon mehrere Staging-Slots angelegt wurden, aus einem
dieser.
©Soft-Dat GmbH - Berndt Hamböck 2014
56
Hamboeck / Azure für Entwickler
Abbildung 3.45: Name des Slots und Klonen der Konfiguration
Der Staging Slot wurde angelegt und im Azure Management Portal direkt unter der
zugehörigen Webseite angezeigt. Dieser kann nun durch Anwählen, genau wie jede andere
Webseite auch, konfiguriert werden.
Abbildung 3.46: Neuer Staging-Slot unterhalb der Webseite
Im Bereich DASHBOARD ist rechts die URL zu erkennen, diese ist in meinem Fall:
3.8.1
Webseiten-Swap im Azure Management Portal
Möchte man den Staging-Slot und den aktuellen Produktions-Slot tauschen, ist das nur
einen Mausklick am unteren Bildschirmrand entfernt
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
57
Abbildung 3.47: Tauschen des Staging- und Produktions-Slots
Ein Bestätigungsfenster öffnet sich und die Quelle (der Staging-Slot) und das Ziel
(üblicherweise die Produktive-Webseite) kann gewählt werden.
Abbildung 3.48: Quelle und Ziel für den Swap
Der Button
3.8.2
führt den Swap sofort aus.
Webseiten-Swap mit der Powershell
Ist die Azure Powershell installiert und das Azure-Abonnement importiert (siehe Kapitel 6)
kann der Swap auch programmgesteuert durchgeführt werden. Dazu ist zuerst die
Powershell zu öffnen und danach sind die notwendigen Kommandos abzusetzen. Ein erster
Überblick
über
die
Befehle die
Azure
Webseiten betreffend
AzureWebsite.
©Soft-Dat GmbH - Berndt Hamböck 2014
erhält man mit
help
58
Hamboeck / Azure für Entwickler
Abbildung 3.49: Verfügbare PowerShell Befehle für Azure Webseiten
In diesem Fall ist der Befehl Switch-AzureWebsiteSlot der Gesuchte, allerdings klappt das
nur, wenn nur zwei Slots vorhanden sind (der Produktive-Slot und der Staging-Slot). Das
Kommando wird so abgesetzt: Switch-AzureWebsiteSlot -Name siteslotstest
Abbildung 3.50: PowerShell Webseiten-Swap
Diese Variante ist für Entwickler und Administratoren natürlich fantastisch, es muss nicht
unbedingt der Umweg über das Management Portal gegangen werden.
3.8.3
Zugriff auf Staging unterbinden
Der Staging-Slot ist, wie jede andere Azure Webseite auch, von überall erreichbar. Dies
ist nicht unbedingt erwünscht und soll möglicherweise nur aus dem Intranet verwendet
werden können. Möglicherweise möchte man auch verhindern, dass keine Informationen
nach außen gehen, die noch nicht veröffentlicht werden sollen.
In dem Beispiel bisher wurden zwei URLs angelegt und verwendet:
http://svobi.azurewebsites.net und http://svobi-staging.azurewebsites.net
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
59
Um nun den Zugriff auf den Staging-Slot zu unterbinden sollte eine „rule“ in der
web.config hinterlegt werden. Zugriff sollen nur die IP-Adressen erhalten, die hier auch
eingetragen sind:
<system.webServer>
<rewrite>
<rules>
<rule name="block traffic to staging" stopProcessing="true">
<match url=".*" />
<conditions>
<!-- staging site host name -->
<add input="{HTTP_HOST}" pattern="^svobi\-staging\." />
<!-- white listed IPs -->
<add input="{REMOTE_ADDR}" pattern="123\.123\.123\.1" negate="true"/>
<!-- more IPs -->
<!-- <add input="{REMOTE_ADDR}" pattern="123\.123\.123\.2" negate="true"/> -->
</conditions>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden"
statusDescription="Site is not accessible" />
<!-- This one will rewrite url to specified file -->
<!-- <action type="Rewrite" url="error.html" appendQueryString="false" /> -->
<!-- This one will redirect to another site -->
<!-- <action type="Redirect" url=http://www.bing.com appendQueryString="false" /> -->
</rule>
</rules>
</rewrite>
</system.webServer>
Tabelle 3.2: Web.config um den Zugriff auf Staging zu limitieren
Sollte nun ein http request zur die Staging-Webseite durchgeführt werden, dann wird ein
HTTP 403 Response zum Client zurück geschickt, alternativ könnte der Request auch
umgeleitet werden. White-Listed IP-Adressen können hingegen auf die Webseite zugreifen.
Nach einem erneuten Swap auf die Produktion greift die erste Rewrite-Rule nicht und alle
Anfragen werden wie gewünscht beantwortet.
3.9
Verwenden des eigenen Domänennamens
Die eigene, bzw. die Firmen-Webseite ist erst so richtig perfekt mit dem eigenen
Domänennamen. Dazu muss die Domäne, die zuvor bei einem Domänenbetreiber gekauft
©Soft-Dat GmbH - Berndt Hamböck 2014
60
Hamboeck / Azure für Entwickler
wurde, mit der Azure-Webseite im Azure Portal verbunden werden. Zusätzlich sind beim
Domänenprovider DNS-Einträge zu setzen, um zu überprüfen, ob man auch der Eigentümer
der Domäne ist. Dies ist für Azure Webseiten ab dem Webhosting-Plan FREIGEGEBEN
möglich. Sollte für die Webseite also noch der Webhostinplan KOSTENLOS eingestellt
werden, so ist dieser im Menüpunkt SKALIEREN zuerst auf FREIGEGEBN, BASIC, oder
STANDARD umzusetzen.
Abbildung 3.51: Webhostinplan FREIGEGEBEN, oder höher
Danach kann der eigene Domänenname mit der Azure Webseite verknüpft werden, und
zwar im Menüpunkt KONFIGURIEREN und mit dem Link
©Soft-Dat GmbH - Berndt Hamböck 2014
.
Hamboeck / Azure für Entwickler
61
Abbildung 3.52:
Es öffnet sich ein Dialog, wo der gewünschte Domänennamen einzugeben ist. Um diesen
Schritt erfolgreich zu meistern, müssen beim Domänenanbieter seiner Wahl DNS-Einträge
gesetzt werden.
Abbildung 3.53:
Die benötigten DNS-Einstellungen für meinen Provider (world4you.com) sind nachfolgend zu
sehen. Es ist der CNAME (canonical name) zur Azure-Webseite zu setzen. Zusätzlich zeigt
der A-Resource-Record (dieser verbindet dann den Domänennamen mit einer IP-Adresse)
auf die IP-Adresse der Azure-Webseite.
©Soft-Dat GmbH - Berndt Hamböck 2014
62
Hamboeck / Azure für Entwickler
Abbildung 3.54: CNAME und A-Ressource-Record Einträge für eine Azure-Webseite
Die Änderung der DNS-Einträge beim Provider können bis zu 20 Minuten betragen, sollte
es also nicht gleich funktionieren, dann ist vermutlich nur etwas Geduld nötig. Wenn es
geklappt hat, dann ist die Azure Webseite nun (auch) mit dem eigenen Domänennamen
erreichbar.
3.10
Kosten der Webseite
Für alle Dienste bei Azure gilt, dass nur das bezahlt wird, was auch tatsächlich verwendet
wird. Um die Kosten, die für die Webseite(n) im Monat anfallen berechnen zu können, ist der
Azure Preisrechner sehr hilfreich, diesen findet man unter: http://azure.microsoft.com/deDE/pricing/calculator/
In Abbildung 3.X ist eine Beispielkalkulation für zwei kleine Instanzen (1.6 GHz CPU, 1.75
GB RAM) zu sehen, mit einem angenommenen ausgehenden Traffic von 100GB im Monat
(die ersten 5GB sind immer kostenlos).
Abbildung 3.51: Preiskalkulation für 2 Instanzen im Modus STANDARD
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
63
Wird im Modus Standard zusätzlich nach CPU, oder Zeit skaliert, so kommen noch die
aufgelaufenen Minuten für die weiteren Instanzen dazu.
Im Modus KOSTENLOS, FREIGEGEBEN und STANDARD spielt es für die Preiskalkulation
keine Rolle, wie viele Webseiten pro Webhostingplan verwendet werden. Anders sieht es
allerdings im Modus FREIGEGEBEN aus, hier wird für JEDE einzelne Webseite der berechnete
Preis fällig, da in diesem Modus ja keine dedizierte Maschine verwendet wird.
Abbildung 3.52: Kosten für 8 Webseiten im Modus FREIGEGEBEN
Es kann also durchaus sinnvoll sein hier mehrere Möglichkeiten durchzuspielen, da in dem
oben angezeigten Fall mit den 8 Webseiten es - auch von den Kosten her - bestimmt eine
bessere Lösung auf den Modus BASIC (mit einer dedizierten Maschine) zu wechseln (€41,56
pro Instanz im Monat Stand Dez. 2015), bzw. auf den Modus STANDARD, falls man noch bei
Bedarf mit zumindest einer zusätzlichen Instanz skalieren möchte.
Zusätzliche Kosten können noch bei Verwendung einer Datenbank anfallen, bzw. bei
Verwendung des Azure Storage. Diese Kosten sind extra zu berechnen und zu den Kosten zu
addieren. Der vollständige Kostenrechner ist hier zu finden:
http://azure.microsoft.com/de-DE/pricing/calculator/?scenario=full
Es spricht aber nichts dagegen mit der kostenlosen Variante erst einmal zu starten und
eben erst später die Webseite für die eigenen Bedürfnisse anzupassen.
©Soft-Dat GmbH - Berndt Hamböck 2014
64
Hamboeck / Azure für Entwickler
3.11
Zusammenfassung
Für den Einstieg in die Welt von Microsoft Azure bieten sich Azure Webseiten an. Man hat
hier die Möglichkeit sich mit dem Azure Management Portal auseinanderzusetzen, sowie eine
erste Webseite weltweit zur Verfügung zu stellen. Die Möglichkeiten des Deployments sind
hier vielfältig. Sowohl für kleine Entwicklungsteams, als auch für größere gibt es interessante
Varianten, wie das Git Deployment, Visual Studio Online, oder möglicherweise auch die
DropBox. Die Skalierungsmöglichkeiten sind vielfältig und der MODUS Standard lässt
bezüglich Performance keine Wünsche offen. Die Möglichkeit des Stagings ist für Entwickler
wie auch für die QA interessant, um die Produktion von der Entwicklung zu trennen und doch
jederzeit (nach Abnahme) fliegend Änderungen in Produktion bringen zu können. Der eigene
Domänenname kann natürlich ebenfalls verwendet werden.
Der Einstieg in die Cloud-Entwicklung wäre somit geschafft. Es lässt sich erahnen, welche
Leistungsvielfalt die Microsoft Cloud noch zu bieten hat, sehen wir uns also gleich einen
weiteren Dienst an, Azure SQL.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
65
3
Azure SQL Datenbanken
In diesem Kapitel

wird die Architektur von Azure SQL beschrieben

wird das Anlegen einer Datenbank erläutert

werden Feature-Unterschiede zu einer On-Premise Installation beschrieben

das Sicherheitskonzept erläutert
Die Datenbank, bzw. der Datenbank-Server in der Cloud. Möchte ich das? Beziehungsweise
möchte mein Unternehmen das wirklich? Die provokante Gegenfrage müsste lauten: Warum
nicht? Ja, die Daten liegen dann nicht mehr „im Haus“, sie liegen in einem Datacenter bei
Microsoft. Ich kann gut verstehen, dass dies für manche Bereiche bzw. Unternehmen
NIEMALS erlaubt werden kann bzw. auf Grund von bestimmten Richtlinien niemals möglich
sein kann. Wenn Sie also in solchen Bereichen arbeiten, dann können Sie dieses Kapitel nun
gerne überspringen und mit dem nächsten fortfahren.
Gut, sie sind also immer noch hier. Generell gibt es zwei Möglichkeiten eine, oder mehrere
SQL Datenbanken unter Azure zu betreiben – entweder in einer virtuellen Maschine, oder als
Azure SQL Database Service. In diesem Kapitel wird hauptsächlich letztere Variante
beschrieben.
Sie haben vermutlich bereits einen, oder mehrere lokale SQL Server mit einer, oder
mehreren Datenbank(en). Wie bekommt man diese nun ins Azure? Was sind die
Unterschiede zu einer lokalen Installation? Nun, vorab, vielleicht sehen wir uns ein paar
Gemeinsamkeiten an, um die Sicherheit zu gewinnen, dass ein Azure Datenbank-Server,
bzw. eine Azure SQL Datenbank eine gute Alternative zu einer lokalen Installation ist, oder
aber auch eine interessante Möglichkeit ist, seine Daten zusätzlich in der Cloud zu speichern.
©Soft-Dat GmbH - Berndt Hamböck 2014
66
Hamboeck / Azure für Entwickler
Zu jedem Azure Account können eine, oder mehrere Azure Subscriptions angelegt werden
(wie im Kapitel 1 bereits geschehen). Jede dieser Subscriptions kann nun bei Bedarf mehrere
Azure SQL Server anlegen und jeder Azure SQL Server kann mehrere Datenbanken hosten.
Diese haben genauso wie eine lokale Installation die Systemdatanbanken master und
tempdb. In der master Datenbank (unter Azure kostenlos) sollten keine User-Daten liegen,
sondern nur Berechtigungen und das Auditing. Es werden also nur Logins angelegt und
keinerlei Business-Daten abgelegt. Das Azure SQL Database Service verwendet weiterhin das
Tabular Data Stream (TDS) Protokoll – wiederum wie ein lokaler Server - was bedeutet, dass
heute bereits vorhandene Datenbank-Applikationen sich auch auf eine Azure SQL Datenbank
verbinden können. Also im Großen und Ganzen genauso, wie es auch in einer lokalen
Installation der Fall ist.
Allerdings wird jede Datenbank im Azure SQL Database Service drei Mal – auf drei
verschiedene physische Server – repliziert, um Hochverfügbarkeit zu erreichen (der erste
klare Vorteil zu einer lokalen Installation). Azure SQL Server muss man als logische Server
sehen, nicht als physische Server, d. h. wir wissen nichts über die darunter liegende
Hardware, wie die Maschine oder auch über die Disks, die vorhanden sind. Das müssen wir
nicht, und ganz ehrlich, das wollen wir auch nicht. Mit einem Azure Datenbank-Server, bzw.
einer Azure Datenbank können wir das tun, was wir als Entwickler am besten können: Uns
auf die Daten zu konzentrieren, d. h. den logischen Teil und nicht den physischen. Wir
sprechen hier also über eine SAAS Lösung (Software as a Service).
Ein Azure Database Server ist für uns praktisch ein TDS-Endpoint, wo die Daten drei Mal
gespeichert werden. Womit wir bei der Architektur angekommen wären, diese sollten wir uns
einmal genauer ansehen.
3.1
Azure SQL Architektur
Die SQL Azure Architektur setzt sich aus vier Layern zusammen, diese Layer sind:

Client Layer – wie gewohnt der Layer mit dem die Applikation im Endeffekt mit der
Datenbank mittels ADO.Net oder ODBC – über TDS – kommuniziert. Das kann eine
WinForms-Applikation, eine WPF-Applikation oder beispielsweise ein WCF-Service,
welches möglicherweise selbst in Azure gehostet ist, sein.

Services Layer - beinhaltet spezielle Azure Funktionalitäten, wie
das Provisioning – also das Anlegen einer Datenbank,
das Billing und Metering – nun wissen wir, woher die Rechnung kommt,
das Routing – die Weiterleitung der Anfragen aus der Client-Applikation an die
Datenbank, und
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
67
den Partition Manager – dieser kennt den Ort der primären und der beiden
sekundären Datenbanken.

Platform Layer – beinhaltet mehrere physische SQL Instanzen und Dienste. Jede
Instanz wird von SQL Azure Fabric gemanaged, welches auch das Herzstück in diesem
Layer ist. Es kümmert sich um Load Balancing, automatischen Failover und der
Replikation der Server.

Infrastructure Layer – repräsentiert die Administration der physische Hardware und
des Betriebssystems.
Abbildung 3.1: Azure SQL Architektur
©Soft-Dat GmbH - Berndt Hamböck 2014
68
Hamboeck / Azure für Entwickler
3.2
Anlegen eines Azure SQL Servers
Wenn in einer lokalen SQL Server-Installation eine Datenbank angelegt wird, so ist diese
in der Instanz des SQL Servers zu finden, für den diese auch angelegt wurde. Jede SQL
Azure Datenbank, die in einer Azure Subscription angelegt wird, ist ebenfalls unter einem
Server-Namen ansprechbar. Im Gegensatz zu einer lokalen (On-Premise) Installation handelt
es sich hier allerdings „nur“ um einen logischen Server und keinen physischen Server. Wir
erinnern uns, dass bereits erwähnt wurde, dass jede Azure SQL Datenbank sofort nach dem
Anlegen insgesamt drei Mal vorgehalten wird. Man spricht von der primären Datenbank und
von den Sekundär-Datenbanken. Wird ein Insert-Statement von einem Clinet in die Azure
SQL-Datenbank geschrieben, dann wird die Zeile in die primäre Datenbank (bzw. in das
Transaction-Log) geschrieben und asynchron auf die beiden Sekundären. Der Client erhält
erst eine Erfolgsmeldung, wenn das Schreiben in der primären Datenbank und zumindest in
einer der beiden sekundären Datenbanken erfolgreich war. Dieser Vorgang passiert völlig
autonom und ist nicht transparent für die Applikation, die diesen virtuellen SQL Server
verwendet und auch nicht für die Administratoren sichtbar.
Aus diesem Grund erhalten wir für die Verbindung also nicht wirklich einen „ServerNamen“, da es diesen EINEN Namen ja nun einmal gar nicht gibt, sondern einen TDSEndpoint, der für die Verbindung verwendet wird. Eine eingehende Verbindung geht nun also
vom Client-Layer (via TDS) durch den Service-Layer, bis er schließlich im Platform-Layer
angekommen ist. Aber was passiert nun tatsächlich im Platform Layer?
Hier verstecken sich nun physische SQLServer-Installationen, die sogenannten Data
Nodes. Jedes Data Node besteht aus einer SQLServer Installation. In einem Data Node
existiert eine Datenbank, welche partitioniert ist – bis zu 650 Partitionen (der Begriff
Partition hat hier nichts mit den im SQLServer bekannten Partitionen zu tun). Jede Partition
enthält eine Azure SQL Datenbank, entweder eine primäre, oder eine der beiden sekundären.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
69
Abbildung 3.2: Data Nodes mit den primären und sekundären Datenbanken
Jedes Data Node hat Prozesse laufen, welche als Azure Fabric bezeichnet werden. Diese
kümmert sich um folgenden Ablauf:
1.
Failure detection: tritt ein Fehler an einem der drei Datenbanken auf (primäre, oder
sekundäre) wird der Reconfiguration Agent gestartet.
2.
Reconfiguration Agent: kümmert sich um die Wiederherstellung, wenn eine primäre,
oder sekundäre Datenbank ausgefallen ist. Wenn eine primäre Partition ausfällt wird
diese durch eine der sekundären ersetzt, d. h. diese ist nun die primäre Datenbank
und es gibt nur noch eine sekundäre Datenbank, bis dann nach einiger Zeit der
Partition Manager eine zweite sekundäre Datenbank aktiviert.
3.
PM (Partition Manager) Location Resolution: sendet Meldungen an den Partition
Manager im Service Layer.
4.
Engine Throttling: stellt sicher, dass allen Datenbanken Ressourcen zur Verfügung
©Soft-Dat GmbH - Berndt Hamböck 2014
70
Hamboeck / Azure für Entwickler
stehen und nicht eine einzelne Datenbank den gesamten logischen Server lahmlegt.
5.
Ring Topology: Verwaltet die physikalischen Maschinen in einem Cluster (bis zu 1000
Maschinen in einem Datacenter) als logischen Ring, das bedeutet, dass jede
Maschine zwei Nachbarn hat, was im Endeffekt eine Ringanordnung ergibt. Somit
kann ein Ausfall einer Maschine entdeckt und darauf reagiert werden.
Das bedeutet also für unsere Datenbank, dass diese drei Mal vorhanden ist und mit
anderen Datenbanken auf drei physischen SQLServer Installationen liegt. Dies erklärt auch,
warum das Transact-SQL-Statement USE DATABASE unter Azure nicht erlaubt ist, da sonst
eine Applikation auf andere Datenbanken zugreifen könnte. Es ist somit auch klar, dass
„unsere“ Datenbank sich System-Ressourcen mit anderen Datenbanken teilt. So ist das auch
mit dem Transaction-Log. Es exisitiert auf einem Datanode nur eine – bereits angelegte und
vorgenullte (verhindert Verzögerungen bei Autogrowth-Vorgängen) - Log-Datei für alle
Partitionen (also Datenbanken), was den Vorteil des schnelleren Speicherns bietet. Allerdings
wirft dies auch Fragen zum Thema Backup auf, denen wir uns später noch widmen.
Außerdem bringt dieser „geteilte“ Log-Datei auch neue Einschränkungen mit sich (man
denke an den Schutz von Ressourcen für die bis zu 649 anderen Datenbanken auf dem
Server).
Somit ist es verständlich, dass man keinen Datenbank-Server in Azure anlegt, sondern
einen logischen Server - es wird Zeit dies auch zu tun.
3.2.1
Anlegen eines logischen Servers
Um eine Azure SQL Datenbank anzulegen, muss entweder im Zuge des Anlegens dieser
oder schon zuvor ein logischer Server mit angelegt werden. Dies ist im Azure Management
Portal durch Anwahl des Bereichs SQL-DATENBANKEN auf der linken Seite und danach durch
einen Klick auf SERVER möglich.
Abbildung 3.3: Anlegen eines logischen Datenbank-Servers unter Azure
Dieser logische Server erhält nach dem Anlegen automatisch einen Namen - die Region,
der Benutzername für die Administration, sowie das Passwort sind frei wählbar. Die Region
sollte der Region entsprechen, die den Anwendern am nächsten ist bzw. in der gleichen
Region wo auch weitere Azure Dienste( wie z.B. Azure Webseiten) installiert sind, die diesen
Datenbankserver verwenden. Damit kann eine optimale Performance zwischen diesen
Diensten gewährleistet werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
71
Abbildung 3.4: Anlegen des logischen Servers mit Namen, Kennwort und Region
Nach dem Anlegen des Servers kann dieser im Azure Management Portal angewählt
werden.
Abbildung 3.5: Angelegter logischer Datenbankserver
Ist der Datenbank-Server angewählt, kann der Link für die Verwaltung angewählt
werden:
Abbildung 3.6: Details des logischen Servers und der Link zur Verwaltung
©Soft-Dat GmbH - Berndt Hamböck 2014
72
Hamboeck / Azure für Entwickler
Diese Aktion liefert allerdings eine „Fehlermeldung“, da die momentane IP-Adresse nicht
in den Ausnahmeregeln der Azure Firewall konfiguriert ist - das lässt sich aber mit Drücken
des „JA“ auf der linken Seite sofort beheben.
Abbildung 3.7: IP-Adresse zur Firewall hinzufügen
Danach öffnet sich ein weiteres Browser-Fenster und die Silverlight Applikation zur
Verwaltung ist zu sehen.
Abbildung 3.8: Verwaltungsfenster für Azure SQL Server
Zu sehen ist der Name des Servers, sowohl im Azure Management Portal, als auch in der
Verwaltungs-Applikation. In meinem Beispiel ist das nh8xlt6qwd, bzw. der komplette Name
ist
nh8xlt6qwd.database.windows.net,
womit
auch
schon
alle
Informationen zur
Verfügung stehen, um einen Connection-String zusammenzubauen:
Data Source=nh8xlt6qwd.database.windows.net;Initial Catalog=master;User
ID=svobi;Password=***********
Azure SQL Server Connection String
Dieser setzt sich aus der Data Source, der User ID und dem Passwort zusammen. Alle
drei Werte, die während des Anlegens selbst vergeben wurden. Auch eine Verbindung über
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
73
das Sql Server Management Studio (Tip: für den doch komplexen Server-Bezeichnungen
kann über den SQL Server Configuration Manager ein Alias für den logischen Server
vergeben werden), oder Visual Studio ist problemlos möglich – allerdings nur von Rechnern,
die in der Firewall Rule vorhanden sind.
Abbildung 3.9: Anmeldedialog in SSMS, bzw. in Visual Studio 2015
Bestehende Applikationen könnten wir nun also verbinden, aber bisher existiert noch
keine Datenbank in unserem Datenbankserver unter Azure. Es wird Zeit dies zu ändern,
zuvor sollten wir uns aber den Unterschieden in der Funktionalität zwischen einer Azure SQL
Datenbank und einer On-Premise Datenbank widmen!
3.3
Fehlende SQLServer Features in Azure SQL
Azure SQL unterstützt derzeit nur ein Subset an Features im Vergleich zu einer lokalen
Installation, die Einschränkungen sind bereits merkbar, wenn man versucht, eine bestehende
Datenbank unter Azure SQL zum Laufen zu bekommen. Das wird vermutlich erst einmal
kläglich scheitern, da bestimmt Features verwendet wurden, die es hier schlicht und einfach
nicht gibt. Eine Aufstellung der fehlenden SQL Server Features ist in der nachfolgenden
Tabelle dargestellt.
©Soft-Dat GmbH - Berndt Hamböck 2014
74
Hamboeck / Azure für Entwickler
Fehlende SQL Server Funktionalität in Azure SQL
Master Data Services
SQL Server-Replikation
Change Data Capture
Transparente Datenverschlüsselung
Auditing
Erweiterte gespeicherte Prozeduren
Datenkomprimierung
Datenbankspiegelung
Extended Events
Service Broker
Common Language Runtime (CLR)
Tabellenpartitionierung
Verwaltung externer Schlüssel/Erweiterbare
Schlüsselverwaltung (EKM-Provider)
Typisiertes XML und XML-Indizierung
FILESTREAM-Daten (FileTables)
Datenbanksicherung und Wiederherstellung
Integrierte Volltextsuche
SQL Server-Agent/-Aufträge
User-Defined Aggregates (UDAs)
Ressourcenkontrolle (Resource Govenor)
User-Defined Types (UDTs)
Sammlung von Leistungsdaten (DataCollector)
Richtlinienbasierte Verwaltung (Policies)
Tabelle 3.1: Feature.Unterschiede SQLServer und Azure SQL
Ich möchte ein paar der fehlenden Punkte herausgreifen, um deren Bedeutung für
Entwickler herauszustreichen und zu beschreiben, wo möglicherweise Handlungsbedarf in
bereits existierenden Applikationen besteht, wenn diese unter SQL Azure laufen sollen.
1. Heap-Tabellen – also Tabellen ohne Clustered Index - finden keine Unterstützung in
SQL Azure (ausser in der tempdb). Das ist nicht wirklich eine große Sache, da eine
Tabelle mit einem Clustered Index sowieso meist die bessere Wahl gegenüber einer
Tabelle ohne Clustered Index ist.
Durch den beschriebenen Aufbau von Azure SQL sind Cross-Datenbank-Refenzen in
SQL Azure nicht möglich.Das bedeutet, dass ein USE- Statement nicht existiert. Es
gibt auch kein Statement, wie
CREATE TABLE tempdb.dbo.Test ( col1 int not null )
ist nicht erlaubt, möglich ist hingegen
CREATE TABLE #Test ( col1 int not null )
In einem herkömmlichen SQL Server können Daten aus verschiedenen Datenbanken
kombiniert werden, wenn man den Namen vollqualifiziert angibt - in einer Azure SQL
funktioniert dies nicht.
2. Aus dem vorigen Punkt ergibt sich damit auch, dass „Linked Server“ in Azure SQL
nicht existieren.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
75
3. Fulltext Indizierung und Fulltext Search wird derzeit nicht unterstützt.
4. Der Default für den Transaction Isolation Level in SQL Azure ist
READ_COMMITTED_SNAPSHOT - im SQL Server hingegen READ_COMMITTED.
Dies kann ebenfalls Auswirkungen auf Client Applikationen haben.
5. Es gibt keinen SQL Server Agent in SQL Azure. Es gibt also keinerlei Unterstützung für
Funktionalitäten, wie Jobs, Change Data Capture, DataCollector, Policies oder weitere
Features, die den SQL Server Agent benötigen.
6. Fehlende Data Encryption (sowohl auf Column-Level Ebene als auch transparente Data
Encryption)
7. Keine Unterstützung für user defined Common Language Runtime (CLR) Assemblies.
Auch die von Microsoft implementierten CLR Features werden nicht unterstützt (wie z.
B. NEWSEQUENTIALID(), oder die Geo-Datentypen GEOGRAPHY und GEOMETRY).
8. Keine FILEGROUPS
9. Keine System Tabellen. Würde also beispielsweise in Applikationen über die System
Tabellen die Struktur der Datenbank dynamisch ausgelesen, müsste dieser Teil der
Applikation umgeschrieben werden. Data Management Views sind allerdings
vorhanden und wurden im Dezember 2014 sogar um weitere 44 DMVs ergänzt.
10. Backup/Restore, so wie man es von einem lokalen SQL Serverkennt, existiert unter
Azure SQL nicht. Die Daten selbst sind gegen Hardwareausfall ja geschützt, aber was
ist mit fehlerhaften Eingaben von Anwendern – wenn ein Anwender etwas löscht, was
er nicht sollte? Normalerweise würde der Administrator die Datenbank mittels
Transaction-Log Backups wieder herstellen, in Azure SQL ist das allerdings etwas
anders, dazu später noch mehr.
Sollten diese Hindernisse erfolgreich gemeistert sein und die Datenbank unter Azure SQL
laufen, können allerdings zur Laufzeit durchaus weitere, bisher nicht bekannte Probleme
auftreten, da unter Azure SQL die zur Verfügung stehenden Ressourcen limitiert werden. Die
Datenbank ist ja schließlich nicht alleine auf dem Server im Datacenter, sondern teilt sich
diesen mit anderen Datenbanken.
Folgendes sollte in der eigenen Applikation beachtet werden:
1. Auf einem lokalen SQL Server wird eine Verbindung, die Idle ist, nahezu niemals
beendet. Falls dies dennoch geschieht, dann ist ein schwerwiegender Fehler
aufgetreten. In SQL Azure wird eine solche Verbindung nach 30 Minuten beendet, eine
Fehlermeldung wird nicht geworfen, da ja keine aktive Anfrage läuft. Errst bei der
nächsten Verwendung der Verbindung kommt es zu einem Fehler. Dies ist in einer
Applikation zu beachten, insbesondere, wenn man auf Connection Pooling setzt.
2. SQL Azure beendet Transaktionen, die länger als 24 Stunden laufen. Die
Fehlernummer ist 40549.
©Soft-Dat GmbH - Berndt Hamböck 2014
76
Hamboeck / Azure für Entwickler
3. Sessions, die mehr als eine Million Locks produzieren werden beendet. Falls dies
geschieht, tritt die Fehlermeldung 40550 auf. Die Dynamic Management View (DMV)
sys.dm_tran_locks liefert Informationen zu Locks in SQL Azure.
4. Log-File Größe: Verbindungen, die in einer einzelnen Transaktion mehr als 2GB an
Log-Speicherplatz benötigen, werden von Azure SQL beendet. Der Fehlercode 40552
wird retourniert.
5. Sollten Sessions in Azure SQL länger als 20 Sekunden auf freien Speicher warten,
dann werden andere Sessions, die mehr als 16MB über einen Zeitraum von 20
Sekunden verbraucht haben, beendet. Begonnen wird bei der ältesten Sessions und
solange, bis genügend Speicher für die anderen Sessions zur Verfügung stehen. Wenn
die Verbindung aus diesem Grund beendet wurde, erhält man die Fehlernummer
40553.
Wie man deutlich erkennen kann, ist ein gutes Fehlerhandling in Applikationen bestimmt
nicht von Nachteil, auch die Unterscheidung des Fehlers ist von Vorteil, da möglicherweise
ein sofortiger zweiter Versuch der gewünschten Transaktion erfolgreich abgeschlossen
werden kann.
Jetzt wollen wir aber eine neue Datenbank unter Azure SQL anlegen, dazu gibt es
mehrere Möglichkeiten.
3.4
Anlegen einer Datenbank in Azure SQL
Das Anlegen einer Azure SQL Datenbank kann auf verschiedene Arten erfolgen.
3.4.1
Anlegen einer DB mit dem Windows Azure Management Portal
Im Azure Management Portal können Azure SQL Datenbanken auf 3 verschiedene Arten
angelegt werden - mittels „Schnellerfassung“, „Benutzerdefiniert“, oder durch „Importieren“.
Sehen wir uns die ersten beiden Varianten gleich einmal an, das Importieren verschieben wir
auf einen ezwas späteren Zeitpunkt in diesem Kapitel.
SCHNELLERFASSUNG
Nach erfolgter Anmeldung im Azure Management Portal kann umgehend eine neue Azure
SQL-Datenbank angelegt werden, dazu ist auf der linken Seite in auf die Auswahl SQLDATENBANKEN zu klicken und auf das „+NEU“ Icon links unten.
Abbildung 3.10: Anlegen einer neuen Datenbank im Azure Management Portal
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
77
Es öffnet sich ein neues Fenster, wobei der Bereich Datendienste, SQL-DATENBANK und
SCHNELLERFASSUNG bereits vorausgewählt sind. Es sind nur noch Werte für den
Datenbanknamen, das Abonnement und den Server anzugeben, bzw. auszuwählen.
Abbildung 3.11: Anlegen einer neuen Datenbank
Ein bereits existierender logischer Server kann in der Auswahlliste angewählt werden,
falls noch kein Server angelegt wurde, dann kann an dieser Stelle ein neuer Server angelegt
werden. Nicht zu vernachlässigen ist die Region des Datenbankservers, da dieser mit einer
etwaigen Web-Applikation gemeinsam verwendet wird. Diese beiden sollten für optimale
Performance in der gleichen Region angesiedelt sein.
Nach dem Drücken des folgenden Links ist die Datenbank auch schon verfügbar:
Dabei handelt es sich um eine Standard Datenbank vom Typ S0, mit einer maximalen
Größe von 250GB.
Abbildung 3.12: Erstellte Datenbank mit dem Namen sqldb1.
©Soft-Dat GmbH - Berndt Hamböck 2014
78
Hamboeck / Azure für Entwickler
Falls man mehr Kontrolle über die Erstellung haben möchte, bietet sich die zweite
Variante, das „Benutzerdefinierte Erstellen“ an.
BENUTZERDEFINIERT ERSTELLEN
Der Vorgang ist zu Beginn der Gleiche wie bei der Schnellerfassung, im Azure Management
Portal auf der linken Seite auf die Auswahl SQL-DATENBANKEN klicken und auf das + Icon
links unten anwählen, danach allerdings BENUTZERDEFINIERT ERSTELLEN verwenden.
Abbildung 3.13: Anlegen einer benutzerdefinierten Datenbank im Azure Management Portal
Es öffnet sich ein neues Fenster und es können nun mehrere Werte eingegeben, bzw.
angewählt werden. Name, Abonnement und Server haben die gleiche Bedeutung, wie
während der Schnellerstellung. Allerdings wurde hier als Beispiel ein existierender virtueller
Azure Datenbankserver ausgewählt.
Die Sortierung ist bereits passend vorausgewählt, eine Kontrolle schadet allerdings nicht,
da eine Sortierung nach dem Erstellen der Datenbank nicht mehr geändert werden kann. Die
Standardsortierung
ist
"SQL_Latin1_General_CP1_CI_AS":
Lateinisches
Wörterbuch,
Codepage 1 (CP1), Groß-/Kleinschreibung (Case-Insensitive, CI) und Akzente (AccentSensitive, AS).
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
79
Abbildung 3.14: Anlegen einer neuen Datenbank im Azure Management Portal
Die Auswahl der Dienstebene wirkt sich auf die Leistungsfähigkeit und am Ende auch auf
die Kosten aus, die später noch beleuchtet werden. Sehen wir uns zuerst an, für welchen
Anwendungsfall eine Dienstebene die geeignete Wahl sein könnte.
Die BASIC-Dienstebene stellt eine Datenbank mit maximal 2GB zur Verfügung und eignet
sich hervorragend zum Einstieg in die Welt der Azure SQL-Datenbanken. Also z. B. schon
während der Entwicklung einer Anwendung, denn dafür benötigt man häufig keine hohe
Leistung.
Möglicherweise
auch
als
Produktivumgebung,
wenn
die
Datenbank
im
Einzelbenutzermodus verwendet wird, da in dieser Verwendungsart normalerweise keine
hohen Parallelitäts- und Leistungsansprüche an die Datenbank gestellt werden. Die
Dienstebene
BASIC
bietet
eine
ideale
Umgebung
für
Datenbankentwicklung.
©Soft-Dat GmbH - Berndt Hamböck 2014
die
kostengünstige
80
Hamboeck / Azure für Entwickler
Wird eine Datenbank benötigt, die mehrere Benutzer gleichzeitig unterstützen muss - wie
es z. B. für Webseiten mit mäßigem Datenverkehr oder Anwendungen für einzelne
Abteilungen in einer kleinen Firma der Fall ist - die also einen höheren Ressourcenbedarf als
bei BASIC haben, eignen sich die STANDARD-Dienstebene. Datenbanken bis zu 250GB sind
hier möglich.
Werden zahlreiche gleichzeitige Anforderungen gestellt oder hohe Spitzenlasten erzielt –
wie z. B. bei einer Website mit starkem Datenverkehr oder einer Anwendung, die zum
Ausführen ihrer Vorgänge einen hohen Bedarf an CPU-, Arbeitsspeicher- oder E/ARessourcen hat oder aber auch wenn ein Datenbankvorgang über einen längeren Zeitraum
mehrere CPUs nutzt - empfiehlt sich die Verwendung der PREMIUM-Dienstebene. Auch wenn
schnelle Antwortzeiten unbedingt notwendig sein müssen, dann ist diese Dienstebene zu
empfehlen, da hier die PREMIUM-Dienstebene sicherstellt, dass Rechenleistung verfügbar ist.
Hier sind Datenbanken bis zu 500GB möglich.
Die Web- und Business-Dienstebene der Azure SQL-Datenbank werden im September 2015
eingestellt. Basic, Standard und Premium werden die Web und Business Dienstebenen
ersetzen.
Abbildung 3.15: Erstellte Datenbanken, sqldb1 als benutzerdefinierte Datenbank.
3.4.2
Anlegen mit PowerShell
Eine alternative zum Anlegen mit dem Azure Management Portal ist das Anlegen der
Datenbank mittels der PowerShell.
Aufruf-Beispiel mit einem vorhandenen Server:
New-AzureSqlDatabase -ServerName "nh8xlt6qwd" -DatabaseName "svobi4ps"
-Edition "Basic" -MaxSizeGB 1 -Collation
"SQL_Latin1_General_CP1_CI_AS"
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
81
Abbildung 3.16: Anlegen der svobi4ps Datenbank mittels PowerShell
3.4.3
Anlegen mit Microsoft SQL Server Management Studio oder Visual
Studio
Eine weitere Alternative beim Anlegen der Datenbank ist das Anlegen mittels SQL Server
Management Studio (SSMS). Als Servername ist der logische Datenbank-Server einzugeben
und als Login und Passwort die Zugangsdaten, die zum Zeitpunkt des Anlegens des logischen
Datenbank-Servers vergeben wurden.
Abbildung 3.17: Anmeldung im SSMS
Wenn die IP-Adresse in den FireWall-Rules im Azure Management Portal hinterlegt wurde,
dann sollte der Zugriff auch klappen. Sollte der Anwender allerdings eine dynamische IPAdresse besitzen, wie sie von manchen DSL-Providern vergeben wird, dann erscheint die
folgende Fehlermeldung:
©Soft-Dat GmbH - Berndt Hamböck 2014
82
Hamboeck / Azure für Entwickler
Abbildung 3.18: Fehlermeldung bedingt durch die Firewall-Rule
Nachdem die Firewall-Rules angepasst wurden, wird der Zugriff nun klappen und im
Object Explorer im SSMS erscheint nahezu das gewohnte Bild. Das Icon für den Server zeigt
an, dass wir nun mit unserem Azure SQL Datenbankserver verbunden sind und nicht mit
einer lokalen Installation. Nun kann wie gewohnt eine neue Datenbank durch Klick mit der
rechten Maustaste auf den Datenbank-Knoten im Object-Explorer angelegt werden.
Abbildung 3.19: SSMS Object Explorer und neue Datenbank
Alternativ dazu klappt natürlich auch das Anlegen der neuen Datenbank mittels TSQLScript.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
83
Abbildung 3.20: Neue Datenbank svobi5ssms
Dieses TSQL-Statement würde die WEB-Dienstebene verwenden - was sich im Azure
Management überprüfen lässt.
Abbildung 3.21: Ändern der Dienstebene nach dem Anlegen im SSMS
Der komplette Befehl zum Anlegen der Datenbank lässt uns auch die Größe der
Datenbank angeben und als zweite Option die gewünschte Dienstebene, was sicherlich die
empfehlenswertere Variante ist, da wie bereits erwähnt WEB (und BUSINESS)Dienstebenen
nicht mehr aktiv sind und mit September 2015 ganz eingestellt werden.
CREATE DATABASE svobi6ssms (MAXSIZE=1GB, EDITION='Basic')
GO
Das erfolgreiche Erzeugen der Datenbank lässt sich auch im Azure Management Portal
überprüfen.
©Soft-Dat GmbH - Berndt Hamböck 2014
84
Hamboeck / Azure für Entwickler
Abbildung 3.22: Neue Datenbank svobi5ssms im Azure Management Portal
Außerdem kann in Windeseile eine Kopie der Datenbank erstellt werden - mit dem TSQLCode:
CREATE DATABASE svobi6ssmsCopy AS COPY OF svobi6ssms
Der Kopiervorgang passiert asynchron, d. h. die sofortige Rückmeldung im SSMS
bedeutet nicht, dass der Vorgang schon beendet ist. Aber der aktuelle Status der KopierOperation kann mittels Abfrage der DMV „dm_database_copies“ ermittelt werden:
SELECT * FROM sys.dm_database_copies
3.4.4
Anlegen mit C# und SQL Commands
Als Entwickler legen wir auch gerne unsere Datenbanken per Code an, das klappt
ebenfalls hervorragend mit den bekannten SqlClient-Kommandos. Man benötigt eine
SqlClient Connection mit dem passenden ConnectionString und ein SQLCommand mit dem
„create database“-statement.
Code-Snippet 1: Anlegen mit SQLCommand
using System;
using System.Data.SqlClient;
namespace CreateAzureDatabase
{
class Program
{
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
static void Main(string[] args)
{
string connectionString = "Data
Source=nh8xlt6qwd.database.windows.net;Initial Catalog=master;User
ID=svobi;Password=XXXXXXXX";
string sql = "CREATE DATABASE svobi6dev (MAXSIZE=1GB,
EDITION='basic');";
using (SqlConnection connection = new
SqlConnection(connectionString))
{
try
{
Console.WriteLine("Connecting");
connection.Open();
Console.WriteLine("Connected, now creating database");
SqlCommand command = new SqlCommand(sql, connection);
command.ExecuteNonQuery();
Console.WriteLine("Database created!");
}
catch (Exception ex)
{
Console.WriteLine("Database creation FAILED:");
Console.WriteLine(ex.Message);
}
}
Console.ReadKey(false);
}
}
}
©Soft-Dat GmbH - Berndt Hamböck 2014
85
86
Hamboeck / Azure für Entwickler
Nach dem Ausführen der DOS-Applikation ist die Datenbank vorhanden, was wiederum
im AzureManagement Portal nachzuweisen ist.
Abbildung 3.23:
Möglicherweise besteht aber auch schon eine SQL Server Datenbank, die in Azure SQL
importiert werden soll - das wäre unser nächstes Thema in diesem Kapitel.
3.5
Importieren einer Datenbank zu Azure SQL
Ein einfaches Backup und Restore Szenario, wie es bei lokalen SQL Server Installationen
gang und gäbe ist, Datenbanken zu exportieren bzw. zu importieren, ist in Azure SQL nicht
möglich. Das Schema als auch die Daten einer SQL Server Datenbank können zu Azure SQL
nur mittels einer BACPAC-Datei migriert werden. Zu beachten sind die bereits erwähnten
Einschränkungen, da in Azure SQL nun einmal nicht alle Features einer lokalen SQLServer
Installation zur Verfügung stehen.
Zum Ausprobieren des Imports eignet sich eine leere Datenbank, oder die für Azure SQL
angepasste Version der Adventureworks 2012 Datenbank. Diese ist hier zu finden:
http://msftdbprodsamples.codeplex.com/releases/view/37304 und enthält alle notwendigen
Skripte um die Adventureworks 2012 Datenbank lokal, oder auch sofort unter Azure SQL
anzulegen.
Um nun eine lokale Datenbank in Azure SQL zu importieren, kann im SSMS durch RechtsKlick auf die lokal existierende Datenbank, danach durch Anwählen von Tasks – „Deploy
Database to Windows Azure SQL Database“ eine Datenbank mit Hilfe eines Wizards angelegt
werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
87
Abbildung 3.24:
Es öffnet sich ein Fenster mit einem Wizard, der die gesamte Komplexität zum Erzeugen
der BACPAC-Datei und dem Anlegen der Datenbank vor uns versteckt. Der Wizard verwendet
die BACPAC-Datei um auch sofort die Datenbank anzulegen, es wird lediglich die Verbindung
zum Azure Datenbank-Server benötigt (nh8xlt6qwd.database.windows.net, sowie Username
und Passwort).
Derzeit stehen in diesem Dialog leider nur die beiden veralteten Dienstebenen WEB und
BUSINESS zur Verfügung. Es empfiehlt sich also im Anschluss die Dienstebene im Azure
Management Portal anzupassen.
©Soft-Dat GmbH - Berndt Hamböck 2014
88
Hamboeck / Azure für Entwickler
Abbildung 3.25:
Im Azure Management Portal ist die importierte Datenbank zu sehen.
Abbildung 3.26: Die migrierte Datenbank im Azure Management Portal
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
89
Nach dem Anwählen der Datenbank kann über den Menüpunkt SKALIEREN die
Dienstebene angepasst werden.
Abbildung 3.27: Anpassen der Dienstebene
In der Praxis kann das SQL Database Migration Wizard Tool durchaus hilfreich sein, wenn
es sich um den Import einer bestehenden lokalen Datenbank handelt. Dieses ist hier zu
finden: http://sqlazuremw.codeplex.com/. Es unterstützt den SQLServer ab Version 2008R2
bis 2014.
Anlegen einer Datenbank klappt somit schon hervorragend auf verschiedene Arten kommen wir nun zu einem Szenario, welches unvermeidbar ist. Was macht man im
Fehlerfall, was, wenn Daten teilweise oder komplett wieder hergestellt werden müssen und
wie kann man sich darauf vorbereiten?
3.6
Backup & Restore
Wenn doch einmal etwas passiert, wenn Daten bzw. Datenbank wieder hergestellt werden
müssen, dann wird es interessant. Für das Disaster Recovery in Azure SQL Database gibt es
vier Varianten.
1. Die einfachste Option ist das „Point in Time- Restore“. Dieses wird automatisch mit
einer Azure SQL Datenbank mitgeliefert. D. h. es werden automatisch tägliche
Backups (um Mitternacht) angelegt und dann wird ein Datenbank-Restore, je nach
Dienstebene, für Zeiträume innerhalb der letzten 7, 13, oder 35 Tage durchgeführt.
2. Die „Geo-Restore“ Option ist dem Point in Time Restore ähnlich, nur dass das tägliche
Backup in einer anderen geographischen Region (siehe Kapitel 1) als der originalen
Datenbank-Region abgelegt wird. Falls also in einem Datacenter etwas Schlimmes
passieren würde, wären die Daten in der zweiten Region immer noch vorhanden. Wie
beim Point in Time Restore, ist das Geo-Restore in Azure SQL fix integriert und für alle
Dienstebenen vorhanden.
3. - 4. Die beiden besten Azure SQL Disaster Recovery Optionen sind die „Standard GeoReplikation“ und die „Active Geo-Replikation“. Beide Optionen replizieren Änderungen
©Soft-Dat GmbH - Berndt Hamböck 2014
90
Hamboeck / Azure für Entwickler
von der primären Datenbank in die beiden sekundären Datenbanken. Dies geschieht
asynchron, die Transaktionen werden gepuffert und blockieren den Client nicht. Der
große Unterschied zwischen diesen beiden ist das Zeitfenster, innerhalb dem die
Datenbank wieder verfügbar ist, und der maximale Datenverlust. Des Weiteren ist die
sekundäre Datenbank bei der Standard Geo-Replication nicht lesefähig, bei der Active
Geo-Replication allerdings schon, was diese zu einem idealen Kandidaten für
Reporting-Applikationen macht (sofern man die Premium Dienstebene gewählt hat).
Die nachfolgende Tabelle zeigt die verschiedenen Optionen und die zugehörige Dienstebene,
wobei folgendes angeben ist:
-
RTO steht für Recovery Time Objective - das ist die maximale Downtime
bevor die Applikation, bzw. Datenbank nach einem Fehlerfall wieder zur
Verfügung steht und
-
RPO steht für Recovery Point Objective - das ist der maximale aktzeptable
Datenverlust zwischen dem Zeitpunkt der letzten Sicherung und des
Systemausfalls.
Disaster Recovery Typ
Basic
Standard
Premium
Point-in-time restore
Jeder Restore Point der Jeder Restore Point der
letzten 7 Tage
letzten 14 Tage
Jeder Restore Point der
letzten 35 Tage
Geo-restore
RTO < 24 Stunden
RPO < 24 Stunden
RTO < 24 Stunden
RPO< 24 Stunden
RTO < 24 Stunden
RPO < 24 Stunden
Standard geo-replication
Nicht verfügbar
RTO < 2 Stunden
RPO < 30 Minuten
RTO < 2 Stunden
RPO < 30 Minuten
Active geo-replication
Nicht verfügbar
Nicht verfügbar
RTO < 1 Stunden
RPO < 5 Minuten
Tabelle 3.2: Optionen für das Point in Time Restore nach Dienstebenen
Weitere Möglichkeiten, um die Datenbank auch selbst zu sichern sind:
1. Eine einfache Möglichkeit die Datenbank unter Azure zu sichern ist das „database
copy“-Kommando, der Nachteil hierbei ist, dass die Kosten für eine zweite Datenbank
zu tragen sind.
2. Mit der Verwendung des BACPAC-Exports in den Azure Blob Storage, können die
Kosten für eine zweite Datenbank vermieden werden. Blob-Storage ist um ein
Vielfaches billiger als eine weitere Datenbank. Allerdings hat man hier wiederum
genauso wenig die Möglichkeit, ein transactional oder differential Backup
durchzuführen, wie man es von der On-Premise Variante gewohnt ist.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
91
3. Mittels 3rd-Party-Tools, die den Bulk-Copy Vorgang vereinfachen. Ich möchte an
dieser Stelle zwei Tools nennen, die in C# geschrieben sind. Zum einen ist das das
SQL Azure Backup Tool, hier zu finden:
http://sqlazurebackup.codeplex.com/
und SQL Azure BCP, welches den Load-Prozess mittels einer XML Datei definiert, es ist
hier zu finden:
http://bcp2sqlazure.codeplex.com/
Wie auch immer man sich entscheidet, es schadet bestimmt nicht, die eine oder andere
Variante schon im Vorfeld zu testen, damit man im Fehlerfall weiß, welche Möglichkeiten zur
Verfügung stehen.
Weiter geht es mit dem Point in Time Restore.
3.7
Durchführen eines Point in Time Restore
Im Azure Management Portal kann die tägliche Sicherung einer Azure SQL Datenbank
wieder
hergestellt
werden.
Dazu
ist
die
Datenbank
anzuwählen
und
der
Button
Wiederherstellen zu drücken.
Abbildung 3.28:
Es öffnet sich ein neues Fenster – in dem der Name der “neuen” Datenbank anzugeben
ist, sowie der Wiederherstellungszeitpunkt. In dem unteren Beispiel handelt es sich um eine
Datenbank mit der Dienstebene BASIC, damit stehen maximal 7 Tage zur Verfügung. Die
Datenbank kann nicht unter dem gleichen Namen wie die existierende wieder hergestellt
werden. Also muss die Datenbank mit einem neuen Namen wieder hergestellt werden, dann
die Originaldatenbank gelöscht werden und danach die neue Datenbank auf den alten Namen
geändert werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
92
Hamboeck / Azure für Entwickler
Abbildung 3.29:
Das Wiederherstellen der Datenbank dauert einige Zeit, sogar bei kleinen Datenbanken
dauert dies einige Minuten. Der Vorgang kann mit der DMV sys.dm_operation_status
überwacht, bzw. überprüft werden.
Select * from sys.dm_operation_status where operation = 'DATABASE
RESTORE'
Ein Teil des Ergebnisses sieht wie folgt aus:
Abbildung 3.30: Ergebnis der DMV nach dem Restore
Die Datenbank kann im SSMS gelöscht werden und die neue Datenbank auf den
originalen Namen umbenannt werden.
drop database [hambodb]
go
alter database [hambodb_2014-12-28T18-29Z] modify name = [hambodb]
go
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
93
Es könnte allerdings auch interessant sein, eine lokale Datenbank in Azure selbst zu
sichern, was ebenfalls möglich ist und nachfolgend gezeigt wird.
3.8
Backup einer On-Premise Datenbank in den Azure Storage
Das Microsoft „SQL Server Backup to Microsoft Azure“-Tool ermöglicht die Sicherung in
den Azure-BLOB-Speicher, und verschlüsselt und komprimiert SQL Server-Sicherungen, die
lokal oder in der Cloud gespeichert werden. In SQL Server 2014 ist diese Tool bereits in
SSMS integriert, für ältere Versionen steht es als Download zur Verfügung:
http://www.microsoft.com/de-at/download/details.aspx?id=40740
Bevor Backups erstellt werden, muss ein Storage Account (svobistore) und ein
zugehöriger Container (dbrestore) vorhanden sein. Also benötigen wir zuerst einmal ein
Speicher-Konto. Dieser ist über das Azure Management Portal gleich einmal angelegt. Dazu
in der Dienst-Auswahl den Speicher auswählen und den NEU Button drücken.
Abbildung 3.31: Neuer Speicher Dienst
Es öffnet sich ein neues Fenster, in dem der Name des Speicher-Kontos anzugeben ist,
die Region, wo die Daten gespeichert werden und die Art der Daten-Replikation. Dazu mehr
erst im nächsten Kapitel, ich habe für dieses Beispiel folgende Werte angegeben:
6.
URL: svobistore
7.
Standort: Nordeuropa
8.
Replikation: Lokal redundant
©Soft-Dat GmbH - Berndt Hamböck 2014
94
Hamboeck / Azure für Entwickler
Abbildung 3.32: Anlegen des Speicher-Kontos
Sobald das Speicher-Konto angelegt ist, sollten wir uns gleich den Zugriffsschlüssel
merken, diesen benötigen wir dann nämlich im SSMS, um die BACPAC-Datei in einen
Container des Speicher-Kontos hochzuladen. Diesen erhalten wir durch Drücken des Buttons
ZUGRIFFSSCHLÜSSEL VERWALTEN in der unteren Menüleiste, wenn der neu angelegte
Speicher-Dienst angewählt ist.
Abbildung 3.33: Anzeige des Zugriffschlüssels
Es öffnet sich ein neues Fenster, wo der Name des Speicherkontos und die beiden
Zugriffschlüssel angezeigt werden. Der primäre Zugriffschlüssel kann mittels des kleinen
Buttons rechts neben dem angezeigten Schlüssel in das Clipboard kopiert werden.
Abbildung 3.34: Zugriffschlüssel kopieren
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
95
Jetzt muss noch der Container innerhalb des Speicher-Kontos angelegt werden. Ich habe
diesen dbrestore genannt.
Abbildung 3.35: Storage und Container für das Backup im Azure Management Portal
Der nächste Schritt ist, den Zugriffsschlüssel im SQL Server als Credential zu hinterlegen.
Das Anlegen des Credentials mit dem Namen „AzureCredentials“ für den Container
„svobistore“ funktioniert am besten im SSMS mit ein paar Zeilen T-SQL:
IF NOT EXISTS
(SELECT * FROM sys.credentials WHERE credential_identity =
'AzureCredentials')
CREATE CREDENTIAL AzureCredentials WITH IDENTITY = 'svobistore'
,SECRET = '<storage access key>' ;
Ist der Storage-Account und der Container vorhanden, sowie die Credentials im SQL
Server hinterlegt, dann kann es mit dem Backup losgehen. Im SSMS ist dann auf der
Datenbank mittels der rechten Maustaste und den Menüeinträgen Tasks-> Backup die
Datenbanksicherung zu konfigurieren.
Abbildung 3.36: Backup der AdventureWorks 2012 Datenbank
©Soft-Dat GmbH - Berndt Hamböck 2014
96
Hamboeck / Azure für Entwickler
Es öffnet sich das altbekannte Backup-Fenster, es muss allerdings als Ziel „URL“
angewählt werden (der Default FILE darf nicht beibehalten werden). Die SQL Credentials, die
wir zuvor angelegt haben, sollten in der Auswahl zur Verfügung stehen. Der Azure Storage
Container ist unser Container mit dem Namen dbrestore.
Abbildung 3.37: Konfiguration des Backups in den Azure Storage
Wurde nicht das CREATE CREDENTIAL Statement ausgeführt, dann kann das Gleiche auch
mit
dem
„Create“-Button
AzurePublishSettingsFile,
erreicht
das
man
werden
mit
der
-
allerdings
PowerShell
benötigt
und
man
dem
dann
Befehl:
ein
Get-
AzurePublishSettingsFile erhält.
Optional sollte allerdings auch das direkte Browsen zu folgender URL klappen:
https://manage.windowsazure.com/publishsettings/index?client=powershell).
Danach kann das File in dem Dialog ausgewählt werden und der Storage Account
angegeben werden. Der Create-Button legt dann das CREDENTIAL an.
Mit dem OK Button wird das Backup in den Azure Storage gestartet und im Azure
Management Portal ist das Resultat einsehbar.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
97
Abbildung 3.38: Adventureworks 2012 Backup als Azure Page Blob
Code: T-SQL Statement für das Backup in den Azure Speicher-Dienst
USE master;
GO
IF NOT EXISTS
(SELECT * FROM sys.credentials WHERE credential_identity =
'AzureCredentials')
CREATE CREDENTIAL AzureCredentials WITH IDENTITY = 'svobistore'
,SECRET = '<storage access key>' ;
-- Display the newly created credential
SELECT * from sys.credentials
-- Create a backup in Windows Azure Storage.
BACKUP DATABASE AdventureWorks2012
TO URL =
'https://svobistore.blob.core.windows.net/dbrestore/AdventureWorks
2012.bak'
WITH CREDENTIAL = 'AzureCredentials'
,COMPRESSION
,STATS = 5;
GO
Damit befindet sich das Backup im Speicher-Dienst. Es empfiehlt sich auch das Restoren der
Datenbank vorab einmal zu testen, damit im Fall des Falles alles gut geht.
©Soft-Dat GmbH - Berndt Hamböck 2014
98
Hamboeck / Azure für Entwickler
3.9
Restore einer On-Premise Datenbank aus dem Azure
Storage
Das einzige Problem bei der Durchführung des Restore ist, dass SSMS den Zugriff auf den
Storage-Dienst und den zugehörigen Container mittels einer sogenannten SHARED ACCESS
SIGNATURE erhält. Am einfachsten bekommt man diesen mit dem Tool „Azure Storage
Explorer“, dieses ist hier zu finden: https://azurestorageexplorer.codeplex.com/
Nach der Installation und dem Verbinden mit dem eigenen Speicher-Dienst, kann die
SHARED ACCESS SIGNATURE erzeugt werden.
Abbildung 3.39: Azure Storage Explorer und Shared Access Signature.
Der für das SSMS benötigte Teil sieht in meinem Beispiel so aus:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
99
sv=2014-0214&sr=c&sig=4XdkEbH3seTzowt3BHHrn%2B51IKPsOpkL55WLKdhEOCU%3D&st=2014-1228T23%3A00%3A00Z&se=2015-01-05T23%3A00%3A00Z&sp=rwl
Jetzt ist auch schon alles vorhanden, was wir benötigen: die SHARED ACCESS
SIGNATURE, um ein Credential für den Speicher-Dienst und dem zugehörigen Container
anzulegen..
Code: T-SQL Statement für das Restore aus dem Azure Speicher-Dienst
-- Create a Shared Access Signature credential
CREATE CREDENTIAL [https://svobistore.blob.core.windows.net/dbrestore]
WITH IDENTITY='SHARED ACCESS SIGNATURE',
SECRET = 'sv=2014-0214&sr=c&sig=4XdkEbH3seTzowt3BHHrn%2B51IKPsOpkL55WLKdhEOCU%3D&st=20
14-12-28T23%3A00%3A00Z&se=2015-01-05T23%3A00%3A00Z&sp=rwl'
GO
USE master;
GO
RESTORE DATABASE AdventureWorks2012
FROM URL =
'https://svobistore.blob.core.windows.net/dbrestore/AdventureWorks
2012.bak'
WITH
CREDENTIAL = 'BackupCredential',
REPLACE,
MOVE 'AdventureWorks2012' TO 'C:\Backup\AdventureWorks2012.mdf',
MOVE 'AdventureWorks2012_log' TO
'C:\Backup\AdventureWorks2012_log.ldf';
GO
Damit sind wir für den Ernstfall perfekt gerüstet. Backups werden in der Cloud
gespeichert. Im Ernstfall kann die lokale Datenbank wieder hergestellt werden. Kommen wir
abschließend zu den Kosten einer Azure SQL Datenbank.
©Soft-Dat GmbH - Berndt Hamböck 2014
100
3.10
Hamboeck / Azure für Entwickler
Kosten der Azure SQL Datenbank
Am einfachsten ist hier die Berechnung wiederum mit dem Azure Preisrechner
http://azure.microsoft.com/de-DE/pricing/calculator/?scenario=data-management
Zur Wahl stehen die drei Dienstebenen BASIC, STANDARD und PREMIUM und die
Leistungsebenen S0, S1 und S2, bzw. P1, P2 und P3.
Abbildung 3.40: Kosten für Basic, Standard und Premium für 1 Datenbank (Stand Dez. 2014)
Nicht zu vergessen ist der ausgehende Datenverkehr, dieser ist noch zu den Kosten
aufzuaddieren (die ersten 5GB pro Monat sind frei).
Abbildung 3.41: Kosten für ausgehende Daten von 200GB pro Monat (Stand Dez. 2014)
3.11
Zusammenfassung
Azure SQL weist einige Unterschiede zu einer On-Premise Installation auf. Dies kann
anfangs zu Problemen führen, wenn eine bestehende Datenbank zu Azure SQL migriert
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
101
werden soll. Sobald diese Probleme der Datenbankstruktur und auch in der dazugehörigen
Applikation überwunden sind, werden die Vorteile allerdings überwiegen. Tägliche Backups,
die auswählbaren Dienstebenen können einem das Leben in einer Produktionsumgebung
erleichtern. Die anfallenden Kosten sind berechenbar, alternative Speicherungsmöglichkeiten
sehen wir uns im nächsten Kapitel an.
©Soft-Dat GmbH - Berndt Hamböck 2014
102
Hamboeck / Azure für Entwickler
4
Azure Storage
In diesem Kapitel

werden die Vorteile einer Cloud Lösung beschrieben.

werden die Vorbehalte für einen möglichen Cloud-Einstieg beschrieben.

wird erklärt, wo „die Microsoft Cloud“ sich auf unserem Planeten befindet.

die Fülle vorhandener Dienste aufgeführt.
Seit längerem setzen sich in manchen Bereichen sogenannte NoSQL-Datenbanken durch.
Auch Microsoft bietet diese Speicherungsmöglichkeit unter Azure an. Dieses Kapitel widmet
sich dieser Art der Datenspeicherung unter Microsoft Azure, sowie wann welche der
angebotenen Möglichkeiten verwendet werden kann.
Stürzen wir uns also in das Abenteuer der NoSQL-Welt und fangen einmal mit der
generellen Unterscheidung an, wie Daten abgelegt werden können:
Zur Verfügung stehen uns
1. relationale Datenbanken und
2. NoSQL Datenbanken.
Zerpflücken wir einmal 1. und danach 2., dann werden wir sehen, dass Microsoft hier
wieder einmal mit Azure sehr innovativ unterwegs ist und uns schon heute Optionen für
morgen anbietet! Als Entwickler wollen wir die angebotenen Möglichkeiten natürlich auch
testen, mehr als einen Azure Account brauchen wir dazu erst einmal nicht, diesen haben wir
ja seit Kapitel 1.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
4.1
103
Relationale Datenbanken
Ich selbst war sechs Jahre bei Sybase und kann daher voll und ganz verstehen, dass
Microsoft den Source Code von Sybase vor langer Zeit gekauft hat und daraus ein
großartiges Produkt mit dem Namen Microsoft SQLServer gemacht hat. Aber was macht
relationale Datenbanksysteme so großartig? Ich bin mir ziemlich sicher, dass die meisten
meiner Leser gelangweilt an die Decke starren, aber da sollten wir kurz durchtauchen, um
möglicherweise im Anschluss eine komplett NEUE Welt (der Daten) kennen zu lernen und zu
verstehen.
Den Grundstein für relationale Datenbanksysteme (kurz RDBMS) legte ein gewisser Edgar
Codd (von IBM), der im Jahre 1970 (also sogar vor meiner Zeit) zwölf Regeln aufstellte
(Codd's 12 rules), die genau definieren, was denn ein System können sollte, um ein RDBMS
zu sein. In den frühen 80er Jahren haben sich dann die ersten Hersteller mit diesem Thema
auseinandergesetzt, und – voila – die Datenbanken, so wie wir sie (in den meisten
Unternehmen) kennen, haben das Licht der Welt erblickt.
Wir verwenden also einen Datenbankserver, der uns eine oder mehrere Datenbanken zur
Verfügung stellt. In einer Datenbank befinden sich wiederum eine oder mehrere Tabellen in
einem bestimmten Schema, mit Spalten von einem definierten Datentyp und natürlich
unseren hoch geschätzten Datenzeilen – ohne die unsere Datenbank recht leer aussehen
würde. Wir finden in unseren Datenbanken Primärschlüssel, Fremdschlüssel und (hoffentlich
auch) Indexe. Stored Procedures, Funktionen und Views wollen wir natürlich auch nicht
vergessen. Wenn Daten geschrieben/gelesen/gelöscht werden, werden dazu von unseren
Applikationen Transaktionen verwendet. Dass unsere Datenbank jederzeit konsistent ist
(Stichwort ACID - Atomicity, Consistency, Isolation und Durability – sichergestellt durch
Transaktionsprotokoll, Locking Mechanismen und Isolation Level) setzen wir natürlich voraus.
Beim Design und der Definition der Tabellen verwenden wir die Normalisierung, um die
Redundanz der Daten zu minimieren und Anomalien im Bereich UPDATE und DELETE zu
eliminieren bzw. um relationale Datenintegrität sicher zu stellen. Als Abfragesprache
benutzen wir standardisiertes SQL.
Ich denke, das war es im Schnelldurchlauf
- zwar recht kompakt, aber hoffentlich
verständlich zusammengefasst. In Summe doch etwas Großartiges, was sich in all den
Jahren auf Basis dieser 12 Regeln entwickelt hat!
4.1.1
CAP-Theorem
RDBMS sind eine feine Sache, allerdings geraten wir mit den, in den letzten Jahren immer
häufiger auftretenden, großen Mengen an Daten ein klein wenig in Schwierigkeiten. Diese
wollen nicht mehr so recht in einen einzigen Server hineinpassen (irgendwann hat auch das
Aufrüsten mit größeren und leistungsstärkeren Festplatten, zusätzlichem Speicher und
stärkeren Prozessoren ein Ende erreicht), also werden diese zu einem verteilten System. Das
ist aber nicht der einzige Grund. Neben dem Ressourcenmangel gibt es aber noch weitere
Gründe:

Netzwerk-Bandbreite - die Performance auf einem einzigen Server ist abhängig davon,
©Soft-Dat GmbH - Berndt Hamböck 2014
104
Hamboeck / Azure für Entwickler
wie schnell eingehende Anfragen empfangen und ausgehende Resultate gesendet
werden können. Wenn die Netzwerklast die Kapazität des Netzwerkes übersteigt,
kommt es zu Ausfällen und im Endeffekt zu unglücklichen Anwendern.

Regionsabhängige Server – möglicherweise wird es notwendig, Anwenderdaten in dem
Land zu speichern, in dem diese anfallen (unter Azure gibt es die Auswahlmöglichkeit
zwischen 15 Regionen, wo die Daten abgelegt werden können). Gründe dafür können
gesetzlicher Natur sein, oder eben wieder die Performance (Latenz der Datenzugriffe)
sein. Wenn Anwender in verschiedenen Teilen der Welt verstreut sind, ist es eben
vermutlich besser, mehr als einen Server zur Verfügung zu stellen.
Wenn zumindest einer dieser eben genannten Gründe zutrifft, dann werden relationale
Datenbanken verteilt. Nun, das bringt uns zum sogenannten CAP-Theorem, da solche
verteilten UND weiterhin leistbaren Systeme nur zwei, der drei folgenden Eigenschaften
(die wir an relationalen Datenbanken so schätzen) erfüllen können:

(C) Strong Consistency - Konsistenz: Jeder Client (gemeint sind Anwendungen, bzw.
die Anwender) sieht zur selben Zeit dieselben Daten, auch bei Datenänderungen –
eben auch bei Transaktionen mit 2-Phase-Commits.

(A) High Availability - Verfügbarkeit: Alle Anfragen von Clients an das
Datenbanksystem werden jederzeit und mit akzeptabler Antwortzeit beantwortet.

(P) Partition-Tolerance - Ausfallstoleranz: Das gesamte Datenbanksystem muss
weiterhin stabil laufen, auch wenn einer der eingesetzten Server ausfällt oder neue
Server hinzugefügt werden. Auch der Ausfall einer Kommunikationsverbindung muss
verkraftet werden können, ohne dass die Clients etwas davon bemerken. Damit Daten
auch nach Ausfall eines Servers vorhanden sind, werden sie repliziert auf
verschiedenen Servern gespeichert.
Relationale Datenbanksysteme sind am ehesten im Bereich CA zu finden. Konsistenz der
Daten
hat
üblicherweise
bei
den
relationalen
Systemen
oberste
Priorität
(mittels
Transaktionen und ACID). Den Anforderungen nach Ausfalltoleranz und Verfügbarkeit wird
man meist durch sehr hochwertige und sehr leistungsfähige Hardware (im wahrsten Sinne
des Wortes) Rechnung tragen. Grafisch lässt sich das so darstellen:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
105
Abbildung 4.1:
Was ist aber nun mit CP und PA ? Hier können die NoSQL-Datenbanken eine Lücke
schließen – und so betreten wir das Land der NoSQL-Datenspeicherung (und wir können an
dieser Stelle auch erahnen, warum).
4.2
NoSQL Datenbanken
Beginnen wir zuerst mit der Definition von NoSQL: Wir könnten uns mit dem Namen Not
only SQL zufrieden geben, aber da steckt mehr dahinter, nämlich die Datenbanken der
nächsten Generation, diese sind

nicht-relational

verteilt

Open-source, sowie

horizontal skalierbar.
Man könnte somit geneigt sein zu sagen: So ziemlich das Gegenteil von dem, was man
(zumindest als Entwickler) bisher so geschätzt hat. Aber es kommt noch dicker, es gibt da
noch weitere Anregungen, was eine NoSQL-Datenbank so bietet:

einfache Replikation,

ein simples API

sehr grosse Datenmengen
©Soft-Dat GmbH - Berndt Hamböck 2014
106

Hamboeck / Azure für Entwickler
und
das
Allerbeste
hebe
ich
mir
für
den
Schluss
auf:
Schema-Frei und EVENTUELL konsistent. Das eventuell konsistent beschränkt
sich allerdings auf einen Zeitraum, letztendlich sind die Daten in einem konsistenten
Zustand.
Ich hoffe, die alteingesessenen Datenbank-Hasen unter euch sitzen immer noch halbwegs
gerade auf dem Sessel (dabei habt ihr möglicherweise ‚ein simples API sogar überlesen, was
so viel bedeutet, wie Non-SQL als Abfragesprache)? Ja, das ist schon starker Tobak, klingt
aber durchaus durchdacht, wenn wir uns die fünf NoSQL-Technologien ansehen, die es am
Markt gibt:

Key/Value Stores – speichern der Daten mit einem Partition Key und einem Row Key.

Column Stores – quasi eine Erweiterung der Key/Value Stores um eine weitere
Gruppierung.

Document Stores – Speicherung von Objektstrukturen im JSON-Format.

Graph Databases – wenn die Beziehungen zwischen den Daten im Vordergrund liegen

Big Data Analytics – Analysieren von (unvorstellbar) großen Datenmengen.
Da ein Bild mehr als 1000 Worte sagen kann, möchte ich die NoSQL-Technologien grafisch
veranschaulichen:
Abbildung 4.2:
Ich möchte nun jede einzelne dieser NoSQL-Technologien beleuchten und deren
Einsatzgebiete herausstreichen.
4.2.1
Key/Value Stores
Es gibt hier verschiedene Implementierungen, in Microsoft Azure heißt der NoSQL
Key/Value Store, Azure Table Storage. Um Daten im Table Storage zu speichern, wird eine
Tabelle (heißt zwar so, hat aber keine Ähnlichkeit mit einer relationalen Datenbanktabelle)
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
107
mit einem 2-teiligen Schlüssel und weitere Spalten für die Daten selbst benötigt. Dieser 2teilige Schlüssel besteht aus:

einem Partition-Key, nach diesem wird die Tabelle partitioniert und

dem Row Key, dieser identifiziert die Zeile eindeutig INNERHALB der Partition (fast so
wie der gewohnte Primary Key, aber eben nur beinahe).
Weitere Entitäten (unsere altbekannten Spalten) können nach Belieben angelegt werden
und haben einen Namen, einen Datentyp und (vermutlich) einen Wert.
Ich hatte erst vor kurzem einen interessanten Anwendungsfall für einen Key/Value Store:
Es sollte ein Sicherheitssystem mit sechs Kameras realisiert werden, diese laden die
Bilder alle zwei Sekunden in die Azure Cloud (als Blob-Storage) hoch. In dem Key/Value
Store wurde folgende Information gespeichert:

Partition Key: Der Name der Applikation

Row Key: Die ID der Kamera

Daten: Der Name des aktuellen Azure Blobs und die Aufnahmezeit
Natürlich wäre es möglich gewesen, eine relationale Datenbank zu verwenden, aber hier
war der Preis ausschlaggebend, da der Azure Table Storage mit dem Azure Blob Storage sehr
günstig ist und diese Lösung nur auf wenige € im Jahr (ca. €25,--) kommt.
Azure Table Storage ist, wie andere Implementierungen auch, auf Massendaten
ausgelegt. Die Partitionen einer einzelnen Tabelle können sich über mehrere Maschinen
verteilen. Ein Szenario also, wo wir mit relationalen Datenbanksystemen möglicherweise in
Schwierigkeiten punkto Kosten kommen, da sie mit Sicherheit höher liegen. Dieses
horizontale Partitionieren der Daten wird Sharding genannt. Windows Azure Table Storage
führt das Sharding im Hintergrund aus und skaliert damit automatisch bei großen
Datenmengen. Aber wie werden die Probleme gelöst, die bei relationalen Systemen auftreten
würden?
Jede Abfrage an einem Key/Value Storage kann nur eine Partition ansprechen, Joins sind
nicht möglich. Darauf muss natürlich bereits während der Entwicklung der eigenen
Applikation Rücksicht genommen werden. Wie eingangs erwähnt: Auch wir Entwickler
müssen umdenken und diese neueren Konzepte erst umsetzen lernen. Daten, die also
gemeinsam abgefragt werden wollen, müssen auch innerhalb einer Partition liegen – das gilt
übrigens auch für Transaktionen, diese gelten nur über eine Partition.
4.2.2
Column Stores
Microsoft Azure bietet HBase (mit HDInsight, also Hadoop) als NoSQL Column Store
Implementierung an. HBase, bzw. Column Store-NoSQL-Datenbanken erinnern stark an eine
relationale Datenbank, da die Daten in Tabellen gespeichert werden, Zeilen, Schlüsseln,
Spaltenfamilien, Spalten und Werte sind auch vorhanden. Also alles wie gehabt, nur ein
neuer Name? Mitnichten.
In HBase ist jede Datenzeile durch einen Key definiert, diese Datenzeile beinhaltet eine,
oder mehrere Spalten, welche selbst wiederum Key/Value-Pairs darstellen.
©Soft-Dat GmbH - Berndt Hamböck 2014
108
Hamboeck / Azure für Entwickler
Die Spaltennamen müssen nicht vordefiniert werden, das bedeutet, dass das Schema hier
ebenfalls wiederum kein fixes ist – im Gegensatz zu relationalen Datenbanken. Die Spalten in
einer Datenzeile werden sortiert nach ihrem jeweiligen Namen abgelegt. Zusätzlich speichert
HBase zu jeder Zeile einen Zeitstempel – zur Versionierung - mit ab. Würde ein neuer Wert
in eine der Spalten eingetragen, bleibt der alte Wert weiterhin erhalten.
Anwendungsfall gefällig? Facebook-Messaging, dort wird genau diese Technologie
verwendet, wobei als Zeilenschlüssel die Benutzer-IDs verwendet werden, als SpaltenBezeichner Wörter, die in den Nachrichten der Anwender vorkommen, allerdings wird der
Zeitstempel anders verwendet, da sich gesendete Nachrichten nicht mehr verändern können,
es wird die Nachrichten ID abgelegt.
Die beschriebene Art der Datenspeicherung ist ideal, wenn sehr viele Spalten in einer
Datenzeile vorhanden sind und spezielle Bereiche gesucht werden. Dieser Satz, umgelegt auf
das FaceBook-Messaging Szenario könnte einen zum Nachdenken bringen, was denn wohl
alles mit dieser Technologie möglich ist.
Als Entwickler kann man sich das als geschachtelte Hashtable oder Dictionary, mit einer
Tiefe von 2 oder 3 Levels vorstellen.
Was die Performance angeht, ist HBase skalierbar, wenn also mit großen Datenmengen
von mehreren Gigabyte, oder sogar Terabyte gearbeitet wird, dann ist HBase interessant.
Des Weiteren kann HBase Daten schnell replizieren, sodass im Fehlerfall fehlerhafte Knoten
recht problemlos wieder hergestellt werden können.
4.2.3
Document Stores
In einem Document Store werden sogenannte Dokumente gespeichert, darunter darf man
sich aber nicht z. B Word Dokumente oder PPT-Dateien vorstellen. Was aber könnte es dann
sein?
Ein Beispiel: In einer relationalen Datenbank haben wir Tabellen und Spalten. Also ein
festgelegtes Schema für die abzulegenden Daten. Was aber ist, wenn die Struktur, die wir
als Entwickler verwenden, nicht in dieses Schema passt? Wie oft mussten wir schon das
Datenbank-Schema in die Objekt-Struktur pressen, die man in der Anwendung verwendet?
Natürlich wieder genau anders herum, wenn die Applikations-Daten persistiert werden sollen.
Das war und ist lästig für den Entwickler. Hier wäre es um einiges einfacher, wenn das in der
Applikation verwendete Format durchgängig – in einem Document Store - zur Verfügung
stehen könnte.
Ein anderes Szenario wäre ein WCF-Service, welches Daten mittels Entity-Framework
einliest und diese an einen HTML/JavaScript Client übertragen soll. Das ideale (universelle)
Format dafür ist JSON (JavaScript Object Notation). Die Daten, die übertragen werden sind
nun ebenso ein Dokument, welches in einem Document Store abgelegt werden könnte. Also
eigentlich ein Objekt oder eine Objektstruktur als Dokument.
Ein weiterer Anwendungsfall wäre ein “Einkaufswagen” in einer Shopping-Applikation. Die
abgelegten
Produkte
haben
unterschiedliche
Eigenschaften
–
also
Objekte
mit
unterschiedlichen Strukturen - die durch das lose Schema einer JSON-Datei problemlos
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
109
vorgehalten werden können – was in einer relationalen Datenbank ungleich schwieriger
wäre. So ein Einkaufswagen könnte im JSON-Format so aussehen:
In einer DocumentDB können natürlich komplexere und längere Dokumente gespeichert
werden, man stelle sich einen Blog-Eintrag und die zugehörigen Kommentare vor, ein
Summenfeld mit der Anzahl der Kommentare, Erscheinungsdatum, usw.
Die Azure DocumentDB befindet sich momentan in der Preview-Phase und kann für die
neugierigen Entwickler unter euch getestet werden.
4.2.4
Graph Databases
Was wäre, wenn die Verbindung zwischen den Daten genauso wichtig, oder sogar
wichtiger wäre als erst einmal die Daten selbst? Ich durfte drei Jahre lang an einem Projekt
zur Bekämpfung von Geldwäsche mitarbeiten, wo wir genau den eben angesprochenen Fall
hatten. Es ist interessant, wie Überweisungen, Personen und Firmen in Beziehung stehen und
zuerst einmal gar nicht die zugrunde liegenden Daten selbst. In so einem Fall sind Graph
Databases der geeignete Anwendungsfall.
©Soft-Dat GmbH - Berndt Hamböck 2014
110
Hamboeck / Azure für Entwickler
Unter Azure gibt es keinen Vertreter dieser Gattung, der populärste ist hier Neo4J,
welches aber unter Azure verwendet werden kann.
Wie der Name schon erahnen lässt, werden die Daten als Graph abgelegt. In Neo4J
werden die Daten als Knoten bezeichnet, die Verbindungen zwischen den einzelnen Knoten
sind Beziehungen. Sowohl Knoten als auch Beziehungen können Eigenschaften aufweisen –
die uns nun schon gut bekannten Name/Value Pairs. Neo4J arbeitet (mittlerweile wenig
überraschend) ohne festem Schema, somit können die Eigenschaften jede beliebige
Information beinhalten.
Eine typische Abfrage in Neo4J beinhaltet den Startpunkt (ein einzelner Knoten im
Graphen), die zu matchenden Daten, und die Knoten, zu dem Beziehungen und
Eigenschaften zu retournieren sind.
4.2.5
Big Data Analytics
Hier sind wir bei einem meiner Lieblingsthemen angelangt. Hadoop, bzw. unter Microsoft
Azure HDInsight. Dazu gibt es einen eigenen Blog-Eintrag, auf den ich an dieser Stelle gerne
verweisen möchte, da die Beschreibung von MapReduce, Hive und Pig dieses Mal den
Rahmen sprengen würde.
4.3
Datenkonsistenz in NoSQL-Datenbanken
Da Daten zu mehreren Servern repliziert werden - einer verteilt die Daten an mehrere –
stellt sich die Frage der Datenkonsistenz beim Zugriff auf ebendiese, da das Verteilen der
Daten Zeit benötigt. Was passiert nun, wenn Clients auf diese Daten in der Zeit während die
Synchronisation läuft zugreifen? Welche Daten sind denn nun für diese Clients sichtbar? In
der NoSQL-Welt unterscheidet man zwischen Strong Consistency und Eventual Consistency.
Aus der relationalen Welt sind wir Strong Consistency (read committed) gewohnt, das heißt
alle Clients sehen immer die gleichen (korrekten) Daten, auch, wenn sofort – noch während
das Schreiben der Daten läuft - gelesen wird.
Wenn das System nun nur Eventual Consistency unterstützt würden Clients alte Daten
geliefert bekommen, da diese eventuell auf einen Server zugreifen, wo die Daten noch nicht
synchronisiert wurden. Klingt absurd und unbrauchbar? Nun, ist es wirklich so wichtig in
einem Blog die allerletzten Kommentare (sofort) zu sehen? Oder in einem FaceBook Beitrag?
Man sieht also, es kommt ein wenig auf die Anwendung an, wofür das System eingesetzt
wird.
Zwei weitere Consistency Level, die zwischen den beiden genannten liegen sind Bounded
Staleness
und
Session.
Ersterer
garantiert
konsistentes
Schreiben
mit
verzögerten
Lesezugriffen für alle Clients, letzterer garantiert die Datenkonsistenz für den aktiven Client
für seine eigenen Lese- und Schreibzugriffe.
Wie sieht das unter Microsoft Azure aus?

Azure Table Storage verwendet Strong Consistency, garantiert also die aktuellen
Daten bei einem lesenden und schreibenden Zugriff durch mehrere, bzw. verschiedene
Clients.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
111

Azure DocumentDB lässt uns die freie Wahl zwischen Strong, Bounded Stateless,
Session, oder Eventual Consistency.

HBase verwendet Strongly Consistent Lese- und Schreib-Zugriffe
Die Wahl des Consistency-Levels beeinflusst natürlich die Performance des Systems, wird
Strong Consistency eingesetzt ist das die langsamste Variante für Lese- und Schreibzugriffe,
Eventual Consistency die Schnellste.
4.4
RDBMS und/oder NoSQL?
Wie sollen nun neue Projekte entwickelt werden? Setzen wir in Zukunft NUR NOCH auf
NoSQL? Fügen wir die NoSQL-Technologien erst einmal zu dem zuvor gezeigten Bild hinzu,
so ergibt sich ein Gesamtbild und wir können uns überlegen, wie wir weiter vorgehen
könnten:
Abbildung 4.3:
NoSQL ist typischerweise eine gute Wahl, wenn es sich um unstrukturierte, bzw. Daten
ohne festem Schema handelt. Das Schema muss nicht extra er- bzw. gefunden werden,
©Soft-Dat GmbH - Berndt Hamböck 2014
112
Hamboeck / Azure für Entwickler
Erweiterungen mit neuen Feldern sind– in Hinsicht auf die Speicherung - problemlos zu
verarbeiten.
Eine denormalisierte Form der Daten wird nicht nur favorisiert, sondern ist sogar
notwendig, da keinerlei Joins, zumindest in der Art und Weise wie diese in relationalen
Systemen gehandhabt werden, Unterstützung finden.
Lösungen, die mittels NoSQL implementiert werden, lassen sich häufig einfach besser
skalieren als relationale Datenbanklösungen. Das Hinzufügen weiterer Datenknoten ist
einfach, die Daten werden meist repliziert, daraus ergibt sich in Summe auch einen besseren
Schutz gegen Datenverlust.
Allerdings bieten die NoSQL-Lösungen nicht die Möglichkeit von ACID-Transaktionen über
mehrere "Tabellen". Desweitern gilt natürlich, dass komplexe und/oder dynamische
Abfragen, bzw. Berichte am besten von einem relationalen Datenbanksystem bedient
werden. Die Abfragemöglichkeiten von NoSQL-Lösungen sind dafür einfach zu limitiert – was
ja auch nicht im Sinne der Erfindung wäre.
Wie sehr häufig im Leben gibt es nicht das allgemein gültige Kochrezept, es muss also
nicht immer das Eine oder das Andere sein. Für bestimmte Gesamtlösungen kann ich mir
ohne Weiteres eine Hybrid-Form - die Kombination eines relationalen Systems mit einem
NoSQL-System vorstellen.
Microsoft ist mit Windows Azure und den angebotenen Storage-Möglichkeiten im NoSQLBereich meiner Meinung nach ein Vorreiter und Visionär. Hier wird Technologie geboten, die
die meisten Unternehmen noch nicht ausreichend anzuwenden wissen. Die Möglichkeiten, die
sich hier für Entwickler und Firmen bieten, um neue Applikationen und Dienste anbieten zu
können, sind großartig und werden vermutlich erst in den nächsten Jahren ihr volles
Potential entfalten. Wir alle müssen uns erst auf diese Technologien einlassen und ihnen
auch das Vertrauen entgegen bringen, das diese meiner Meinung nach auch verdienen. Es
sind nicht neue Technologien, da diese größtenteils schon jahrelang im Einsatz, aber der
breiten Business-Community bisher verborgen geblieben sind. Microsoft leistet hier mit der
Azure Plattform eine großartige Möglichkeit all diese Technologien zu testen und neue
Visionen umzusetzen.
4.5
Ablegen von Daten mit Azure Storage
In diesem Abschnitt wird das Speichern und Abrufen von Daten in den Windows AzureSpeicherdiensten beschrieben. Die Windows Azure-Speicherdienste setzen sich aus den
folgenden Elementen zusammen:
BLOBs – Speichern unstrukturierter Binär- und Textdaten.
Warteschlangen – Speichern von Nachrichten für den späteren Zugriff durch Clients
und Bereitstellen einer zuverlässigen Messagingstruktur für die Kommunikation
zwischen Rolleninstanzen.
Tabellen – Speichern nicht relationaler, allerdings strukturierter Daten.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
113
Um diese Unter-Dienste verwenden zu können, ist ein Speicherkonto anzulegen. Ein
Speicherkonto wird mit einem eindeutigen Namen angelegt und stellt somit einen
eindeutigen Namespace für die spätere Verwendung von Blobs, Warteschlangen und Tabellen
bereit. Die Grenzen eines Speicherkontos unter Azure sind derzeit:

200 TB Blob-, Warteschlangen- und Tabellendaten.

Maximal 20 Speicherkonten unter einem Abonnement.
Speicherkosten basieren auf vier Faktoren:

Der Speicherkapazität – die Menge des verwendeten Speichers

Der Speichertransaktionen – die Anzahl der Lese- und Schreibvorgänge im AzureSpeicher.

Datenausgang - wenn eine Anwendung, die nicht in der gleichen Region ausgeführt
wird auf die Daten in Ihrem Speicherkonto zugreift, fallen Gebühren für den
Datenausgang an (gleichgültig, ob es ein weiterer Cloud-Dienst, oder eine andere
Anwendung ist).

Dem Replikationsschema – abhängig vom gewählten Schema fallen verschieden
Kosten an, dazu nachfolgend mehr.
Beim Anlegen des Speicherkontos ist die Art der Replikation anzugeben, es gibt hier 4
Auswahlmöglichkeiten.
Abbildung 4.4: Auswahl der Daten-Replikation
Bei der Auswahl sollte man sowohl auf die persönlichen Anforderungen - wie z. B.
MÜSSEN diese an einem einzelnen Ort gespeichert bleiben (Unternehmensrichtlinien), bzw.
MÜSSEN diese an einem anderen (zweiten) Ort gespeichert werden (Datensicherheit) - als
auch auf die anfallenden Kosten achten. Die Auswahlmöglichkeiten sind im Detail:
©Soft-Dat GmbH - Berndt Hamböck 2014
114
Hamboeck / Azure für Entwickler

Lokal redundanter Speicher (LRS) – die Daten werden drei Mal innerhalb des gleichen
Rechenzentrums repliziert. Die Daten verlassen den Standort nicht, und sind gegen
Hardware-Ausfälle gesichert.

Georedundanter Speicher (GRS) - die Daten werden (asynchron, weitere drei Mal) an
einem sekundären Standort in einer zweiten Region repliziert werden. Auf diese Weise
wird Failover zum zweiten Standort im Falle eines größeren Ausfalls am primären
Standort ermöglicht. Ein Zugriff auf diese zweite Region ist nur im „Katastrophenfall“
möglich.

Lesezugriff (georedundant) – empfohlen für Produktiv-Systeme, die auf den Azure
Storage zugreifen, da von der zweiten Region die Daten jederzeit gelesen werden
können.

Zonenredundant – erst seit August 2014 verfügbar und ist technisch zwischen dem
LRS und GRS angesiedelt, da hier ebenfalls 3 Kopien der Daten über 2 bis 3
Datacenter abgelegt werden. Alle drei Kopien bleiben in der gleichen Region, kann
aber vom System auf eine zweite Region ausgedehnt werden. Derzeit ist die Nutzung
noch auf „block blobs“ eingeschränkt.
Anlegen eines Speicher-Kontos:
Um Daten in Azure zu speichern muss zuerst ein Speicher-Konto angelegt werden. Das ist
innerhalb von wenigen Minuten im Azure Portal unter https://manage.windowsazure.com
erledigt. Dazu wählt man auf der linken Seite „Speicher“ an und klickt auf das große „+“
Zeichen darunter.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
115
Abbildung 4.5:
Danach sind folgende Schritte durchzuführen:

Der Punkt Schnellerfassung ist anzuwählen (im Gegensatz zu anderen Diensten gibt es
hier keine andere Auswahlmöglichkeit)

Im Feld URL, ist der Name des Speicher-Kontos anzugeben. Im Prinzip ist dieser frei
wählbar, es müssen 3-24 Buchstaben, bzw. Nummern sein. Die komplette URI (der
eingegebene Name mit .core.windows.net) wird später dazu verwendet die Blob-,
Queue-, oder Tabellen-Speicher für diese Azure Subscription anzusprechen. Die
Standardendpunkte für ein Speicherkonto haben die folgenden Formate:
o
Blob-Dienst: http:// <speicherkonto>.blob.core.windows.net
o
Tabellendienst: http:// <speicherkonto>.table.core.windows.net
o
Queuedienst: http://<speicherkonto>.queue.core.windows.net

Die Region, bzw. Affinitäts-Gruppe, wo der Speicher physikalisch von Azure abgelegt
wird. Es empfiehlt sich der zu dem Anwender nächstgelegene Speicherort, also z. B.
Nordeuropa, bzw. Westeuropa für Deutschland. Österreich und die Schweiz. Falls der
Speicher-Dienst gemeinsam mit z. B. einer Webseite, oder HDInsight verwendet wird,
dann sollte die Region mit dem anderen Dienst übereinstimmen, um die Performance
(spürbar) zu erhöhen.

Die Art der Daten-Replikation, die für dieses Speicher-Konto von Azure angewendet
©Soft-Dat GmbH - Berndt Hamböck 2014
116
Hamboeck / Azure für Entwickler
werden soll. Geo-Redundant ist der Default und bedeutet, dass die Daten zusätzlich in
einem zweiten Datacenter gespeichert werden. Falls es sich um Testdaten handelt,
empfiehlt es sich aus Kostengründen hier auf Lokal-Redundant umzustellen, die drei
malige redundante Speicherung im gleichen Datacenter ist hier ausreichend sicher für
diese Daten.

Abschließend kann der Dienst mittels SPEICHERKONTO ERSTELLEN angelegt werden.
Sofern das nicht schon in Kapitel 2 geschehen ist, sollten wir das gleich einmal
durchführen, ich habe den Store svobistore genannt, die Region ist die Gleiche, wie
ich diese in Kapitel 2 für Azure SQL verwendet habe. Mehr zu den Regionen wurde in
Kapitel 1 geschrieben. Das Abonnement haben wir ebenfalls aus Kapitel 1, die
Replikation ist Lokal redundant, d. h. die Daten verlassen mein Datacenter in
Nordeuropa nicht, auch nicht zu einem zweiten Datacenter in der gleichen Region.
Abbildung 4.6: Anlegen eines Speicherkontos
Das Speicherkonto wird umgehend erstellt und ist im Azure Portal sofort anwählbar
Abbildung 4.7: Angelegtes Speicherkonten
Wird ein Speicherkonto angeklickt, dann ist am unteren Rand ein Menü mit 3 Buttons
sichtbar.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
117
Abbildung 4.8: Aktionen für das Speicherkonto
Die möglichen Aktionen sind:

Zugriffschlüssel verwalten: Wenn ein Speicherkonto erstellt wurde, generiert Azure
zwei 512-Bit-Speicherzugriffsschlüssel, die für die Authentifizierung verwendet werden
können, bzw. müssen, wenn ein Zugriff auf das Speicherkonto erfolgen soll – mehr
dazu gleich, wenn auf Blobs mit C# zugegriffen wird.

Domäne verwalten – das Speicherkonto kann mit dem eigenen Domänennamen
verknüpft werden – siehe Kapitel Azure Websites

Löschen – wird das Speicherkonto nicht mehr benötigt, kann es gelöscht werden.
Die Art der Replikation – die sich auch auf die Kosten auswirkt – kann im Azure Management
Portal am Azure-Storage unter KONFIGURIEREN überprüft werden.
Abbildung 4.9: Kontrolle der Replikation im Azure Management Portal
Mit einem angelegten Speicherkonto können nun Daten gespeichert und abgelegt werden,
zuvor sollten aber ein, zwei nützliche Tools installiert werden.
4.5.1
Nützliche Tools für den Azure Storage
Microsoft stellt die Azure Tools for Visual Studio zur Verfügung, mit diesen können Blob-,
Queue-, und Table-Container in einem Storage Account begutachtet und auch bearbeitet
werden, diese werden mit dem Azure SDK installiert, welches hier zu finden ist:
http://www.microsoft.com/de-DE/download/details.aspx?id=44938
©Soft-Dat GmbH - Berndt Hamböck 2014
118
Hamboeck / Azure für Entwickler
Abbildung 4.10: Visual Studio Server Explorer
Als weiteres Tool bietet sich der Azure Storage Explorer an, dieser wurde bereits im
Kapitel 3 verewendet und ist hier zu finden: https://azurestorageexplorer.codeplex.com/
Abbildung 4.11: Azure Storage Explorer
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
119
Nun sind wir perfekt gerüstet, um den Azure-Storage anzuprogrammieren.
4.5.2
Verwenden des BLOB-Speichers - Übersicht
Ich habe als Beispiel eine kleine WPF-Applikation gewählt, diese kann folgende
Funktionalität am Azure-Blob-Storage zeigen:

eine beliebige Datei in den Blob-Storage hochladen und speichern

den Inhalt des Blob-Storage anzeigen

eine Datei aus dem Blob-Storage herunterladen

eine Datei aus dem Blob-Storage löschen
Die GUI für diese Desktop Applikation sieht wie folgt aus, das komplette Beispiel ist im
Software-Download für dieses Buch zu finden:
Abbildung 4.12: WPF Blob-Storage Applikation
Um diese Applikation zu bauen, sind folgende Schritte notwendig:

Erstellen der GUI

Hinzufügen des NuGet Packages (WindowsAzure.Storage)

Konfigurieren des Connection-Strings zum Blob-Storage

Erstellen einer Klasse zur Kommunikation mit dem Azure Blob-Storage
Die Beispielapplikation soll Dateien zu einem Azure-Storage-Container hochladen,
©Soft-Dat GmbH - Berndt Hamböck 2014
120
Hamboeck / Azure für Entwickler
herunterladen, den Inhalt abfragen, sowie löschen können.
4.5.3
Verwenden des BLOB-Speichers - Implementierung
Das Erstellen der GUI lasse ich in diesem Kapitel außen vor, diese ist in der Abbildung
sehr gut zu erkennen, wir können uns also gleich dem Hinzufügen des NuGet Packages
widmen, dieses hat den Namen WindowsAzure.Storage:
Abbildung 4.13: NuGet Package WindowsAzure.Storage
Im nächsten Schritt benötigen wir den Connection String, dafür legen wir am Besten ein
Application-Setting an:

Name: AzureStorageConnectionString

Type: String

Scope: Application

Value:
DefaultEndpointsProtocol=https;AccountName=svobistore;AccountKey
=nZojXxv2DOg9mBmya+lA5RzgylmZrj+8OZquHZpTrwuq2BXAdbsQ/cet3WL0RqW
+zTdR0DNiqt29i35xqWApdA==
Der AccountName ist der Name des Blob-Storage, den AccountKey erhält man über
ZUGRIFFSCHLÜSSEL VERWALTEN (wie weiter oben beschrieben).
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
121
Abbildung 4.14: Application-Setting für den Connection String
Jetzt kann es auch schon losgehen mit dem eigentlichen Anprogrammieren des AzureBlob-Storages. Dazu empfiehlt es sich eine neue Klasse anzulgen, ich habe dieser Klasse
zwei Properties verpasst:

ConnectionString: Das Application Setting, um Zugriff auf den Azure-Storage zu
erhalten

ContainerName: der Name des Containers innerhalb des Azure Blob-Storage
Außerdem eine Methode, die eine Referenz auf den Container innerhalb des Azure-BlobStorages retourniert. Diese legt den Container an, sollte dieser noch nicht innerhalb des
Storage-Accounts vorhanden sein.
Gerüst für die Klasse, um den Azure Blob-Storage anzusprechen
using
using
using
using
using
using
System.Collections.Generic;
System.Diagnostics;
System.IO;
System.Threading.Tasks;
Microsoft.WindowsAzure.Storage;
Microsoft.WindowsAzure.Storage.Blob;
namespace AzureStorageDemo
{
class SvobiStorageBlob
{
public static string ConnectionString{ get; set; }
public static string ContainerName { get; set; }
private static async Task<CloudBlobContainer> GetBlobContainer()
{
//CloudConfigurationManager.GetSetting(ConnectionStringName)
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount =
CloudStorageAccount.Parse(ConnectionString);
// Create the blob client.
CloudBlobClient blobClient =
storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
©Soft-Dat GmbH - Berndt Hamböck 2014
122
Hamboeck / Azure für Entwickler
CloudBlobContainer container =
blobClient.GetContainerReference(ContainerName);
await container.CreateIfNotExistsAsync();
return container;
}
}
}
Jetzt können wir uns zu dem Azure-Blob-Storage mit dem zugehörigen Container
verbinden, es ist an der Zeit auch etwas mit dem Container zu tun. Beginnen wir mit dem
Upload einer Datei.
Code für den Upload in den Azure Blob-Storage-Container
public static async void UploadBlob(string sourceFileName, string blobName)
{
CloudBlobContainer container = await GetBlobContainer();
// Retrieve reference to a blob
CloudBlockBlob blockBlob =
container.GetBlockBlobReference(blobName);
// Create or overwrite the blob with contents from a local file.
using (var fileStream = File.OpenRead(sourceFileName))
{
await blockBlob.UploadFromStreamAsync(fileStream);
}
}
Nun fehlt eigentlich nur noch der Aufruf aus dem Client heraus. Ich setze im Click-event
für den Button zum Hochladen den ConnectionString und den Namen des Containers, danach
wird unsere Methode zum Hochladen mit den zugehörigen Parametern (lokaler Dateiname
und gewünschtem Dateinamen im Blob-Storage) aufgerufen. Da die Methode asynchrone
Methoden verwendet, ist auch die Methode für den Click-Event mit async gekennzeichnet. Es
wird zwar kein Resultat retourniert, der Aufruf müsste also nicht abgewartet werden, aber
möglicherweise wird dieser Code ja später einmal erweitert. Auch ein try/catch-Block würde
in keinster Weise schaden, aber würde diesen Code (und auch den nachfolgenden)
aufblähen, darum wurde in den Code-Beispielen weitgehend darauf verzichtet.
Client Aufruf für den Upload in den Azure Blob-Storage-Container
private async void UploadBlobButton_Click(object sender, RoutedEventArgs e)
{
SvobiStorageBlob.ConnectionString =
Properties.Settings.Default.AzureStorageConnectionString;
SvobiStorageBlob.ContainerName = "svobiblobs";
var fullFileName = FileNameTextBox.Text;
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
123
var fileName = System.IO.Path.GetFileName(fullFileName);
await SvobiStorageBlob.UploadBlob(fullFileName, fileName);
}
Wollen wir doch gleich einmal sehen, ob das auch wirklich geklappt hat und lesen wir den
Inhalt des Containers zurück.
Code für den Inhalt des Azure Blob-Storage-Container
public static async Task<IEnumerable<IListBlobItem>> ListBlobs()
{
CloudBlobContainer container = await GetBlobContainer();
IEnumerable<IListBlobItem> items =
container.ListBlobs(null, false);
foreach (IListBlobItem item in items)
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
Debug.WriteLine("Block blob of length {0}: {1}",
blob.Properties.Length, blob.Uri);
}
else if (item.GetType() == typeof(CloudPageBlob))
{
CloudPageBlob pageBlob = (CloudPageBlob)item;
Debug.WriteLine("Page blob of length {0}: {1}",
pageBlob.Properties.Length, pageBlob.Uri);
}
else if (item.GetType() == typeof(CloudBlobDirectory))
{
CloudBlobDirectory directory = (CloudBlobDirectory)item;
Debug.WriteLine("Directory: {0}", directory.Uri);
}
}
return items;
}
Der Client ruft die Methode wiederum auf und nimmt die Liste in Empfang, diese kann
mittels DataBinding z. B. an eine ListBox gebunden werden, wie in diesem Beispiel
geschehen.
Client Aufruf für den Inhalt des Azure Blob-Storage-Containers
private async void ListBlobButton_Click(object sender, RoutedEventArgs e)
{
SvobiStorageBlob.ConnectionString =
Properties.Settings.Default.AzureStorageConnectionString;
SvobiStorageBlob.ContainerName = "svobiblobs";
var items = await SvobiStorageBlob.ListBlobs();
BlobsListBox.ItemsSource = items;
©Soft-Dat GmbH - Berndt Hamböck 2014
124
Hamboeck / Azure für Entwickler
bool blobsAvailable = items.Count() > 0;
DeleteBlobButton.IsEnabled = blobsAvailable;
DownloadBlobButton.IsEnabled = blobsAvailable;
}
Eine Datei, die hochgeladen werden kann, möchte man möglicherweise auch wieder
herunterladen. Ich habe nachfolgend zwei Methoden implementiert, um einen Azure-Blob aus
dem Container herunterzuladen. Eine, die Binärdaten herunterlädt, eine zweite, die den Blob
als Text-Datei speichert. Oft kennt man ja das Format, da kann es durchaus nützlich sein
eine Text-Datei auch gleich als solche zu speichern, bzw. eine Binärdatei, wie ein Bild (.png,
.jpg, usw.) auch als ebensolche.
Code für das Herunterladen einer Datei aus dem Azure Blob-Storage-Container
public static async Task DownloadBinaryBlob(string blobName, string
localFileName)
{
CloudBlobContainer container = await GetBlobContainer();
CloudBlockBlob blockBlob =
container.GetBlockBlobReference(blobName);
using (var fileStream = File.OpenWrite(localFileName))
{
blockBlob.DownloadToStream(fileStream);
}
}
public static async Task<string> DownloadTextBlob(string blobName)
{
CloudBlobContainer container = await GetBlobContainer();
CloudBlockBlob blockBlob =
container.GetBlockBlobReference(blobName);
string text = string.Empty;
using (var memoryStream = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(memoryStream);
text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
}
return text;
}
Jetzt fehlt uns noch die Möglichkeit eine Datei aus dem Azure-Storage-Container zu
löschen.
Code für das Löschen einer Datei aus dem Azure Blob-Storage-Container
public static async Task DeleteBlob(string blobName)
{
CloudBlobContainer container = await GetBlobContainer();
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
125
// Retrieve reference to the blob
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
// Delete the blob.
await blockBlob.DeleteAsync();
}
Werden sehr große Datenmengen im Azure Blob-Storage benötigt, dann ist ein Upload
möglicherweise nicht mehr möglich, da dieser zu lange dauern würde. Für solche Fälle bietet
Microsoft den Azure Import/Export-Dienst für die Übertragung von Daten an Blob-Speicher
an. Mit diesem Dienst ist es seit Mai 2014 möglich, Festplatten per FedEx an ein Microsoft
Data-Center zu schicken, dort werden die Daten mit dem internen Microsoft Netzwerk in den
Azure Storage von ebendieser Festplatte geladen, bzw. bei dem umgekehrten Weg aus dem
Blob-Storage auf die Festplatte gespeichert. Folgende Voraussetzungen sind dabei zu
beachten:

Die Festplatte kann bis zu 4TB groß sein und MUSS mit BitLocker verschlüsselt sein.

Es muss eine 3.5 Zoll SATA II/III interne Festplatte sein, allerdings listet Microsoft
kompatible USB Devices.

Microsoft stellt ein Tool zur Vorbereitung der Festplatte bereit, dieses nennt sich
WAImportExport.exe und kann hier gefunden werden: http://www.microsoft.com/enUS/download/details.aspx?id=42659

Nach der Vorbereitung der Festplatte kann im Azure Management Portal
o
Der Import/Export Job angelegt werden
o
die Shipping-Adresse des Data-Centers ausfindig gemacht werden
o
ein unterstützter Paketdienst angezeigt werden
o
die Tracking-Nummern für die Sendungsverfolgung erfasst werden
o
der Job gemanaged und gemonitored werden.
©Soft-Dat GmbH - Berndt Hamböck 2014
126
Hamboeck / Azure für Entwickler
Abbildung 4.15: Anlegen eines Import/Export Jobs
Widmen
wir
uns
nun
der
nächsten
NoSQL-Datenspeicherung,
dem
Azure
Tabellenspeicher.
4.5.4
Verwenden des Tabellenspeichers
Wenn eine große Datenmenge vorhanden ist, dann ist der Table Storage um einiges
günstiger als Azure SQL. Nur, der Name ist für Datenbankhasen etwas irreführend, wie
gesagt handelt es sich bei dem Table Storage um eine NoSQL-Datenspeicherung. Man kann
den Table Storage quasi wie eine indizierte, sequentielle Datei verstehen. Es muss ein
Partition Key (vom Typ string) für die Table angelegt werden, die so partitionierten Daten
bleiben somit zusammen.
Jetzt stellt sich die Frage, wie man den Partition Key vergibt. Daten innerhalb der
gleichen Partition werden schneller gefunden, verschiedene Partitionen erlauben allerdings
ein paralleles Suchen. Handelt es sich um Kundendaten, dann kann eine Partition nach
Ländern der Kunden sinnvoll sein, oder nach einem gewissen Range der Kunden IDs.
Zusätzlich wird ein Row Key benötigt (ebenfalls ein string), die beiden Keys gemeinsam
ergeben den Primary Key für die Tabelle – wobei der Row Key innerhalb der Partition
eindeutig sein muss. Das wäre beispielsweise die Kunden ID, was als Row-Key allerdings nur
recht selten sinnvoll ist, das ergibt sich aus dem Aufbau und den Möglichkeiten der
Datenabfrage im Table Storage.
Ja, wie kann man nun Daten im Table-Storage suchen? Es gibt ja eigentlich nur einen
Clustered Index, der sich aus dem Partition Key und dem Row-Key zusammensetzt. Daraus
ergibt sich, dass die performanteste Abfrage genau diese beiden Spaten einschließt. Die
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
127
zweit beste Abfrage enthält nur den Partition-Key, gefolgt von einer Abfrage die eine Range
von Partition-Keys, oder Row-Keys beinhaltet. Ganz schlecht sind Abfragen, die weder den
Partition-Key, noch den Row-Key in der Abfrage inkludieren.
Aber warum ist das so? Durch die zugrunde liegende Architektur des Azure Storage. Der
sogenannte Partition Layer speichert die verschiedenen Objekte und verarbeitet die damit
verbundenen Transaktionen. Der Partition Layer besteht aus dem Partition Manager, Partition
Servers, und dem Lock Service. Der Partition Manager teilt die Objekte in RangePartitions auf
und weist jede dieser RangePartition einem Partition Server zu, der wiederum den späteren
Zugriff auf die gespeicherten Objekte sicherstellt. Durch das Lock Service ist garantiert, dass
zu jedem Zeitpunkt nur ein Partition Server eine RangePartition zur Verfügung stellt.
Wenn nun eine Abfrage mit (zumindest) dem Partition Key angegeben wird, dann wird
auch nur ein Partition Server angesprochen. Werden in der Abfrage allerdings mehrere
Partitionen abgefragt, dann wird mit hoher Wahrscheinlichkeit auch mehr als ein Partition
Server angestoßen (ein Partition Server ist für mehrere Partitionen zuständig), was natürlich
sowohl gut (parallele Abfrage), als auch schlecht ist (mehr Daten, längere Laufzeit der
Abfrage, als bei nur einer Partition). Wenn nun kein Partition-Key oder Row-Key in der
Abfrage angegeben wird, dann muss ein Table Scan durchgeführt werden. Indem ja auch
kein Partition-Key angegeben wurde wird die Abfrage zu jedem Partition Server geschickt
(falls ein Partition Key angegeben wird, dann wird die Abfrage nur zu einem spezifischen
Partition Server gesendet und es wird nur ein Partition Scan durchgeführt).
Daraus ergibt sich auch, dass es mit dem Azure Table Storage durchaus auch sinnvoll
sein kann, die gleichen Daten in verschiedenen Tables – bei großen Datenmengen, sonst
auch in der gleichen Table - auf unterschiedliche Art (Partition-Keys, aber auch Row-Keys) zu
speichern, je nachdem wonach sehr häufig gesucht wird – der Nachteil ist hier die
notwendige Synchronisation der Daten bei Änderungen.
Als Beispiel sei hier ein Bestell-System angeführt mit drei Tabellen Customer, Order und
OrderDetail. Eine ideale Partitionierung KÖNNTE wie folgt aussehen:
Tabelle
Partition-Key
Row-Key
Otpimierte Suche
Customer
Sales Region
Customer ID
nach Region und Kunden ID
Order
Customer ID
Order ID
für alle Bestellungen eines Kunden
OrderDetail
Order ID
Product ID
nach Bestellung und dem Produkt
Tabelle: 4.1: Beipiel für den Partition-Key und Row-Key mehrerer Tabellen
Da das Schema nicht streng vorgegeben ist, können verschiedenste Daten in einer
Tabelle abgelegt werden, aber davon ist eher abzuraten, die Kollegen werden es Ihnen
©Soft-Dat GmbH - Berndt Hamböck 2014
128
Hamboeck / Azure für Entwickler
danken, wenn diese einmal die Applikation warten müssen, weil sie auf Urlaub sind. Zu
beachten ist auch die Größe eines Objektes, welches im AzureTable Storage gespeichert
wird:

Die gesamte „Zeile“ darf 1MB nicht überschreiten

Eine Spalte darf 64KB nicht überschreiten.

Maximal sind 255 Spalten erlaubt (3 Spalten sind reserviert – Partition-Key, Row-Key
und der TimeStamp)
4.5.5
Verwenden des Tabellen-Speichers – Übersicht
Ich habe die zuvor gezeigte WPF-Applikation erweitert, diese soll Datensätze aus einer
JSON-Datei zu einem Azure-Table-Storage-Container hochladen und zwar jeden
Datensatz
einzeln,
aber
auch
in
einem
Batch-Modus.
Zusätzlich
sollen
Abfragemöglichkeiten gezeigt werden.
Abbildung 4.16: WPF Azure Table Beispiel-Applikation
Um diese Applikation zu bauen, sind folgende Schritte notwendig:

Erstellen der GUI

Hinzufügen des NuGet Packages (WindowsAzure.Storage)

Konfigurieren des Connection-Strings zum Storage Account
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
129
Erstellen einer Klasse zur Kommunikation mit dem Azure Table-Storage

Also gleich an’s Werk, die ersten Punkte sind schon im letzten Abschnitt erklärt, es kann
also gleich mit der Klasse zur Kommunikation mit dem Azure-Table-Storage angelegt
werden.
Die Daten, welche in dem Azure Table Storage gespeichert werden sollen, kommen aus
der AdventureWorksDW2012 Datenbank. Dbei handelt es sich um die Kundendaten aus
dieser Datenbank, die Abfrage, die verwendet wurde liest das Country, den CustomerKey
und den DisplayName aus der Datenbank aus und sieht folgendermaßen aus:
SELECT
g.EnglishCountryRegionName as 'Country' ,
c.CustomerKey, c.FirstName +
IsNull(' ' + c.MiddleName + '.', '') + ' ' +
c.LastName as DisplayName
FROM DimGeography g INNER JOIN
DimCustomer c ON g.GeographyKey = c.GeographyKey
Das Resultat wurde als CSV exportiert und in eine JSON-Datei umgewandelt. Die Datei ist
im Code-Download enthalten und stellt jeden einzelnen Kunden zur Verfügung, das sieht z.
B. so aus:
{
"Country":"Australia",
"CustomerKey":11000,
"DisplayName":"Jon V. Yang"
}
4.5.6
Verwenden des Tabellen-Speichers - Implementierung
Es werden wiederum zwei Properties verwendet, der ConnectionString hält den
Verbindungsstring
zum
Storage-Account.
Da
der
Storage-Account
vom
Blob-Beispiel
verwendet wird bleibt dieser gleich, der Container ist allerdings nun eine CloudTable. Um auf
diese jederzeit in den weiteren Methoden Zugriff zu haben wird diese ebenfalls in einem
Property in der Klasse gespeichert. Die Methode GetTableClient setzt diese auf die AzureTabelle, bei Bedarf wird die Tabelle auch sofort erzeugt.
Code für den Zugriff einer Azure Table und dem Anlegen
using
using
using
using
using
Microsoft.WindowsAzure.Storage;
Microsoft.WindowsAzure.Storage.Table;
System.Collections.Generic;
System.Linq;
System.Threading.Tasks;
namespace AzureStorageDemo
{
©Soft-Dat GmbH - Berndt Hamböck 2014
130
Hamboeck / Azure für Entwickler
class SvobiStorageTable
{
public static string ConnectionString { get; set; }
public static string TableName { get; set; }
private static CloudTable _currentTable;
private static async Task<CloudTable> GetTableClient()
{
// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount =
CloudStorageAccount.Parse(ConnectionString);
// Create the table client.
CloudTableClient tableClient =
storageAccount.CreateCloudTableClient();
// Create the table if it doesn't exist.
_currentTable = tableClient.GetTableReference(TableName);
await _currentTable.CreateIfNotExistsAsync();
return _currentTable;
}
}
}
Damit zum Einfügen, bzw. Löschen einer Entität in eine Tabelle. Für das Einfügen stehen
die Methoden zur Verfügung:

TableOperation.Insert,

TableOperation.InsertOrMerge und

TableOperation.InsertOrReplace.
Gelöscht werden kann eine Entität mit der TableOperation.Delete(entity) Methode.
Code für das Einfügen einer Entität zu einer Azure-Table
public static async Task<TableResult> InsertTableEntity(TableEntity entity)
{
if (_currentTable == null)
await GetTableClient();
// Create the TableOperation that inserts the entity.
TableOperation insertOperation = TableOperation.Insert(entity);
//TableOperation insertOperation =
TableOperation.InsertOrMerge(entity);
//TableOperation insertOperation =
TableOperation.InsertOrReplace(entity);
// Execute the insert operation.
TableResult result = await _currentTable.ExecuteAsync(insertOperation);
return result;
}
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
131
Sollen mehrere Entitäten eingefügt werden, so empfiehlt es sich, dies im Batch-Betrieb
durchzuführen, da jeder Batch nur als eine einzelne Transaktion bei der Berechnung der
Kosten gilt. Dabei ist allerdings folgendes zu beachten:

Alle Entitäten müssen in einem Batch den gleichen Partition Key haben.

Es können nicht mehr als 100 Entitäten in einem Batch verschickt werden.

Der Payload in einem Batch darf nicht mehr als 4MB sein.
Diese Vorgaben resultieren in folgendem Code, der den Batch-Vorgang durhführt.
Code für das Einfügen als Batch zu einer Azure-Table
public static async Task InsertTableEntityBatch(List<CustomerEntity>
entities)
{
if (_currentTable == null)
await GetTableClient();
TableBatchOperation batchOperations = new TableBatchOperation();
foreach (var group in entities.GroupBy(x => x.PartitionKey))
{
foreach (var entity in group)
{
if (batchOperations.Count < 100)
{
batchOperations.Add(
TableOperation.InsertOrReplace(entity));
}
else
{
await _currentTable.ExecuteBatchAsync(batchOperations);
batchOperations =
new TableBatchOperation {
TableOperation.InsertOrReplace(entity) };
}
}
if (batchOperations.Count > 0)
{
await _currentTable.ExecuteBatchAsync(batchOperations);
batchOperations = new TableBatchOperation();
}
}
}
Das Entfernen einer Table ist keine große Sache. Zu beachten ist möglicherweise, dass
ein sofortiges Anlegen einer Tabelle mit dem gleichen Namen sehr wahrscheinlich nicht sofort
klappt,
da
die
Tabelle
zuerst
nur
zum
Löschen
markiert
wird
und
von
einem
Hintergrundprozess später entfernt wird, sowie die Tabelle drei Mal gelöscht werden muss.
©Soft-Dat GmbH - Berndt Hamböck 2014
132
Hamboeck / Azure für Entwickler
Das bedeutet, dass der Vorgang noch aktiv sein kann, auch wenn die Methode schon
beendet ist.
Code für das Löschen einer Azure-Table
public static async Task DeleteTable()
{
if (_currentTable == null)
await GetTableClient();
await _currentTable.DeleteIfExistsAsync();
}
Jetzt fehlt noch die Definition der Entität, die in der Azure-Table gespeichert werden soll.
In der Datei sind 3 Felder pro Kunde zu finden "Country, "CustomerKey", und der
"DisplayName“. Durch das Vererben der Klasse von TableEntity werden die Properties
PartitionKey und RowKey zur Verfügung gestellt. Wir benötigen zwingend einen Konstruktor
ohne Parameter (optional habe ich einen weiteren Konstruktor hinzugefügt, der alle Felder
übernimmt). Da die Daten aus einer Datei kommen, welche am einfachsten mittels
NewtonSoft.Json deserialisiert wird, werden alle drei Felder benötigt. Das Feld Country wird
dabei als PartitionKey verwendet, das Feld CustomerKey als RowKey. Um die Felder nicht
doppelt in der Azure Table aufscheinen zu lassen, werden diese mit dem [IgnoreProperty]
Attribut versehen.
Customer Klasse für den Table-Storage
using Microsoft.WindowsAzure.Storage.Table;
namespace AzureStorageDemo
{
public class CustomerEntity : TableEntity
{
public CustomerEntity(string country, string key,
string displayName)
{
this.PartitionKey = country;
this.RowKey = key;
this.DisplayName = displayName;
}
public CustomerEntity() { }
[IgnoreProperty]
public string Country
{
get { return this.PartitionKey; }
set
{
this.PartitionKey = value;
}
}
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
133
[IgnoreProperty]
public string CustomerKey
{
get { return RowKey; }
set { RowKey = value; }
}
public string DisplayName { get; set; }
}
}
Jetzt kann es auch schon richtig zur Sache gehen, zuerst muss die Hilfsklasse mit dem
ConnectionString und dem Namen des Azure-Table-Storage-Containers befüllt werden, das
geschieht im Konstruktor für das MainWindow.
Client-Initialisierung des ConnectionStrings und des Azure Table Namens
public MainWindow()
{
InitializeComponent();
SvobiStorageTable.ConnectionString =
Properties.Settings.Default.AzureStorageConnectionString;
SvobiStorageTable.TableName = "svobicustomers";
}
Der erste Button liest die Datei ein, erstellt ein Liste von CustomerEntity Objekten und
geht diese in einer Schleife durch. Jede einzelne Customer-Entität wird dabei einzeln
wegeschrieben, was als einzelne Transaktion für die Berechnung der Azure-Kosten gilt.
Client Aufruf für das Senden einer Message in eine Azure-Table
private async void SaveTableEntryButton_Click(object sender,
RoutedEventArgs e)
{
var json = File.ReadAllText(TableFileNameTextBox.Text);
var customers =
JsonConvert.DeserializeObject<List<CustomerEntity>>(json);
foreach (var customer in customers)
{
try
{
var result = await
SvobiStorageTable.InsertTableEntity(customer);
TableInfoListBox.Items.Insert(0, result.Etag);
}
catch (Exception ex)
{
TableInfoListBox.Items.Insert(0, ex.Message);
}
}
}
©Soft-Dat GmbH - Berndt Hamböck 2014
134
Hamboeck / Azure für Entwickler
Die Batch-Sepicherung ist hier vermutlich die bessere Wahl, diese ruft die zuvor
beschriebene Methode zur Verarbeitung im Batch-Modus auf.
Client Aufruf für die Batch-Speicherung in eine Azure-Table
private async void SaveTableEntryBatchButton_Click(object sender,
RoutedEventArgs e)
{
var json = File.ReadAllText(TableFileNameTextBox.Text);
var customers =
JsonConvert.DeserializeObject<List<CustomerEntity>>(json);
try
{
TableInfoListBox.Items.Insert(0,
DateTime.Now.ToLongTimeString() + " - Batch gestartet");
await SvobiStorageTable.InsertTableEntityBatch(customers);
TableInfoListBox.Items.Insert(0,
DateTime.Now.ToLongTimeString() + " - Batch beendet");
}
catch (Exception ex)
{
TableInfoListBox.Items.Insert(0, ex.Message);
}
}
Das Löschen einer gesamten Tabelle ist zum Testen ebenfalls hilfreich.
Client Aufruf für das Löschen einer Azure-Table
private async void DeleteTableEntryButton_Click(
object sender, RoutedEventArgs e)
{
try
{
await SvobiStorageTable.DeleteTable();
TableInfoListBox.Items.Insert(0,
DateTime.Now.ToLongTimeString() + " - Löschen abgeschlossen");
}
catch (Exception ex)
{
TableInfoListBox.Items.Insert(0, ex.Message);
}
}
Zur sofortigen Kontrolle der Azure-Table und ob der Upload geklappt hat, bietet sich der
Server Explorer an.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
135
Abbildung 4.17: Ansicht der Azure-table in Visual Studio mit dem Server Explorer
Die Daten sind erfolgreich in der Azure-Table gespeichert. Kommen wir nun zu den
Abfragemöglichkeiten.
Eine einzelne Entität mit der Angabe des Partiton-Keys und des Row-Keys ist am
performantesten.
Abfrage einer Azure-Table mit dem PartitionKey und dem RowKey
public static async Task<CustomerEntity>
GetTableEntityByPartitionAndRowKey(string partitionKey, string rowKey)
{
TableOperation query =
TableOperation.Retrieve<CustomerEntity>(partitionKey, rowKey);
TableResult result = await _currentTable.ExecuteAsync(query);
return (CustomerEntity)result.Result;
}
Dicht gefolgt von einer Abfrage, die alle Entitäten einer Partition zurückgibt.
Abfrage einer Azure-Table mit dem PartitionKey
public static async Task<List<CustomerEntity>>
GetTableEntitiesByPartition(string partitionKey)
{
IQueryable<CustomerEntity> query =
©Soft-Dat GmbH - Berndt Hamböck 2014
136
Hamboeck / Azure für Entwickler
_currentTable.CreateQuery<CustomerEntity>()
.Where(x => x.PartitionKey == partitionKey);
return query.ToList();
}
Wiederum etwas mühsamer für den Azure-Table-Storage ist die Abfrage über den RowKey, bzw. die Abfrage mehrerer Row-Keys.
Abfrage einer Azure-Table mit dem RowKey
public static async Task<List<CustomerEntity>>
GetTableEntitiesByRowKey(string rowKey)
{
IQueryable<CustomerEntity> query =
_currentTable.CreateQuery<CustomerEntity>()
.Where(x => x.RowKey == rowKey);
return query.ToList();
}
Womit wir beim Table-Scan angelangt sind, es empfiehlt sich aus Gründen der
Performance möglichst den Partition-Key bei solchen Abfragen mitzugeben.
Abfrage einer Azure-Table über ein beliebiges Attribut
public static async Task<List<CustomerEntity>>
GetTableEntitiesByName(string displayName)
{
IQueryable<CustomerEntity> query =
_currentTable.CreateQuery<CustomerEntity>()
.Where(x => x.DisplayName == displayName);
return query.ToList();
}
Kommen wir nach dem Table-Storage nun zum Queue-Speicher.
4.5.7
Verwenden des Queue-Speichers
Eine Queue ist eine Ansammlung von Messages, die nach dem FIFO (First In-First Out)
Prinzip abgearbeitet werden, also z. B. genauso wie im wirklichen Leben vor einem
Supermarktkassa. Als braver Kunde stellt man sich immer hinten an in der Warteschlange,
derjenige der ganz vorne steht wird von der Kassiererin als Erster „abgefertigt“ und die
Warteschlange rückt nach.
Genauso wie in einem Supermarkt, wo die Kunden aus allen Richtungen zur Kassa
strömen, genauso können Messages von überall her, also auch von verschiedenen
Applikationen, in die Queue gestellt werden. Diese Applikationen wissen möglicherweise auch
nichts voneinander und auch der Inhalt kann verschieden sein.
Wenn die Schlange im Supermarkt zu lange wird, dann wird häufig eine weitere Kassa
geöffnet und die Warteschlange teilt sich auch auf die zweite Kassa auf. Auch das
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
137
funktioniert im Prinzip genauso unter Azure Queues, es kann sowohl die Anzahl der MessageConsumer definiert werden, als auch die Anzahl von Messages, die abgearbeitet werden.
Also, wenn man so will, handelt es sich bei Azure Queues um einen großen Supermarkt.
Eine einzelne Queue-Message kann bis zu 64 KB an Daten mitsenden (Größe des
Einkaufswagens), in einer Azure Queue können sich mehrere Millionen Messages ansammeln
(da würde jedem Supermarkt-Chef der Schweiss ausbrechen bei so vielen Kunden), bis das
Limit eines Storage-Accounts erreicht ist. Ein Storage Account kann insgesamt bis zu 200 TB
an Daten (Blob, Queue, und Table gemeinsam) vorhalten, was wiederum eine Menge an
Artikeln eines Supermarkts entspricht – wobei die Daten, wie erwähnt, immer drei Mal
vorgehalten werden, also jeder Artikel ist im Supermarkt drei Mal verfügbar.
Ein möglicher Anwendungsfall unter Azure ist das Senden von Emails. Wenn sich
beispielsweise ein neuer Kunde auf der Webseite registriert, dann wird die Information der
Registrierung in eine Queue gestellt, das Bestätigungsemail wird dann von einem anderen
Task gesendet, der periodisch die Queue ausliest. Somit müssen die Anwender nicht warten,
bis die E-Mail zugestellt wurde, was durchaus auch etwas länger dauern kann.
Wir sehen uns ein ganz einfaches Beispiel an, um die Funktionsweise der Azure Queues
kennenzulernen.
4.5.8
Verwenden des Queue-Speichers – Übersicht
Ich habe die Beispiel-Applikation, die bereits für den Azure-Blob-Storage verwendet
wurde erweitert, um folgende Funktionalität für den Test der Azure Queues bereit zu stellen:

Es ist möglich, verschiedene Messages in eine Azure Queue zu stellen. Das Beispiel
soll Befehle übergeben (Gehen, Laufen, Stehen bleiben, Links drehen, Rechts drehen),
die dann von einem Client aus der Queue ausgelesen werden.

Der Message-Client wird durch einen Timer simuliert, der sich immer 1 Message holt
und den Inhalt im Bereich Informationen/Resultate ausgibt.
Die GUI für diese Desktop Applikation sieht wie folgt aus - das komplette Beispiel ist
ebenfalls im Software-Download für dieses Buch zu finden:
©Soft-Dat GmbH - Berndt Hamböck 2014
138
Hamboeck / Azure für Entwickler
Abbildung 4.18: WPF Azure Queue Beispiel-Applikation
Um diese Applikation zu bauen, sind folgende Schritte notwendig:

Erstellen der GUI

Hinzufügen des NuGet Packages (WindowsAzure.Storage)

Konfigurieren des Connection-Strings zum Blob-Storage

Erstellen einer Klasse zur Kommunikation mit einer Azure Queue in einem Azure BlobStorage

Simulation eines Message-Clients durch einen Timer, der die Messages ausliest, den
Inhalt ausgibt und die Message aus der Queue löscht.
Die Beispielapplikation könnte beispielsweise zur Steuerung eines Roboters genutzt
werden.
4.5.9
Verwenden des Queue -Speichers - Implementierung
Das Erstellen der GUI lasse ich in diesem Kapitel wiederum außen vor, diese ist in der
Abbildung sehr gut zu erkennen. Das Anlegen des ConnectionStrings wurde ebenfalls schon
beschrieben und das Hinzufügen des NuGet Packages WindowsAzure.Storage ist auch schon
erledigt. Kommen wir also gleich zum Anlegen der Klasse, in der die Kommunikation mit der
Azure Queue abgehandelt wird.
Wie schon beim Azure Blob-Storage benötigt man wieder den ConnectionString und
dieses Mal den gewünschten Namen der Queue, dieser wird in zwei Properties vorgehalten.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
139
Desweiteren wird die Queue ebenfalls über die gesamte Laufzeit in einem Property
vorgehalten, nachdem diese einmal angelegt, bzw. ein Zugriff darauf erfolgt ist.
Code für den Zugriff einer Azure Queue und dem Anlegen
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
namespace AzureStorageDemo
{
class SvobiStorageQueue
{
public static string ConnectionString { get; set; }
public static string QueueName { get; set; }
private static CloudQueue _currentQueue;
private static async Task<CloudQueue> GetCloudQueue()
{
CloudStorageAccount storageAccount =
CloudStorageAccount.Parse(ConnectionString);
// Create the queue client
CloudQueueClient queueClient =
storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue
_currentQueue =
queueClient.GetQueueReference(QueueName);
// Create the queue if it doesn't already exist
await _currentQueue.CreateIfNotExistsAsync();
return _currentQueue;
}
}
}
Für etwaige spätere Aufräumarbeiten ist eine Methode zum Löschen der Queue bestimmt
hilfreich.
Code für das Löschen einer Azure Queue
public static async Task DeleteQueue()
{
// Delete the queue
await _currentQueue.DeleteAsync();
}
©Soft-Dat GmbH - Berndt Hamböck 2014
140
Hamboeck / Azure für Entwickler
Das Hinzufügen einer neuen Message klappt einfach, wenn man schon Zugriff auf die
Queue hat. Es genügt das Instanziieren der Klasse CloudQueueMessage mit dem Inhalt der
Message und danach das Hinzufügen des CloudQueueMessage-Objektes zu der Queue. Die
Größe der Message darf 64KB nicht überschreiten, darauf ist zu achten, wenn z. B. ein JSON
String erzeugt wird und dieser der Message übergeben wird und dieser muss im UTF-8
Format vorliegen.
Code für das Senden einer neunen Message in eine Azure Queue
public static async Task NewQueueMessage(string content)
{
CloudQueueMessage message =
new CloudQueueMessage(content);
if (_currentQueue == null)
await GetCloudQueue();
await _currentQueue.AddMessageAsync(message);
}
Eine Meldung zurückzulesen ist über die Queue mit einem Methodenaufruf möglich. Der
folgende Code liest die Message von der Queue, diese Message ist vom Zeitpunkt des
Auslesens für 30 Sekunden für andere Clients nicht sichtbar. D. h. innerhalb dieser
Zeitspanne sollte die Message auch aus der Queue gelöscht werden ansonsten wird nach
dieser Zeitspanne die Message wieder sichtbar (sollte kein Löschen erfolgt sein).
Dieses
Vorgehen ist sinnvoll, da es durchaus vorkommen kann, dass der Client ein Problem hat
(Software, Netzwerk,..) und ein erneuter Versuch des Auslesens, z. B. nach dem Neustart
der Client-Applikation wiederum diese Message zur Verfügung stellt.
Code für das Lesen einer Message in eine Azure Queue
public static async Task<CloudQueueMessage> DeQueueMessage()
{
// Get the next message
CloudQueueMessage retrievedMessage =
await _currentQueue.GetMessageAsync();
return retrievedMessage;
}
Das Löschen der Message aus der Queue erfolgt durch Senden des CloudQueueMessageObjektes, welches zuvor gelesen wurde.
Code für das Löschen einer Message aus einer Azure Queue
public static async Task DeleteMessage(CloudQueueMessage deleteMessage)
{
await _currentQueue.DeleteMessageAsync(deleteMessage);
}
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
141
Es kann durchaus vorkommen, dass man eine Message nur “ansehen” möchte, ohne
diese für 30 Sekunden von der Queue herunterzunehmen, dafür gibt es die PeekMessage
Methode. Die Message bleibt dabei auch für andere Clients sichtbar.
Code für das Senden einer neunen Message in eine Azure Queue
public static async Task<CloudQueueMessage> PeekQueueMessage()
{
CloudQueueMessage peekedMessage =
await _currentQueue.PeekMessageAsync();
// Display message.
Debug.WriteLine(peekedMessage.AsString);
return peekedMessage;
}
Ein Szenario mit Message in Queues kann auch sein, dass eine Message gelesen wird, der
Content angepasst wird und die Meldung wieder zur Verfügung gestellt wird, das kann mit
der UpdateMessage-Methode abgebildet.
Code für das Senden einer neunen Message in eine Azure Queue
public static async Task UpdateMassage(CloudQueueMessage message, string
content)
{
message.SetMessageContent(content);
await _currentQueue.UpdateMessageAsync(message,
TimeSpan.FromSeconds(0.0),
MessageUpdateFields.Content | MessageUpdateFields.Visibility);
}
Möglicherweise möchte man gerne die Anzahl der Messages in der Queue wissen.
Code für das Abfragen der Anzahl an Messages in eine Azure Queue
public static async Task<int?> GetQueueLength()
{
await _currentQueue.FetchAttributesAsync();
int? cachedMessageCount =
_currentQueue.ApproximateMessageCount;
Debug.WriteLine("Number of messages in queue: "
+ cachedMessageCount);
return cachedMessageCount;
}
Kommen wir nun zur Nutzung der Klasse. Im ersten Schritt muss wiederum der
ConnectionString aus unserem Application-Setting gesetzt werden. Da es sich um den
©Soft-Dat GmbH - Berndt Hamböck 2014
142
Hamboeck / Azure für Entwickler
gleichen Azure-Storage-Account handelt, wie auch schon beim Blob-Storage-Beispiel kann
hier der gleiche Wert verwendet werden. Des Weiteren der Name der Queue, ich habe mich
für „svobiqueue“ entschieden.
Client-Initialisierung des ConnectionStrings und des Azure Queue Namens
public MainWindow()
{
InitializeComponent();
SvobiStorageQueue.ConnectionString =
Properties.Settings.Default.AzureStorageConnectionString;
SvobiStorageQueue.QueueName = "svobiqueue";
}
Der Button, der die Message in die Queue sendet, liest den ausgewählten Wert aus der
ComboBox aus und schickt diese über die zuvor erstellte NewQueueMessage-Methode in der
SvobiStorageQueue-Klasse an die Azure Queue.
Client Aufruf für das Senden einer Message in eine Azure Queue
private async void SendQueueButton_Click(object sender, RoutedEventArgs e)
{
string content = ((ComboBoxItem)CommandComboBox.SelectedItem)
.Content.ToString();
await SvobiStorageQueue.NewQueueMessage(content);
}
Der Button zum Pollen der Azure Queue verwendet einen DispatcherTimer, der jede
Sekunde die Queue um eine Message bittet und sofern diese vorhanden ist, wird diese auch
retourniert und im Informationsbereich ausgegeben.
Client Aufrufe für das Auslesen einer Azure Queue
DispatcherTimer _timer = null;
private void StartReadingQueueButton_Click(object sender,
RoutedEventArgs e)
{
StartReadingQueueButton.IsEnabled = false;
StopReadingQueueButton.IsEnabled = true;
if (_timer == null)
{
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Tick += timer_Tick;
}
_timer.Start();
}
async void timer_Tick(object sender, EventArgs e)
{
var message = await SvobiStorageQueue.DeQueueMessage();
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
143
if (message != null)
{
string infoText =
string.Format("{0} - command: {1}",
DateTime.Now.ToLongTimeString(), message.AsString);
QueueInfoListBox.Items.Insert(0,infoText);
SvobiStorageQueue.DeleteMessage(message);
}
}
private void StopReadingQueueButton_Click(object sender, RoutedEventArgs e)
{
StartReadingQueueButton.IsEnabled = true;
StopReadingQueueButton.IsEnabled = false;
_timer.Stop();
}
Kommen wir nun zu den Kosten dess Azure-Storage.
4.6
Die
Kosten des Azure Storage
Berechnung
der
Kosten
erfolgt
mit
dem
Azure
Preisrechner
http://azure.microsoft.com/de-DE/pricing/calculator/?scenario=data-management
Bei der Berechnung der Kosten sollte man sich vorab folgende Kennzahlen überlegen:

Die Menge der Daten

Anzahl der Transaktionen

Ausgehender Datenverkehr

Anfallender Datenverkehr zwischen den Datacentern
Mit diesen Werten lässt sich ein ungefährer Preis mit dem Azure Preisrechner errechnen.
Ich habe beispielhaft eine Berechnung mit 1.000 GB an Speicher und 10 Millionen
Transaktionen für alle Replikationsvarianten durchgeführt.
©Soft-Dat GmbH - Berndt Hamböck 2014
144
Hamboeck / Azure für Entwickler
Abbildung 4.19: Preiskalkulation Dezember 2014 für 1TB an Speicher mit 10 Millionen Transaktionen,
DocumentDB und 1TB ausgehende Bandbreite
Bei einem Preis von ca. 2 - 5 Euro-Cent pro GB, ist der Azure Storage um einiges
günstiger als Azure SQL, stellt also bestimmt eine interessant Variante der Datenspeicherung
in der Cloud dar.
4.7
Zusammenfassung
Die Datenhaltung mittels NoSQL-Technologien bietet bei sehr großen Datenmengen Vorteile
gegenüber einer Datenspeicherung durch SQL. Unter Azure stehen uns verschiedene NoSQLSpeichermöglichkeiten zur Verfügung, eine Auswahl wurde in diesem Kapitel gezeigt und
mittels einer Beispiel-Applikation wurden diese anprogrammiert. Dabei zeigt sich, dass

der BLOB-Storage sich zur Speicherung von Dateien eignet,

die Azure-Tables für strukturierte, nicht (unbedingt) relationale Daten geeignet sind,
und sich anbieten, wenn man die Daten partitionieren kann, und

Azure-Queues zum speichern von Messages dienen, die später abgearbeitet werden
können um beispielsweise länger laufende Tasks zu erledigen.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
145
5
Azure Virtuelle Maschinen
In diesem Kapitel

wird ein virtueller Computer aus der Azure Galerie mit Visual Studio erstellt

der Remotezugriff auf diese VM gezeigt

die Kosten einer VM erläutert
Da ich noch auf mein Gehäuse für meinen neuen Hyper-V PC warte, ich aber unbedingt
Visual Studio 2015 ausprobieren wollt, stand ich kurzfristig vor einem Dilemma. Ich könnte
natürlich mein Arbeits-Notebook missbrauchen, aber für eine CTP möchte ich mir die Arbeit,
die dann vermutlich auf mich wartet um wieder produktiv zu sein, nicht wirklich antun. Tja,
was tun, eine kleine Ewigkeit hat sich Ratlosigkeit breit gemacht…….bis…ja, bis mir eine
Erleuchtung gekommen ist, da gibt es ja noch die Azure VMs, die bereits fix und fertig zur
Verfügung stehen und auf eine Verwendung unsererseits nur warten.
Und genau das wäre die Lösung all meiner momentanen Probleme: Das risikolose Testen
der neuen Visual Studio Version, ohne eine bestehende Maschine zu opfern, bzw. selbst eine
VM zu erstellen. Also, nichts wie ran an das Aufsetzen eines virtuellen Computers.
©Soft-Dat GmbH - Berndt Hamböck 2014
146
5.1
Hamboeck / Azure für Entwickler
Einrichten der VM mit VS 2015
Mit einer bestehenden Azure Subscription sind die Schritte überschaubar, um an eine VM
mit VS 2015 zu gelangen.
Die Schritte, die notwendig sind kurz zusammengefasst:
1. Anmelden am Management Portal unter https://manage.windowsazure.com
2. Anlegen eines virtuellen Computers
3. Konfiguration des virtuellen Computers
4. Start des virtuellen Computers
5. Verbinden mit Remote Desktop
Klingt relative einfach, wie wir gleich sehen werden, ist es das auch.
5.2
Anmelden im Portal
Nehmt den Browser eurer Wahl und navigiert zu https://manage.windowsazure.com. Dort
meldet Ihr euch mit eurer Microsoft ID und dem Passwort an, danach landet Ihr (wie
gewohnt) im Management Portal.
Abbildung 5.1:
Nach der Anmeldung wollen wir den virtuellen Computer mit Visual Studio 2015 anlegen.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
5.3
147
Virtuellen Computer anlegen
Wählt nun auf der linken Seite ‚virtuelle Computer‘ an und klickt auf ‚virtuellen Computer
erstellen‘.
Abbildung 5.2:
In dem neuen Fenster wählt Ihr nun ‚aus Katalog‘ aus.
Abbildung 5.3: Azure VM Katalog auswählen
Es öffnet sich ein Fenster, wo alle vorhandenen virtuellen Maschinen aufgelistet sind, die
Ihr installieren könnt. Wir sind auf der Suche nach dem Visual Studio 2015 Image, dazu habe
ich in der Suchleiste das Suchkriterium ‚visual studio‘ eingegeben, dementsprechend wird die
Liste der verfügbaren Images eingeschränkt. Voila, Visual Studio Professional 2015 steht da
an dritter Stelle.
©Soft-Dat GmbH - Berndt Hamböck 2014
148
Hamboeck / Azure für Entwickler
Abbildung 5.4: Auswahl aus dem Azure VM-Katalog
Dieses habe ich angewählt und danach den
konfigurieren.
5.4
Button gedrückt um die VM zu
Konfiguration des virtuellen Computers
Die Konfiguration ist eine recht einfache Sache, diese geschieht mit drei einfachen
Schritten.
Im ersten Schritt sollte man vorsichtig sein, hier ist folgendes einzugeben:

Der Name des virtuellen Computers. Unter diesem Namen (plus der Erweiterung
.cloudapp.net) ist derselbe später über Remote Desktop erreichbar. Der Name muss
weltweit eindeutig sein und ist später nicht mehr änderbar.

Die zweite Auswahl betrifft die Art und Größe der zugrunde liegenden Hardware. Je
stärker, umso mehr kosten fallen pro Monat an. Ich habe den Vorschlag von A2 auf A1
zurück gesetzt, das bedeutet 1 Core mit 1.75 GB Ram und (maximale) Kosten von
€45,-- pro Monat (dazu aber später noch etwas mehr)
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
149
Im zweiten Schritt kann die Region des virtuellen Computers angepasst werden. Diesen
habe ich auf Westeuropa geändert. Besondere Beachtung sollte man den Ports widmen,
diese werden später zur Herstellung der Verbindung benötigt.
Abbildung 5.5: Name, Größe und Benutzerangaben für die VM und die Speicher-Informationen
Im abschließenden dritten Schritt erkennt ihr die rechtlichen Bedingungen von Microsoft
an, danach kann es auch schon losgehen.
©Soft-Dat GmbH - Berndt Hamböck 2014
150
Hamboeck / Azure für Entwickler
Abbildung 5.6: Am Ende die rechtlichen Bedingungen
Unser Job ist getan, jetzt kann es losgehen, wir sind nur noch wenige Minuten davon
entfernt unseren virtuellen Computer auszuführen.
5.5
Start des virtuellen Computers
Nach dem Klick auf
wird der virtuelle Computer angelegt, was in der Statusanzeige
sehr schön ersichtlich ist.
Abbildung 5.7: Anlegen der VM
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
151
Nach einigen Minuten ist der virtuelle Computer bereit, die Statusanzeige wechselt auf
‚wird ausgeführt‘, der DNS-Name ist rechts daneben zu sehen und kann in den Clipboard
übernommen werden.
Abbildung 5.8: VM wird ausgeführt
Die frei geschalteten Ports sind unter dem Punkt ENDPUNKTE im Azure Management
Portal an der VM einzusehen.
Abbildung 5.9: Endpunkte für die VM
Mit diesen Informationen kann man sich jetzt mittels Remote Desktop an dem soeben
erstellten virtuellen Computer verbinden.
5.6
Verbinden mit Remote Desktop
Auf meinem lokalen Notebook starte ich Remote Desktop und verbinde mich zu dem
soeben angelegten virtuellen Computer (vs2015hambo.cloudapp.net und der Port 57149).
©Soft-Dat GmbH - Berndt Hamböck 2014
152
Hamboeck / Azure für Entwickler
Abbildung 5.10: Remote Desktop Verbindung zur VM
Das dauert ein paar Sekunden, danach kann ich Visual Studio 2015 starten und gleich
einmal auf meine Person aktivieren.
Abbildung 5.11: Visual Studio in der VM
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
153
Voila, einem ersten Test von Visual Studio 2015 steht nun nichts mehr im Wege – und
das ganz ohne eigenes Risiko eine (bestehende) Installation durch den Test unbrauchbar zu
machen….
5.7
Stoppen der virtuellen Maschine
Mittlerweile wird von Microsoft eine minutengenaue Abrechnung durchgeführt und gestoppte
VMs produzieren keinerlei Kosten. Das Herunterfahren ist mit dem
Button im
Management Portal zu bewerkstelligen – ACHTUNG - ein Herunterfahren im Remote Desktop
alleine ist nicht ausreichend, um die laufenden Kosten zu minimieren.
Abbildung 5.12: Herunterfahren der VM, um Kosten zu sparen
Das bedeutet, dass es sich durchaus lohnt die virtuellen Maschinen im Azure Management
Portal herunterzufahren, wenn diese nicht benötigt werden. So müssen viele Server nur
während der regulären Bürozeiten im Betrieb sein und können über Nacht beendet (und
morgens wieder gestartet) werden. Ähnlich verhält es sich natürlich mit der hier
vorgestellten Entwickler VM, diese kann zu Zeiten, wo der Entwickler seinen wohl verdienten
Schlaf verbringt, heruntergefahren werden, womit sich im gesamten die Kosten für die
Infrastruktur verringern lassen.
5.8
Azure SDK und Azure VMs in lokalem Visual Studio
Seit der Version 2.4 des Azure SDKs (und dem Update 3 von Visual Studio 2013) ist es
möglich den virtuellen Computer direkt in Visual Studio 2013, bzw. 2015 zu konfigurieren.
Die zuvor erstellte VM taucht im Server Explorer im Azure/Virtual Machines Knoten auf.
©Soft-Dat GmbH - Berndt Hamböck 2014
154
Hamboeck / Azure für Entwickler
Abbildung 5.13: Visual Studio Server Explorer mit installiertem Azure SDK
Starten, Stoppen, Konfigurieren und sogar Debuggen ist schon länger möglich, der
„Configure…“ Menüeintrag war neu in der Version 2.4 des Azure SDKs und öffnet ein neues
Fenster mit den Einstellungsmöglichkeiten.
Abbildung 5.14: Konfiguration der VM in Visual Studio
Perfekt, so muss man nicht in das Azure Portal wechseln, wenn man Einstellungen
kontrollieren, oder anpassen möchte. Ich frage mich gerade ernsthaft, ob ich meinen neuen,
gerade bestellten, physikalischen Server nicht gleich wieder zurück schicken soll…..
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
5.9
155
Anfügen eines neuen Datenträgers
Möglicherweise möchte man ein eigenes Laufwerk zu der virtuellen Maschine hinzufügen,
um Daten auf diesem zu speichern und dieses Laufwerk auch an einer anderen virtuellen
Maschine weiter verwenden, da darauf z. B. Dokumentation, oder Source Code abgelegt
wurde. Dazu ist an der VM der Link ANFÜGEN vorhanden. Wenn dieser angewählt wird,
öffnet sich ein Dialog, wo der Storage Container und die Größe der Hard Disc anzugeben ist.
Abbildung 5.15: Anlegen eines neuen Datenträgers
Es wird in dem Storage Container eine weitere .vhd Datei mit fixer Größe als Page Blob
angelegt. Das VHDX-Format für virtuelle Maschinen, sowie expandierende Dateien werden
derzeit noch nicht unterstützt.
Abbildung 5.16: VHD-Datei für die Disk
©Soft-Dat GmbH - Berndt Hamböck 2014
156
Hamboeck / Azure für Entwickler
In der VM ist die Disk allerdings noch unbekannt, d. h. es muss in der VM noch der Server
Manager gestartet werden, der Bereich „File and Storage Services“ angewählt werden.
Abbildung 5.17: Server Manager starten und File and Storage Services anwählen
Im Bereich Disks sind die System-Disks zu sehen, sowie die neue 5 GB Disk, welche noch
initialisiert werden muss.
Abbildung 5.18: Initialisieren der neuen Disk
Das System warnt uns, dass alle eventuell vorhandenen Daten bei diesem Vorgang
verloren gehe - da unsere Disk aber keinen Inhalt hat, stellt das kein Problem dar.
Abbildung 5.19: Warnung vor dem Initialisieren
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
157
Abschließend kann der Wizard zum Erstellen des Laufwerks innerhalb der VM gestartet
werden.
Abbildung 5.20: New Volume, um das Laufwerk anzulegen
Es öffnet sich ein Wizard, wo die Größe (Schritt 1), der Laufwerksbuchstabe (Schritt 2)
und das File System (Schritt 3) angegeben werden kann, bzw. angepasst werden kann. Nach
dem Abschließen des Wizards steht das Laufwerk zur Verfügung.
Abbildung 5.21: Das eingebundene Laufwerk im File-Explorer
Somit stehen die Daten auch nach dem Löschen der VM weiterhin als VHD-Datei zur
Verfügung. Diese kann aus dem Storage-Container heruntergeladen werden, oder für eine
andere VM wieder verwendet werden.
5.10
Kosten der VM
Das Ganze hat natürlich auch seinen Preis. Ich habe das einmal herausgesucht, Ihr könnt
das
gerne
selbst
kontrollieren
unter:
http://azure.microsoft.com/en-
us/pricing/details/virtual-machines/
©Soft-Dat GmbH - Berndt Hamböck 2014
158
Hamboeck / Azure für Entwickler
Abbildung 5.22: Kosten einer Azure VM
Die Kosten von €50,-- pro Monat für eine Standard A1 Instanz sind durchaus eine feine
Sache. Wie bereits erwähnt, lassen sich die Kosten aber noch reduzieren, da ich diesen
virtuellen Computer im Management Portal herunterfahren kann, wenn ich ihn gerade nicht
benötige.
5.11
Zusammenfassung
Ich denke, Microsoft hat eine sehr elegante und auch kostengünstige Lösung für
Entwicklungsteams geschaffen, um „schnell einmal etwas auszuprobieren“ – wie etwa Beta
Versionen, neue Major Releases, oder einfach nur vorgefertigte virtuelle Computer, die ein
bestimmtes Thema abdecken, das man sich genauer ansehen möchte (z. B. BI mit dem
SQLServer 2014).
Als kleine Randnotiz möchte ich noch anfügen, dass ich parallel zur Erstellung des oben
beschriebenen virtuellen Computers auf meinem Notebook das Update 4 für Visual Studio
2013 installiert habe. Es war ein knappes Rennen, der virtuelle Computer mit Visual Studio
2015 war aber um einige Minuten schneller verfügbar.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
159
6
Azure Powershell
In diesem Kapitel

wird die Azure PowerShell installiert,

die PowerShell mit der Azure Subscription verbunden,

die Verwendung derselben mit Azure Diensten gezeigt.
Das Azure Management Portal ist durchaus eine tolle Oberfläche, um Azure Dienste zu
konfigurieren, aber häufig ist es von Vorteil, administrative Aktionen per Script auszuführen.
Dafür stellt Microsoft für die PowerShell Commandlets (cmdlets) zur Verfügung. Für
Administratoren, aber auch für Entwickler eine feine Sache, da man auf diese Art Skripte
erstellen kann, um diese während der Entwicklung immer wieder verwenden kann, um
Dienste anzulegen oder wieder zu löschen.
©Soft-Dat GmbH - Berndt Hamböck 2014
160
6.1
Hamboeck / Azure für Entwickler
PowerShell und Azure
Nahezu alle Aktionen, die im Management Portal ausgeführt werden können, können auch
durch die Rest API (auch die anderen SDKs, wie für C# oder JavaScript setzen darauf auf)
und PowerShell durchgeführt werden. Windows Azure PowerShell Releases sind derzeit auch
noch sehr häufig und Erweiterungen immer wieder verfügbar.
Die Azure PowerShell Module können durch den Microsoft Web Platform Installer
heruntergeladen
und
installiert
werden,
dieser
ist
hier
zu
finden:
http://azure.microsoft.com/de-DE/downloads/?fb=de-DE
Abbildung 6.1: Web Platform Installer und die Installation der PowerShell
Nach dem Herunterladen und Installieren aller Abhängigkeiten durch den Web Platform
Installer ist das System bereit.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
161
Abbildung 6.2: Installation der PowerShell beendet
Unter Windows 8.1 und höher wird die Azure PowerShell vom Start-Screen aus
aufgerufen, im Suchfenster kann danach gesucht werden.
Abbildung 6.3: Starten der PowerShell
Zum Testen eignet sich gleich einmal folgendes Kommando, um Hilfe zu allen Azure
cmdlets zu erhalten: Get-Help Azure. Das Resultat ist eine lange Liste von Kommandos.
Abbildung 6.4: Auflistung aller Azure CmdLets mit Get-Help Azure
©Soft-Dat GmbH - Berndt Hamböck 2014
162
Hamboeck / Azure für Entwickler
Die Azure PowerShell ist somit am System installiert, nun muss die Azure Subscription
konfiguriert werden.
6.2
Einrichten der Azure-Subscription
Die Azure cmdlets benötigen den Zugriff auf eine „active Azure Subscription“, um die
Dienste managen, bzw. konfigurieren zu können.
Dafür gibt es mehrere Methoden; es genügt hier aber, eine zu kennen. Ich möchte die
Methode mit dem Kommando Get-AzurePublishSettingsFile vorstellen. Wird dieses
Kommando abgesetzt, dann öffnet sich der Browser und man wird aufgefordert das
„publishing
profile“
herunterzuladen
und
zu
speichern.
Bitte
sich
den
Pfad
der
„publishsettings Datei“ merken, diese wird im nächsten Schritt benötigt.
Abbildung 6.5: Herunterladen der .publishsettings Datei
Diese Datei muss nun importiert werden, d. h., zurück in der PowerShell, empfiehlt sich
folgendes Kommando, dadurch wird diese Subscription für das Bearbeiten der Dienste durch
die CmdLets in der Azure PowerShell verwendet:
Import-AzurePublishSettingsFile yourpublishsettings.publishsettings
Abbildung 6.6: Importieren der .publishsettings Datei
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
Um
die
momentan
installierten
Subscriptions
einzusehen,
eignet
163
sich
Get-
AzureSubscription, dies liefert eine detaillierte Liste derselben:
Abbildung 6.7: Alle Subscriptions auflisten
Falls man mehrere Subscriptions zur Verfügung hat, möchte man die aktive Subscription
in der Azure PowerShell möglicherweise wechseln, um eben die Dienste in der anderen
Subscription zu bearbeiten. Dafür wird Select-AzureSubscription <subscription_name>
verwendet werden.
Abbildung 6.8: Wechseln der Subscription
Versuchen wir nun, einen neuen Dienst anzulegen, die Änderungen zu kontrollieren und
den Dienst wieder zu löschen
6.3
Verwenden der cmdlets
In den vorherigen Kapiteln haben wir folgende Azure Dienste kennen gelernt:

Azure Webseiten

Azure SQL
©Soft-Dat GmbH - Berndt Hamböck 2014
164

Hamboeck / Azure für Entwickler
Azure Storage
Bisher wurde zumeist immer das Azure Management Portal verwendet, um diese Dienste
zu bearbeiten. Darum bietet es sich hier nun geradezu an, dies mit der Azure PowerShell und
den zugehörigen cmdlets zu versuchen.
6.3.1
Bearbeiten einer Azure Website
Testen wir also das Anlegen einer Azure Webseite. Dazu benötigen wir einen Namen, der
noch nicht verwendet wurde und der den DNS-Richtlinien entspricht. Also ein Name, der nur
Buchstaben (von 'a' bis 'z'), Zahlen ('0' bis'9'), und möglicherweise auch noch ein Hyphen ('') enthält. In diesem Beispiel verwende ich "svobiwebps" - wie bereits erwähnt muss der
Name weltweit unter Azure eindeutig sein und auch noch nicht in Verwendung mit einer
Azure Webseite sein.
Es empfiehlt sich eine Variable anzulegen, dann kann der Name jederzeit geändert
werden, für die Verwendung in der Zukunft als Script.
PS C:\> $websiteName = "svobiwebps"
PS C:\> New-AzureWebsite $websiteName
Die Webseite wird erzeugt und retourniert ein Objekt, welches alle Informationen über die
neue Azure Website enthält. Um das Anlegen zu kontrollieren, kann man entweder in das
Azure Management Portal wechseln, oder das cmdlet für die Auflistung aller Webseiten in der
Subscription verwenden, optional mit dem Namen der Webseite als Parameter, dann erhält
man nur Informationen zu dieser:
PS C:\> Get-AzureWebsite
PS C:\> Get-AzureWebsite -Name $websiteName
Um die Webseite im Browser anzuzeigen, kann folgendes Kommando abgesetzt werden:
PS C:\> Show-AzureWebsite $websiteName
Um die Webseite zu löschen:
PS C:\> Remove-AzureWebsite -Name $websiteName
Und wiederum die Überprüfung, ob die Webseite wirklich gelöscht wurde:
PS C:\> Get-AzureWebsite -Name $websiteName
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
6.3.2
165
Bearbeiten von Azure SQL
Zum Anlegen eines Storage-Accounts benötigt man die Region - dazu ist eine Liste aller
Regionen hilfreich - diese erhält man:
PS C:\> Get-AzureLocation
Jetzt sind ein paar Variablen hilfreich, die Region, der Username und das Passwort für die
Administration des Azure Sql Serververs und der Name der Datenbank die dann angelegt
werden soll.
PS C:\> $location = "North Europe"
PS C:\> $login = "svobi"
PS C:\> $password = "Pa$$w0rd"
PS C:\> $dbName = "sqldbps"
Losgehen kann es mit dem Anlegen des virtuellen Azure Sql Servers, das Resultat wird
aufgehoben:
PS C:\> $sqlServer = New-AzureSqlDatabaseServer
-AdministratorLogin $login
-AdministratorLoginPassword $password
-Location $location
Der Name des Servers könnte durchaus von Interesse sein, dieser kann durch Zugriff auf
die Eigenschaft „ServerName“ des Rückgabeobjektes ausgegeben werden:
PS C:\> $sqlServer.ServerName
Die Firewall-Rule legen wir auch gleich mit an, in diesem Falle wird diese quasi disabled,
da jede IP darauf zugreifen kann, dies sollte im Idealfall nur die eigene sein.
PS C:\> New-AzureSqlDatabaseServerFirewallRule
-ServerName $sqlServer.ServerName -RuleName "everyone"
-StartIpAddress 1.1.1.1 -EndIpAddress 255.255.255.255
Jetzt brauchen wir Credentials, wobei das Passwort verschlüsselt sein muss, d. h. zuerst
muss ein verschlüsselter String aus dem originalen Passwort erzeugt werden:
PS C:\> $securePassword = ConvertTo-SecureString $password
©Soft-Dat GmbH - Berndt Hamböck 2014
166
Hamboeck / Azure für Entwickler
-AsPlainText -Force
Nun können die Credentials erzeugt werden:
PS C:\> $serverCreds = New-Object
System.Management.Automation.PSCredential
-ArgumentList $login, $securePassword
Somit ist der Weg frei, um sich Zugriff auf den virtuellen Azure Sql-Server zu
verschaffen:
PS C:\> $ctx = New-AzureSqlDatabaseServerContext
-ServerName $sqlServer.ServerName -Credential $serverCreds
Jetzt kann die Datenbank angelegt werden:
PS C:\> New-AzureSqlDatabase $ctx -DatabaseName $dbName
-MaxSizeGB 1 -Edition Basic
Löschen der Datenbank ist natürlich auch möglich:
PS C:\> Remove-AzureSqlDatabase $ctx $dbName –Force
Nun noch das Löschend des virtuellen Azure Sql-Servers und der Urzustand ist wieder
hergerichtet:
PS C:\> Remove-AzureSqlDatabaseServer $sqlServer.ServerName -Force
6.3.3
Bearbeiten des Azure Storage
Zum Anlegen eines Storage-Accounts benötigt man, wie schon beim Azure SQL Beispiel,
die Region - dazu ist eine Liste aller Regionen hilfreich - diese erhält man:
PS C:\> Get-AzureLocation
Anlegen des Storage-Accounts mit 2 Variablen (Name und Region):
PS C:\> $storageName = "svobistoreps"
PS C:\> $location = "North Europe"
PS C:\> New-AzureStorageAccount –StorageAccountName $storageName
-Location $location
Informationen über den Storage-Account:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
167
PS C:\> Get-AzureStorageAccount $storageName
Löschen des Storage-Accounts:
PS C:\> Remove-AzureStorageAccount $storageName
6.1
Zusammenfassung
Der Zugriff über die Azure Powershell ist eine weitere Möglichkeit die komplette
Administration der Azure Dienste durchzuführen. Obwohl wir in diesem Kapitel nur an der
Oberfläche des Möglichen gekratzt haben, ist durchaus das Potential ersichtlich. Jeder
Administrator und Entwickler wird über diese Möglichkeiten der Administration von Azure
Diensten seine Freude haben und voller Inbrunst und Begeisterung seine eigenen Skripte
schreiben. Das Microsoft Script Center ist auch ein guter Start, um sich bestehende Skripte
einzusehen, dieses ist hier zu finden:
http://azure.microsoft.com/de-DE/documentation/scripts/?fb=de-de
©Soft-Dat GmbH - Berndt Hamböck 2014
168
Hamboeck / Azure für Entwickler
7
Visual Studio Online
In diesem Kapitel

wird eine allgemeine Einführung in VS Online gegeben,

werden die Features aufgezeigt,

wird die Anwendung in einer Entwicklungsumgebung beschrieben und

sind die Kosten dargestellt.
Möglicherweise habt Ihr schon den Microsoft Team Foundation Server (TFS) in einem
eurer Projekte eingesetzt. Möglicherweise als reines Source-Code Verwaltungstool, oder ihr
habt auch mehr davon verwendet. Zum Beispiel die Prozessvorlagen für die agile
Softwareentwicklung, oder Scrum. Vermutlich habt ihr auch Work-Items zugewiesen oder
Bug Tracking und Builds automatisiert.
Diesen TFS habt ihr vermutlich in einem Windows Server in eurem (Firmen-)Netzwerk
installiert. Das Entwicklungsteam verwendet Visual Studio, um sich an den TFS anzuhängen.
Das bedeutet, dass die Hardware angeschafft, das Server OS lizenziert und installiert werden
musste (bzw. eine VM zur Verfügung gestellt werden musste) und jemand eine bestimmte
Version des TFS installiert hat. Kurz gesagt, es fallen Kosten für die Hardware, Software und
die Wartung des (eigenen) Systems an (z. B. Updates des Server OS, bzw. des TFS müssen
selbst eingespielt werden).
Falls Ihr den TFS überhaupt noch nicht im Einsatz hattet, so ist möglicherweise ein
anderes Source-Code Verwaltungstool, wie z. B. Git, Tortoise, oder Jira im Einsatz. Alle
aufgezählten Varianten haben Vorteile, aber auch verschiedene Nachteile.
In einem meiner Entwicklungsteams haben wir eine Menge Source-Code und Zeit
verloren, da das Infrastruktur-Team geschlampt hat. Wie? Nun ja, trotz mehrmaliger
Rückfragen meinerseits, ob es ein funktionierendes Backup unseres Servers gibt, war im
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
169
Ernstfall leider keines vorhanden. Obwohl diese Anfrage natürlich mehrmals positiv
beantwortet wurde…..
Nun….ja….seither verlasse ich mich äußerst ungern auf Infrastruktur-Teams und sehe
mich gerne nach alternativen Lösungen zu dem In-House Hosting unseres Source-Codes um.
Als erste Variante gib es natürlich den gehosteten TFS. Mehr Informationen findet Ihr z.
B. hier:
http://www.discountasp.net/tfs/
Ihr entscheidet euch für eine Version des TFS (2010, 2012, oder 2013) und für die BasicVariante (Source Control und Work Item Tracking) oder die Full Variante (Basic Features und
mit Sharepoint und Reporting).
Diese Variante hat bestimmt Ihren Reiz, ich möchte euch aber eine weitere Möglichkeit
hier vorstellen: Visual Studio Online (VS Online).
7.1
VS Online – Allgemein
Wieder ein neues Produkt werdet ihr euch jetzt möglicherweise denken, das ist aber so
nicht ganz korrekt. Mit beiden Produkten könnt ihr:

Euren Source Code in verschiedenen Versionen verwalten,

Work Items verwalten,

Bugs tracken und

Backlogs verwalten.
Also im Großen und Ganzen all das, was ein gutes Application Lifecycle Management
(ALM) Produkt können sollte.
Wie man anhand dieser Auflistung sehen kann, sind die Core-Funktionalitäten von TFS
und VS Online gleich. Eigentlich ist es das gleiche Produkt, allerdings mit unterschiedlichen
Versionssprüngen und der zugehörigen Updates (VS Online hieß früher auch Team
Foundation Service). TFS wird in eigenständigen Versionen ausgeliefert, aktuell 2013, davor
2012 und 2010. Dies kennt ihr z. B. von Visual Studio selbst, oder auch vom SQLServer,
oder Office her. Immer, wenn ein neues Release am Markt ist, entscheidet ihr euch, diese zu
installieren und eure bestehende Software upzugraden (oder eben auch nicht).
VS Online kennt diesen Produktzyklus in dieser Form nicht. Es gibt keine Version 2013,
2012, oder 2010, stattdessen wird VS Online automatisch auf den neuesten Stand gebracht.
Schön und gut, aber wer macht dann die Updates? VS Online steht „in der Cloud“ zur
Verfügung. Microsoft’s Cloud Lösung heißt Azure und bietet mittlerweile eine Menge an
Diensten, einer davon ist eben VS Online.
7.2
VS Online – Features
Es gibt 2 verschiedene Varianten von VS Online: Basic und Professional. Gemeinsam ist
den beiden, dass keine eigene Infrastruktur, wie z. B. ein eigener Server zur Verfügung
gestellt werden muss. Der Source Code liegt in der Cloud und ist von überall – von
©Soft-Dat GmbH - Berndt Hamböck 2014
170
Hamboeck / Azure für Entwickler
berechtigten Personen – abrufbar (ohne lästiger VPN Clients auf den Entwickler-Notebooks).
Sehen wir uns einmal die beiden Versionen an.
Ich möchte euch einmal die Features vorstellen, die mich überzeugt haben mit meinem
Entwicklungsteam auf VS Online umzusteigen.

Jeder VS Online Zugang verfügt über fünf kostenlose Benutzer (weitere Benutzer sind
dann allerdings kostenpflichtig).

Unbegrenzte Anzahl von Projekten (Team oder privat)

Gehostete Code-Repositories mit der Team Foundation-Versionskontrolle oder Git in
unbegrenzter Größe.
Somit ist sichergestellt, dass unser Source Code von allen Entwicklern erreicht werden
kann und diese jederzeit Source Code einchecken können, und das mit einer unbegrenzten
Anzahl von Projekten mit einer unbegrenzten Größe der Projekte!
Weitere Vorteile sind die Features für die gemeinsame Entwicklung innerhalb des Teams:

Über sogenannte Teamräume wird jeder Entwickler über den aktuellen Projektstand
informiert.

Aufgliedern und Planen
Portfolioverwaltung:
komplexer
Projekte
mit
den
Features
der
agilen
o
Erfassen von Product-Backlogs.
o
Definition und Verfolgung von Sprints.
o
Zuweisen und Tracken von Work-Items.
o
Einholen und Nachverfolgen von Feedback für Projektbeteiligte (mit dem
Microsoft Feedback Client).

Erstellen von Testplänen und Test Cases.

Integriertes Bug-Tracking.

Verwenden der Auslastungstests (bis zu 15.000 virtuelle Benutzerminuten pro Monat).
All diese Punkte sind in der VS Online – Basic Version enthalten und frei.
Solltet ihr euch mehr Features punkto Projektplanung wünschen, dann solltet Ihr einen
Blick auf die VS Online Advanced Variante legen, diese kostet allerdings $60,-- pro Benutzer
im Monat. Eine VS Online Professional Variante ist ebenfalls erhältlich, diese umfasst ein
monatliches Abonnement für die Visual Studio Professional IDE und schlägt mit $ 45,-- zu
Buche.
Aber zu Beginn sollte die VS Online Basic Variante durchaus ausreichen, möglicherweise
benötigt Ihr mehr Benutzer, jeder weitere Benutzer über die inkludierten 5 schlägt sich mit $
20,-- im Monat nieder.
Kommen wir aber nun zur Anwendung von VS Online und legen ein Beispielprojekt an
und checken vorhandenen Source Code ein.
Dazu sind folgende Schritte notwendig:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler

Anlegen des VS Online Kontos.

Anlegen eines neuen Projektes.

Einchecken des lokalen Source Codes.
171
3 kleine Schritte, mal sehen, ob es wirklich so einfach ist. In circa 10 Minuten könnt ihr
selbst darüber urteilen……legen wir also los, die Zeit läuft!
7.3
VS Online – Anwendung
7.3.1
Das VO Online - Konto
Zur Verwendung von VS Online wird ein VS Online-Konto benötigt, dieses wird im Azure
Management Portal angelegt.
Abbildung 7.1: Anwählen des Visual Studio Online-Bereichs im Portal und der Neu-Button
Es öffnet sich das - mittlerweile schon altbekannte - Konfigurationsfenster für das
Anlegen eines neuen Azure Dienstes. Benötigt werden folgende Informationen:

Der gewünschte Name des VS Online Kontos, dieser darf noch nicht vergeben sein.

Das Active-Directory Verzeichnis in Microsoft Azure.

Die Region - derzeit steht nur West-Europe und South Central US zur Verfügung.

Das Abonnement, auf welches der Dienst gebucht wird.
Abbildung 7.2: Konfiguration des Visual Studio Online-Dienstes
©Soft-Dat GmbH - Berndt Hamböck 2014
172
Hamboeck / Azure für Entwickler
Nach erfolgreicher Anmeldung, ist euer Konto dann unter folgender Adresse im Browser
erreichbar: Error! Hyperlink reference not valid.
Des Weiteren inkludiert VS Online eine Version von Visual Studio Express für das Web,
Windows oder Windows Desktop, aber als eingefleischte Entwickler habt ihr vermutlich schon
eine der höherwertigeren Desktop Varianten der Visual Studio Editionen installiert. VS Online
funktioniert allerdings auch mit Eclipse, oder XCode, ist also nicht an Visual Studio
gebunden.
Das Anlegen eines Visual Studio Online Kontos benötigt übrigens nicht zwingend eine
Azure Subscription, das klappt auch schnell und problemlos mit dem Browser und folgendem
Link: http://go.microsoft.com/fwlink/?LinkId=307137&clcid=0x407
Nach erfolgreicher Anmeldung werdet ihr aufgefordert, ein neues Projekt anzulegen. Es
ist der Name des Projektes einzutragen, optional dazu eine Beschreibung. Als VersionsKontrolle setze ich auf die „Team Foundation Version Control“, da ich damit jahrelange
Erfahrungen habe, die andere Option wäre Git, SVN wird leider nicht unterstützt. Als Scrum
Master kommt mir das „Microsoft Visual Studio Scrum 2013.3“ Template gerade recht
(andere Optionen sind: MSF for Agile Software Development 2013.3 und MSF for CMMI
Process Improvement 2013.3).
Abbildung 7.3: Anlegen des ersten Projektes
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
173
Mit dem „Create Project“-Button ist dieser Schritt auch schon so gut wie abgeschlossen.
Den Rest der Arbeit erledigt VS Online, welches das Projekt und den zugehörigen Team
Room anlegt und zur Verfügung stellt, was später im Dashboard sehr schön zu sehen ist. Das
VS Online-Konto ist nun vorhanden. Kommen wir zum nächsten Schritt.
7.3.2
Öffnen von Visual Studio 2013 und der Team Explorer
Wir wollen gleich einmal dieses Projekt mit Visual Studio 2013 bearbeiten – das ist die
bisher einzige Version von Visual Studio, die unterstützt wird.
Abbildung 7.4: Öffnen des angelegen Projektes in Visual Studio
Beim Klicken des Buttons „Open with Visual Studio to connect“ erfolgt folgende
Sicherheitsabfrage vom Browser, welche ganz einfach bestätigt werden muss. Damit öffnet
sich euer installiertes Visual Studio. Falls dieses noch nicht mit eurem Windows Live Account
korrekt verbunden ist, erscheint folgende Fehlermeldung:
Abbildung 7.5: Warnung im Browser und Visual Studio im Offline-Modus
©Soft-Dat GmbH - Berndt Hamböck 2014
174
Hamboeck / Azure für Entwickler
Um den Fehler zu beheben, ganz einfach VS starten und es mit eurem Windows Live
Account wieder verbinden. Danach nochmal im Browser den Button „Open with Visual Studio
to connect“ klicken. Dann startet euer Visual Studio ohne Fehlermeldungen und mit dem
geöffneten Team Explorer.
Abbildung 7.6: Team-Explorer
Dieser wartet nun darauf, von uns konfiguriert zu werden, um den lokalen Source Code
einchecken zu können. Zuvor sollte in Visual Studio 2013 kontrolliert werden, ob Team
Foundation Server als momentanes Source Control plug-in verwendet wird. Dazu ist das
Menü Tools -> Options -> Source Control aufzurufen.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
175
Abbildung 7.7: Source Control Plug-In konfigurieren
Kommen wir abschließend zum Einchecken des Source-Codes.
7.3.3
Mappen und Einchecken des lokalen Source Codes
Nun ist es an der Zeit, den VS Online Account mit einem (lokalen) Projekt zu verbinden.
Dazu ist der Link „configure your workspace“ zu drücken. Die Ansicht wechselt und nun muss
das VS Online Projekt ($/Azure Informer) auf das lokale Verzeichnis gemappt werde. Bei mir
liegt der Source Code unter „C:\Development\Mobile\AzureInformer“. Nachdem der „Map &
Get“-Button gedrückt wurde, ist VS Online mit dem lokalen Projekt verbunden.
Abbildung 7.8: Angeben des lokalen Verzeichnisses und erfolgreiches Mapping
©Soft-Dat GmbH - Berndt Hamböck 2014
176
Hamboeck / Azure für Entwickler
Jetzt kann das Projekt unter Source Code-Verwaltung gestellt werden.
Das gelingt mit der rechten Maustaste an der Solution im Solution Explorer und der
Auswahl von „Add Solution to Source Control…“. Das gleiche Spielchen noch einmal,
allerdings wird nun „Check In…“ angewählt.
Abbildung 7.9:
Die Ansicht wechselt wieder auf den „Team Explorer“. Jetzt noch schnell ein Kommentar
für das Einchecken des Source Codes eingeben, den Check-In Button drücken und der
Source Code ist in guten Händen, immer und überall für mein Team und mich erreichbar.
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
177
Geschafft, der Source Code ist bei VS Online hinterlegt. Die nächsten Schritte sind nun,
weitere Team Mitglieder einzutragen, danach Work Items zu erfassen und an das Team zu
verteilen. Die faszinierende Reise mit VS Online für mein Team und mich kann beginnen!
7.4
Kosten von Visual Studio Online
Um die Kosten für Visual Studio Online berechnen zu können, ist wiederum der Azure
Preisrechner
sehr
hilfreich,
diesen
findet
man
unter:
http://azure.microsoft.com/de-
DE/pricing/calculator/
Ich habe hier eine Preiskalkulation vorgenommen - diese umfasst 6 Visual Studio Online
Anwender, 5 Anwender sind gratis, der nächste und jeder weitere schlägt dann jedes Monat
mit Zusatzkosten zu Buche (€ 14,90). Wird die Professional Variante benötigt, kostet diese
für jeden Anwender extra, auch wie die erweiterte Variante. Ich habe mir 400 Minuten BuildTime herausgesucht und 15.000 Lasttests.
©Soft-Dat GmbH - Berndt Hamböck 2014
178
Hamboeck / Azure für Entwickler
Abbildung 7.10: Preiskalkulation Visual Studio Online (Januar 2015)
Für kleinere Entwicklungsteams ist das sicherlich eine sehr interessante Variante, um den
Source-Code verwalten zu lassen.
7.5
Zusammenfassung
Ich durfte in meinem Arbeitsleben bisher 3 Entwicklungsteams leiten und ich hätte mir
jedes Mal die unproblematische Möglichkeit der Kollaboration innerhalb des Teams, sowie die
jederzeitige Verfügbarkeit des Source-Codes an jedem Ort der Welt gewünscht. VS Online
macht es möglich eine unlimitierte Anzahl von Projekten mit unlimitierter Größe zu
verwalten. Für Entwicklerteams mit bis zu 5 Leuten ohne jeglicher Kosten. Microsoft ist hier
wieder ein hervorragendes Stück Software gelungen, einfach verpackt, ready to use for
everyone!
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
179
8
Azure Beispielprojekt
In diesem Kapitel
habt
ihr
die
Möglichkeit
mit
mir
etwas
interessantes
zu
bauen:
Ein Security-System mit dem Surface, Windows Phone und Azure.
Beim lesen meiner Twitter Feeds ist mir vor ein paar Wochen ein interessanter Eintrag in
die Hände gefallen, den ich sogleich umsetzen wollte. Man nehme:

Ein paar Netzwerk-Kameras

Ein SurfaceRT

Ein Windows Phone und

Windows Azure
…..und schon ist das eigene Heim mir nichts dir nichts eine sichere Festung.
©Soft-Dat GmbH - Berndt Hamböck 2014
180
Hamboeck / Azure für Entwickler
Abbildung 8.1:
Neugierig geworden? Nun dann lest doch bitte weiter, wenn ihr an der Umsetzung
interessiert seid.
8.1
Das Projekt - Übersicht
Im Originalartikel wurden relativ teure Netzwerkkameras verwendet, ich war auf der
Suche nach einer billigeren Lösung, dabei hatte ich folgendes kleines Kästchen im Auge:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
181
Abbildung 8.2:
Links zu sehen ist das ist das „SUNLUXY® 8 Kanal CCTV H.264 DVR Wasserdicht IR
Nachtsicht Sicherheit Kamera Video Überwachungssystem Set“, gibt es bei dem Händler
meines Vertrauens, nämlich Amazon um ca. €175, oder auch mit nur 4 Kameras um ca.
€130.
Es ist natürlich nicht unbedingt diese Lösung notwendig, ich habe mir auch noch folgende
WLAN-Kamera bestellt (im Bild rechts): Eine D-Link DCS-932L Wireless N Tag/Nacht Home
IP Kamera.
Diese kostet momentan ca. €55,--, kommt also in Summe teurer, als die zuvor
vorgestellte Lösung.
Das Kästchen, welches bei der Sunluxy-Lösung mit dabei ist, ist an und für sich schon
recht mächtig, man schließt es an einen Monitor an und schon sind alle Kamers sichtbar, eine
Web-Oberfläche ist ebenfalls verfügbar, diese sieht dann so aus:
©Soft-Dat GmbH - Berndt Hamböck 2014
182
Hamboeck / Azure für Entwickler
Abbildung 8.3:
Soweit so gut, das reichte mir aber nicht, ich wollte gerne mein vorhandenes Surface RT
für die Kameras verwenden. Warum? Erstens liegt es bei mir ebenfalls nur noch herum, seit
ich das Surface Pro mein Eigen nennen darf und zweitens fand ich es durchaus schick das
Surface RT bei meiner Eingangstüre, bzw. bei der Terrasse zu platzieren und z. B. zu sehen,
wer denn da von meinen lieben Verwandten, oder Freunde gleich wieder vor unserem Haus
auftaucht – meist ist es sowieso meine Schwägerin, diese ist immer herzlich willkommen, da
ich dann ungestört mich meinem Source Code widmen darf, da die beiden Schwestern ja
immer richtig viel zu besprechen haben. Noch besser wäre mein Windows Phone zu
verwenden, da klappt das dann ja komplett ortsunabhängig, da kommt jetzt Windows Azure
in’s Spiel.
8.2
Das Projekt – Umsetzung
Die Idee war die Bilder von den Kameras in den Azure Blob Storage zu stellen, die Namen
der ‚aktuellen‘ Blobs im Azure Table Storage zu hinterlegen. Damit wären die Bilder der
Kameras weltweit mit nahezu jedem beliebigen Client zugänglich.
8.2.1
Ansprechen der Kameras
Alle WLAN-Kameras bieten die Möglichkeit die momentanen Bilder mit dem Browser
abzufragen. Falls ihr noch eine Kamera herumliegen habt, könnt ihr unter diesem Link
vermutlich die Adresse finden:
http://www.ispyconnect.com/man.aspx
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
In
meinem
Fall
wären
die
Adressen
für
die
Sunluxy-Lösung
183
laut
http://www.ispyconnect.com/man.aspx?n=Sunluxy:
http://IPADDRESS/cgibin/snapshot.cgi?chn=[CHANNEL]&u=[USERNAME]&p=[PASSWORD]
und für die D-Link-Kamera: http://IPADDRESS/image/jpeg.cgi
Für die Sunluxy-Lösung
konnte ich das auch durch die Web-Oberfläche ermitteln, die
Anzeige der Kameras ist zwar eine Flash-Applikation, das Speichern des Snapshots ist
allerdings außerhalb - im HTML Dokument - implementiert:
Abbildung 8.4:
Das Ergebnis war bei mir:
http://192.168.0.114/cgibin/snapshot.cgi?chn=4&u=XXX&p=YY&q=0&d=1&rand=0.1927437849
Soweit so gut, das bedeutet egal welche Lösung man wählt, dem Zugriff über den
Browser, bzw. einem http-Request steht nichts mehr im Wege. Ich möchte nun mit euch den
kompletten Code entwicklen, um eine Kamera abzubilden. Die Applikation zu erweitern, um
4, 8, oder gar 16 Kameras zu verwalten ist relativ einfach, der zusätzliche notwendige Code
würde aber diesen Blog-eintrag zu unübersichtlich machen.
Folgende Schritte sind notwendig:

Die Windows Store App für den Surface RT entwickeln, um die Bilder „abzuholen“
©Soft-Dat GmbH - Berndt Hamböck 2014
184
Hamboeck / Azure für Entwickler

Den Azure Storage Account anlegen

Die Windows Store App erweitern, um die Bilder in Azure zu laden

Die Windows Phone 8/8.1 entwickeln, um die Bilder von Azure darzustellen.
Lasst uns also loslegen! Ach ja, eines noch vorweg: Der gezeigte Code ist hier als
Prototyp anzusehen und soll nur zeigen, wie das gestellte Problem gelöst werden kann. In
den nächsten Wochen wird dieser noch gehörig aufpoliert….
8.2.2
Der Surface RT Client
Der Surface RT Client, soll im ersten Schritt folgende Anforderungen erfüllen:

Anzeige des Bildes der Kamera

Aktualisieren des Bildes in einem Intervall

Anzeige des Datums und der Uhrzeit des Bildes.
Wir beginnen mit einer neuen Windows Store App, das Blank App Template erfüllt
unseren Zweck.
Ich habe für das Projekt den Namen SecureHome.WinStore und für die Solution den
Namen SecureHome gewählt.
Abbildung 8.5:
Fügen wir im nächsten Schritt gleich folgendes NuGet Package hinzu, die vereinfacht
unser Entwickler-Leben für ds Handling des Azure-Storage allgemein: Windows Azure
Storage
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
185
Abbildung 8.6:
Das Windows Azure Storage Package unterstützt seit der Version 4.2 auch Windows
Phone 8 Silverlight Clients, d. h. der Code, den wir schreiben wird sowohl in der Windows
Store App, als auch in der Windows Phone 8 App funktionieren.
Erweitern wir die MainPage.xaml um folgende Controls:

Ein Image, wo das Bild der Kamera dargestellt werden soll

Ein TextBlock, der das momentane Datum und die Uhr anzeigt.
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Image Name="WebView0x1" Stretch="UniformToFill"></Image>
<TextBlock Name="CurrentDateTextBlock4" HorizontalAlignment="Center
"
VerticalAlignment="Bottom">28.08.2014 04:10:22</TextBlock>
</Grid>
Jetzt können wir schon ans implementieren gehen, folgendes ist zu tun:

Einen DispatcherTimer erzeugen und alle 2 Sekunden aufrufen

Im Timer Tick Event soll die Methode RefreshCams aufgerufen werden

Die Methode RefreshCams holt das Bild von der Kamera ab und stellt es dar
Das sieht dann erst einmal so aus:
using System;
using System.Diagnostics;
using System.Net.Http;
using Windows.Storage.Streams;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using SecureHome.WinStore.DataModel;
namespace SecureHome.WinStore
{
public sealed partial class MainPage : Page
{
//Camera uri
private string _uri =
"http://10.0.0.9:60001/cgibin/snapshot.cgi?chn=0&u=USER&p=PASS&q=0&d=1";
private DispatcherTimer _dispatcherTimer;
//Get the images from Azure, or from HTTP?
©Soft-Dat GmbH - Berndt Hamböck 2014
186
Hamboeck / Azure für Entwickler
private bool _azureReadMode = false;
//Store the image in Azure?
private bool _storeInAzure = true;
public MainPage()
{
this.InitializeComponent();
this.Loaded += Page_Loaded;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
DispatcherTimerSetup();
}
public void DispatcherTimerSetup()
{
_dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1);
_dispatcherTimer.Start();
}
void dispatcherTimer_Tick(object sender, object e)
{
RefreshCams();
}
private async void RefreshCams()
{
var handler = new HttpClientHandler();
handler.AllowAutoRedirect = true;
var httpClient = new HttpClient(handler);
int currentCam = 1;
_pictureDataSource.ClearImages();
try
{
InMemoryRandomAccessStream ims = null;
if (_azureReadMode)
{
//TODO: Read byte[] from Azure
}
else
{
HttpResponseMessage reponse = await httpClient.GetAsync
(new Uri(_uri, UriKind.Absolute));
byte[] contentBytes = reponse.Content.ReadAsByteArrayAs
ync().Result;
ims = new InMemoryRandomAccessStream();
var dataWriter = new DataWriter(ims);
dataWriter.WriteBytes(contentBytes);
await dataWriter.StoreAsync();
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
187
AddToAzureSaveList(currentCam, contentBytes);
}
ims.Seek(0);
//if(ims.Size == 1081)
//
continue;
var bitmap = new BitmapImage();
bitmap.SetSource(ims);
WebView0x1.Source = bitmap;
}
catch (Exception ex)
{
Debug.WriteLine("*ERROR: " + ex.Message);
}
if (!_azureReadMode && _storeInAzure)
{
//TODO: Upload picture to Azure
if (!await _pictureDataSource.UploadPicturesToCloud())
}
CurrentDateTextBlock.Text = DateTime.Now.ToString();
}
private async void AddToAzureSaveList(int camNum, byte[] image)
{
//TODO: Remember byte[] to upload more cam pics in the future
}
}
}
Wie unschwer zu erkennen ist, habe ich eine andere Adresse für die Kamera eingesetzt:
private string _uri =
"http://10.0.0.9:60001/cgibin/snapshot.cgi?chn=0&u=USER&p=PASS&q=0&d=1";
Das Sunluxy-Kamera-System verwendet nach außen hin den Port 60001, wie ich in meinen
Einstellungen meines Routers sehen konnte:
©Soft-Dat GmbH - Berndt Hamböck 2014
188
Hamboeck / Azure für Entwickler
Abbildung 8.7:
Wenn Ihr diesen Code laufen lässt, dann müsste das Bild der ersten Kamera sichtbar
sein, sollte es klappen, dann sieht es bei euch aber vermutlich trotzdem anders aus:
Abbildung 8.8:
Der erste Schritt ist getan, jetzt gilt es das Bild in Azure hochzuladen, als Vorbereitung
öffnet bitte die App.xaml.cs Datei und erweitert diese um drei Properties:
sealed partial class App : Application
{
public static StorageCredentials credentials =
new StorageCredentials("SPEICHERNAME", "ZUGRIFFSCHLÜSSEL");
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
189
public static CloudStorageAccount account =
new CloudStorageAccount(credentials, false);
public static string tableName = "pictures", contianerName = "pictures";
8.3
Azure Konfiguration
In Azure benötige ich einen Blob Storage, um die Bilder der Kamera hochzuladen. Der
Name des aktuellen Blobs pro Kamerabild soll im Azure Table-Storage hinterlegt werden.
Damit etwas gespeichert werden kann muss man einen Cloud-Storage in Anzure anlegen.
Dazu
meldet
euch
mit
eurem
Account
im
Azure-Management-Portal
an
unter
https://manage.windowsazure.com/
Klickt nach erfolgreicher Anmeldung auf den Link
. Wie man sehen kann,
habe ich bereits zwei Storage-Accounts, solltet ihr noch keinen Azure Storage angelegt
haben, drückt auf den
links unten.
Abbildung 8.9:
Es öffnet sich ein neues Fenster und ihr müsst einen Namen für euren Speicher-Account
angeben. Der Speicher ist dann unter <euername>.core.windows.net erreichbar. Drückt am
Ende den
-Button und euer Speicher-Account ist angelegt.
©Soft-Dat GmbH - Berndt Hamböck 2014
190
Hamboeck / Azure für Entwickler
Abbildung 8.10:
Jetzt benötigen wir die Zugriffschlüssel, um mit der Applikation auf den Storage Account
zugreifen zu können, dazu drückt ihr den Button
.
Abbildung 8.11:
Es
öffnet
sich
ein
neues
Fenster,
wir
benötigen
davon
Speicherkontoname und den primären Zugriffsschlüssel:
©Soft-Dat GmbH - Berndt Hamböck 2014
zwei
Einträge,
den
Hamboeck / Azure für Entwickler
191
Abbildung 8.12:
Diese beiden Werte kommen in die App.xaml.cs-Datei:
public static StorageCredentials credentials =
new StorageCredentials("SPEICHERNAME", "ZUGRIFFSCHLÜSSEL");
das müsste dann ungefähr so aussehen:
public static StorageCredentials credentials =
new StorageCredentials("hambostore", "rxYuyrriozhhn==nggziasw…");
Damit wären wir fertig mit dem Azure Portal, kehren wir zu unser Windows Store App
zurück.
8.3.1
Speichern im Azure-Storage
Den Speichername und
Jetzt gilt es unser byte[] im Azure Blob-Storage zu speichern und ein paar Informationen
zu dem Bild im Azure Table Storage. Dafür gibt es ein hervorragendes Beispiel, welches
bereits fix und fertig implementiert ist: http://code.msdn.microsoft.com/windowsapps/Howto-use-Windows-Azure-b3447051
Wenn ihr euch dafür den Code herunterladet, dann werdet ihr zwei Klassen finden, die wir
gerne übernehmen wollen:
C#\CSAzureWin8WithAzureStorage\DataModel\PictureDataSource.cs
und
C#\CSAzureWin8WithAzureStorage\DataModel\PictureViewModel.cs
Ich habe die Dateien ein wenig für meine Bedürfnisse angepasst und diese sehen nun so
aus:
PictureViewModel.cs
using System;
using System.Collections.Generic;
using Microsoft.WindowsAzure.Storage.Table;
©Soft-Dat GmbH - Berndt Hamböck 2014
192
Hamboeck / Azure für Entwickler
namespace SecureHome.WinStore.DataModel
{
public class PictureViewModel
{
private DynamicTableEntity entity;
public PictureViewModel()
{
this.entity = new DynamicTableEntity() { PartitionKey = "cam",
RowKey};
}
public string Name {
get
{
return entity.RowKey;
}
set
{
entity.RowKey = value;
}
}
public string PictureUrl {
get
{
return entity.Properties["ImageUrl"].StringValue;
}
set
{
entity.Properties.Add(new KeyValuePair<string, EntityProper
ty>("ImageUrl", new EntityProperty(value)));
}
}
public DateTime CreationDate
{
get
{
return DateTime.FromFileTime(Convert.ToInt64(entity.RowKey)
);
}
set
{
entity.RowKey = value.ToFileTime().ToString();
}
}
public string Description
{
get
{
return entity.Properties["Description"].StringValue;
}
set
{
entity.Properties.Add(new KeyValuePair<string, EntityProper
ty>("Description", new EntityProperty(value)));
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
193
}
}
public DynamicTableEntity PictureTableEntity { get { return entity;
} set {
entity = value;
} }
public byte[] PictureFile { get; set; }
}
}
PictureDataSource.cs
using
using
using
using
using
using
using
System;
System.Collections.ObjectModel;
System.IO;
System.Threading.Tasks;
Windows.Storage.Streams;
Microsoft.WindowsAzure.Storage.Blob;
Microsoft.WindowsAzure.Storage.Table;
namespace SecureHome.WinStore.DataModel
{
public class PictureDataSource
{
private ObservableCollection<PictureViewModel> allImages = new Obse
rvableCollection<PictureViewModel>();
public PictureDataSource()
{
//GetPictureInfoFromTableStorage();
}
public ObservableCollection<PictureViewModel> AllImages
{
get { return allImages; }
}
public static async Task<bool> UploadPictureToCloud(PictureViewMode
l pictureViewModel, byte[] image)
{
try
{
var blockBlobClient = App.account.CreateCloudBlobClient();
var contianer = blockBlobClient.GetContainerReference(App.c
ontianerName);
await contianer.CreateIfNotExistsAsync();
string blobReference = Guid.NewGuid().ToString();
CloudBlockBlob picture = contianer.GetBlockBlobReference(bl
obReference);
await picture.UploadFromByteArrayAsync(image, 0, image.Leng
th);
//await picture.UploadFromStreamAsync(image);
©Soft-Dat GmbH - Berndt Hamböck 2014
194
Hamboeck / Azure für Entwickler
pictureViewModel.PictureUrl = picture.Uri.ToString();
var tableClient = App.account.CreateCloudTableClient();
var table = tableClient.GetTableReference(App.tableName);
await table.CreateIfNotExistsAsync();
var operation = TableOperation.Insert(pictureViewModel.Pict
ureTableEntity);
await table.ExecuteAsync(operation);
return true;
}
catch (Exception)
{
throw;
}
}
internal async Task<bool> UploadPicturesToCloud()
{
try
{
var blockBlobClient = App.account.CreateCloudBlobClient();
var contianer = blockBlobClient.GetContainerReference(App.c
ontianerName);
await contianer.CreateIfNotExistsAsync();
var tableClient = App.account.CreateCloudTableClient();
var table = tableClient.GetTableReference(App.tableName);
await table.CreateIfNotExistsAsync();
foreach (var pictureViewModel in allImages)
{
string blobReference = pictureViewModel.Name + "_" + Gu
id.NewGuid().ToString();
CloudBlockBlob picture = contianer.GetBlockBlobReferenc
e(blobReference);
var image = pictureViewModel.PictureFile;
await picture.UploadFromByteArrayAsync(image, 0, image.
Length);
//await picture.UploadFromStreamAsync(image);
pictureViewModel.PictureUrl = picture.Uri.ToString();
var operation = TableOperation.InsertOrReplace(pictureV
iewModel.PictureTableEntity);
await table.ExecuteAsync(operation);
}
}
catch (Exception ex)
{
throw;
}
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
195
return true;
}
public async Task GetPictureInfoFromTableStorage()
{
var client = App.account.CreateCloudTableClient();
var table = client.GetTableReference(App.tableName);
await table.CreateIfNotExistsAsync();
var results = await table.ExecuteQuerySegmentedAsync(new TableQ
uery(), null);
foreach (var item in results)
{
allImages.Add(new PictureViewModel() { PictureTableEntity =
item });
}
}
public void ClearImages()
{
if (allImages != null)
allImages.Clear();
}
public ObservableCollection<PictureViewModel> GetAllImages()
{
return allImages;
}
public async Task<bool> DeletePictureFormCloud(PictureViewModel pic
tureViewModel)
{
try
{
var blob = new CloudBlockBlob(new Uri(pictureViewModel.Pict
ureUrl), App.credentials);
await blob.DeleteAsync();
var tableClient = App.account.CreateCloudTableClient();
var table = tableClient.GetTableReference(App.tableName);
var operation = TableOperation.Delete(pictureViewModel.Pict
ureTableEntity);
await table.ExecuteAsync(operation);
allImages.Remove(pictureViewModel);
return true;
}
catch (Exception)
{
throw;
}
}
©Soft-Dat GmbH - Berndt Hamböck 2014
196
Hamboeck / Azure für Entwickler
#if WINDOWS_APP
public async Task<InMemoryRandomAccessStream> DownloadPictureFromCl
oud(PictureViewModel pictureViewModel)
{
try
{
var blob = new CloudBlockBlob(new Uri(pictureViewModel.Pict
ureUrl), App.credentials);
var ims = new InMemoryRandomAccessStream();
await blob.DownloadToStreamAsync(ims);
return ims;
}
catch (Exception)
{
throw;
}
}
#else
public async Task<MemoryStream> DownloadPictureFromCloud(PictureVie
wModel pictureViewModel)
{
try
{
var blob = new CloudBlockBlob(new Uri(pictureViewModel.Pict
ureUrl), App.credentials);
var ims = new MemoryStream();
await blob.DownloadToStreamAsync(ims);
return ims;
}
catch (Exception)
{
throw;
}
}
#endif
internal void AddImage(PictureViewModel uploadForm)
{
allImages.Add(uploadForm);
}
}
}
Jetzt geht es darum die fehlenden TODOs mit Code zu befüllen und am Besten auch
gleich in eine neue Klassendatei auslagern, ich habe diese Refresh.cs genannt.
Das sieht am Ende so aus:
using System;
using
using
using
using
using
using
using
System.Collections.Generic;
System.Diagnostics;
System.Linq;
System.Net.Http;
System.Text;
System.Threading.Tasks;
Windows.Storage.Streams;
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
197
using Windows.UI.Popups;
#if WINDOWS_APP
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
#elif WINDOWS_PHONE
using System.IO;
using System.Windows.Threading;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
#endif
using SecureHome.WinStore.DataModel;
namespace SecureHome.WinStore
{
class Refresh
{
//Camera uri
private string _uri = "http://10.0.0.9:60001/cgibin/snapshot.cgi?chn=0&u=USER&p=PASS&q=0&d=1";
private DispatcherTimer _dispatcherTimer;
//Get the images from Azure, or from HTTP?
private bool _azureReadMode = false;
//Store the image in Azure?
private bool _storeInAzure = true;
public PictureDataSource _pictureDataSource = new PictureDataSource
();
private bool _uploadInprogress;
private TextBlock CurrentDateTextBlock;
private Image WebView0x1;
public Refresh(Image image, TextBlock info)
{
CurrentDateTextBlock = info;
WebView0x1 = image;
}
public void DispatcherTimerSetup()
{
_dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1);
_dispatcherTimer.Start();
}
public void Start()
{
DispatcherTimerSetup();
}
void dispatcherTimer_Tick(object sender, object e)
{
RefreshCams();
}
©Soft-Dat GmbH - Berndt Hamböck 2014
198
Hamboeck / Azure für Entwickler
internal async void RefreshCams()
{
var handler = new HttpClientHandler();
handler.AllowAutoRedirect = true;
var httpClient = new HttpClient(handler);
int currentCam = 1;
try
{
#if WINDOWS_APP
InMemoryRandomAccessStream ims = null;
#elif WINDOWS_PHONE
MemoryStream ims = null;
#endif
if (_azureReadMode)
{
//Read byte[] from Azure
await _pictureDataSource.GetPictureInfoFromTableStorage
();
var pictures = _pictureDataSource.GetAllImages();
if (pictures.Count > 0)
{
ims = await _pictureDataSource.DownloadPictureFromC
loud(pictures[0]);
}
}
else
{
HttpResponseMessage reponse = await httpClient.GetAsync
(new Uri(_uri, UriKind.Absolute));
byte[] contentBytes = reponse.Content.ReadAsByteArrayAs
ync().Result;
#if WINDOWS_APP
ims = new InMemoryRandomAccessStream();
var dataWriter = new DataWriter(ims);
dataWriter.WriteBytes(contentBytes);
await dataWriter.StoreAsync();
#elif WINDOWS_PHONE
ims = new MemoryStream(contentBytes);
#endif
if (!_uploadInprogress)
AddToAzureSaveList(currentCam, contentBytes);
}
#if WINDOWS_APP
ims.Seek(0);
#elif WINDOWS_PHONE
ims.Seek(0, SeekOrigin.Begin);
#endif
//if(ims.Size == 1081)
//
continue;
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
199
var bitmap = new BitmapImage();
bitmap.SetSource(ims);
WebView0x1.Source = bitmap;
if (!_azureReadMode && _storeInAzure && !_uploadInprogress)
{
_uploadInprogress = true;
//Upload picture to Azure
if (!await _pictureDataSource.UploadPicturesToCloud())
{
CurrentDateTextBlock.Text = "Failed to upload, plea
se try it again later.";
_pictureDataSource.ClearImages();
_uploadInprogress = false;
return;
}
_pictureDataSource.ClearImages();
_uploadInprogress = false;
}
CurrentDateTextBlock.Text = DateTime.Now.ToString();
}
catch (Exception ex)
{
Debug.WriteLine("*ERROR: " + ex.Message);
}
}
private async void AddToAzureSaveList(int camNum, byte[] image)
{
//Remember byte[] to upload more cam pics in the future
var uploadForm = new PictureViewModel();
uploadForm.Name = camNum.ToString();
uploadForm.PictureFile = image;
_pictureDataSource.AddImage(uploadForm);
}
}
}
Die Mainpage.xaml.cs wird dadurch auch um einiges kleiner:
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace SecureHome.WinStore
{
public sealed partial class MainPage : Page
{
private Refresh _refresh;
public MainPage()
{
this.InitializeComponent();
©Soft-Dat GmbH - Berndt Hamböck 2014
200
Hamboeck / Azure für Entwickler
this.Loaded += Page_Loaded;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
_refresh = new Refresh(WebView0x1, CurrentDateTextBlock);
_refresh.Start();
}
}
}
Wenn Ihr die Applikation einige Sekunden laufen lässt, dann könnt Ihr die gespeicherten
Blobs in Visual Studio sehen:
Abbildung 8.13:
Der Eintrag im Table-Storage ist ebenfalls zu sehen:
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
201
Abbildung 8.14:
8.3.2
Der Windows Phone Client
Dieser ist beinahe nur noch Formsache. Wichtig ist, dass das Nuget Package für den
Windows Azure Storage nur das Windows Phone Silverlight SDK – allerdings kappt dann auch
schon Windows Phone 8.1.
Fügen wir also zu unserem Projekt eine Windows Phone App hinzu. Die Blank App
(Windows Phone Silverlight) ist perfekt für unsere Zwecke.
Abbildung 8.15:
Wir fügen gleich die notwendigen NuGet-Packages hinzu:
Wie gehabt das Package für den Windows Azure Storage.
Abbildung 8.16:
Zusätzlich die Http Client Libraries.
©Soft-Dat GmbH - Berndt Hamböck 2014
202
Hamboeck / Azure für Entwickler
Abbildung 8.17:
Soweit so gut, beginnen wir mit dem User Interface. Die MainPage.xaml ist nahezu ein
Abbild unserer Store App:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Image Name="WebView0x1" Stretch="UniformToFill"></Image
>
<TextBlock Grid.Row="0" Grid.Column="0">CAM1</TextBlock>
<TextBlock Name="CurrentDateTextBlock" HorizontalAlignme
nt="Center"
VerticalAlignment="Bottom">28.08.2014 04:10:22</TextBlock
>
</Grid>
Als nächstes müssen folgende Schritte durchgeführt werden:

Die drei Zeilen für die Zugangsdaten zu eurem Storage in die App.xaml.cs

Die beiden Dateien PictureDataSource.cs und PictureViewModel.cs müssen hinzugefügt
werden (als Link reicht vollkommen aus)

Die Datei Refresh.cs kommt ebenfalls mit in das neue Projekt (wiederum als Link).
Abbildung 8.18:
Die MainPage.xaml.cs sieht nahezu identisch zur Windows Store App aus:
using System.Windows;
using Microsoft.Phone.Controls;
©Soft-Dat GmbH - Berndt Hamböck 2014
Hamboeck / Azure für Entwickler
203
using SecureHome.WinStore;
namespace SecureHome.WinPhone
{
public partial class MainPage : PhoneApplicationPage
{
private Refresh _refresh { get; set; }
public MainPage()
{
InitializeComponent();
this.Loaded += Page_Loaded;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
_refresh = new Refresh(WebView0x1, CurrentDateTextBlock);
_refresh.Start();
}
}
}
Es ist eigentlich keine Code-Änderung notwendig, wenn ihr den Windows Phone Client
ablaufen lässt, zeigt er euch die Kamera an und lädt das Bild in den Azure Storage.
©Soft-Dat GmbH - Berndt Hamböck 2014
204
Hamboeck / Azure für Entwickler
Abbildung 8.19:
Um das Bild aus dem Azure Storage zu laden, muss nur die Variable _azureReadMode auf
true gesetzt werden:
private bool _azureReadMode = true;
Diese Einstellung ist für das Windows Phone natürlich die bessere Wahl, da es nur dann
im lokalen Netzwerk ist, wenn ihr auch zu Hause seid.
8.4
Zusammenfassung
Azure und das Surface RT können mit ein wenig Fantasie ein fantastisches Gespann sein.
Meine Familie und ich, wir können durch diese Kombination beruhigt in den wohlverdienten
Ski-Urlaub fahren - sobald es schneit – oder erst wieder im Sommer im nächstes Jahr. Bis
dahin ist die Software sicherlich noch um einige Punkte verbessert.
©Soft-Dat GmbH - Berndt Hamböck 2014
Quellen
Kapitel 2 - Azure Webseiten:
http://azure.microsoft.com/en-us/documentation/articles/web-sites-staged-publishing/
http://ruslany.net/2014/04/azure-web-sites-block-web-access-to-non-production-deployment-slots/
http://azure.microsoft.com/en-us/documentation/articles/web-sites-publish-source-control/
http://azure.microsoft.com/en-us/documentation/articles/azure-subscription-servicelimits/#websiteslimits
http://azure.microsoft.com/en-us/documentation/articles/web-sites-scale/#scalingstandard
http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configurationreference
Kapitel 3 - Azure SQL:
http://social.technet.microsoft.com/wiki/contents/articles/1695.inside-microsoft-azure-sqldatabase.aspx
http://social.technet.microsoft.com/wiki/contents/articles/3507.windows-azure-sql-databaseperformance-and-elasticity-guide.aspx#SQL_Azure_Engine_Throttling
Azure SQL Database Resource Limits
http://msdn.microsoft.com/en-us/library/azure/dn338081.aspx
Vorgehensweise: Migrieren einer Datenbank mithilfe einer DAC BACPAC-Datei in eine Azure SQLDatenbank
http://msdn.microsoft.com/de-DE/library/azure/jj156148.aspx
http://blogs.msdn.com/b/umits/archive/2013/01/11/securing-your-windows-azure-sqldatabase.aspx
http://msdn.microsoft.com/de-de/library/azure/ff394115.aspx
http://download.microsoft.com/download/D/2/0/D20E1C5F-72EA-4505-9F26FEF9550EFD44/SQL%20Server%202014%20and%20Windows%20Azure%20Blob%20Storage%20S
ervice%20-%20Better%20Together.docx
Azure SQL Database Business Continuity
http://msdn.microsoft.com/en-us/library/azure/hh852669.aspx
Kapitel 4 - Storage:
Relational Database: http://en.wikipedia.org/wiki/Relational_database
Cod’s 12 rules: http://en.wikipedia.org/wiki/Codd%27s_12_rules
CAP-Theorem: http://de.wikipedia.org/wiki/CAP-Theorem
NoSQL Datenbanksysteme: http://nosql-database.org/
FaceBook & HBase: https://www.facebook.com/publications/376874985754849/
Neo4J unter Azure: http://neo4j.com/blog/announcing-neo4j-on-windows-azure/
http://blogs.msdn.com/b/windowsazurestorage/archive/2014/08/01/introducing-zone-redundantstorage.aspx
http://fabriccontroller.net/blog/posts/a-complete-overview-to-get-started-with-the-windows-azurescheduler/
http://www.jeff.wilcox.name/2014/04/wamlmaml/
http://www.cloudidentity.com/blog/2014/07/07/adal-for-netwindows-storewindows-phone-isnow-open-source/
http://azure.microsoft.com/de-de/documentation/articles/storage-import-export-service/
http://azure.microsoft.com/de-de/documentation/articles/storage-whatis-account/
http://msdn.microsoft.com/de-de/library/azure/ee691964.aspx
http://azure.microsoft.com/de-de/documentation/articles/storage-dotnet-how-to-use-blobs/
http://blogs.msdn.com/b/windowsazurestorage/archive/2011/09/15/introducing-geo-replicationfor-windows-azure-storage.aspx
http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/11/using-windows-azure-pageblobs-and-how-to-efficiently-upload-and-download-page-blobs.aspx
http://www.sascha-dittmann.de/post/Dateien-blockweise-im-Windows-Azure-Blob-Storagespeichern.aspx
http://www.qnap.com/i/de/trade_teach/con_show.php?op=showone&cid=114
http://sigops.org/sosp/sosp11/current/2011-Cascais/printable/11-calder.pdf
Kapitel 6 – Azure PowerShell:
http://azure.microsoft.com/en-us/documentation/articles/install-configure-powershell/
Kapitel 8 - Beispielprojekte:
Originalartikel, der über Twitter gepostet wurde:
http://www.thomasclaudiushuber.com/blog/2014/08/19/how-the-surface-rt-became-the-mostreliable-server-in-our-house-co-starring-azure-and-windows-phone/
Web-Adressen diverser WLAN-Kameras: http://www.ispyconnect.com/man.aspx
Beispiel für den Bilder-Upload zu Azure:
http://code.msdn.microsoft.com/windowsapps/How-to-use-Windows-Azure-b3447051
Dokumentation und Code zu den Azure Blobs:
http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/
Herunterladen