Microsoft Azure

Automatisierung der Erstellung, Entwicklung und Bereitstellung von Azure-Websites

Gyan Jadal

Das Codebeispiel herunterladen

Microsoft Azure ist eine schnelle und einfache Möglichkeit zum Erstellen und Bereitstellen von Websites oder APIs für die Nutzer Ihrer Cloud. Zu den verschiedenen Aspekten von Azure-Websites, einschließlich Sicherheit, Bereitstellung usw., wurde schon viel geschrieben. Es ist immer eine Herausforderung, diese Informationen in eine reale Implementierung einzubringen. In diesem Artikel habe ich diese verschiedenen Facetten zusammengefasst, damit Sie eine für die Produktion einsatzbereite Azure-Website schnell erstellen können. Ich werde Sie durch den gesamten Lebenszyklus der Erstellung, Bereitstellung, Konfiguration und Überwachung einer Azure-Website begleiten.

Ich beginne mit dem Erstellen einer Website in Visual Studio 2013, die ich anschließend in Azure bereitstelle. Dann richte ich die fortlaufende Integration aus meinem Quellcoderepository in Azure sowie die Authentifizierung mit dem API-Schlüssel oder Zertifikaten ein. Schließlich zeige ich, wie das Erstellen und Bereitstellen der Website in einer Produktionsumgebung mithilfe von Windows PowerShell erfolgt.

Erstellen einer Azure-Website

Dies ist der einfachste Schritt des gesamten Prozesses. Ich erstelle eine Azure-Website und füge einen Controller hinzu, wobei ich die darin enthaltene Geschäftslogik überspringe, um die wichtigsten Punkte zu veranschaulichen. Zunächst benötige ich das Windows Azure SDK für .NET 2.5, das von bit.ly/1GlhJpu heruntergeladen werden kann.

In Visual Studio 2013 erstelle eine neue ASP.NET-Webanwendung, indem ich eine leere Vorlage auswähle. Sie können "WebAPI" auswählen, wenn Sie eine Schnittstelle mithilfe der gleichen Website verfügbar machen möchten. Ich aktiviere die Kontrollkästchen "AppInsights" und "In Azure gehostet". Ich wähle jetzt noch keine Authentifizierung aus, da ich sie später hinzufügen werde. Ich konfiguriere auch Application Insights für die Bereitstellung in anderen Umgebungen.

Wenn Details zur Azure-Website angefragt werden (siehe Abbildung 1), gebe ich den Namen der Website ein, wähle eine Region und klicke auf "OK".

Dadurch wird eine leere Website eingerichtet und in Azure veröffentlichet. Nun füge ich der Website einige Inhalte hinzu und nutze die Open Web Interface for .NET (OWIN) als Middleware. Um OWIN zu aktivieren, füge ich die folgenden NuGet-Pakete hinzu: "Microsoft.Owin.Host.SystemWeb" und "Microsoft.AspNet.WebApi.Owin".

Konfigurieren von Microsoft Azure-Websitedetails
Abbildung 1: Konfigurieren von Microsoft Azure-Websitedetails

Nach Installation der NuGet-Pakete klicke ich mit der rechten Maustaste auf das Projekt und wähle "OWIN-Startklasse hinzufügen" aus. Ich nenne die Klasse "Startup" und füge den folgenden Code der "Configuration"-Methode hinzu, wodurch das Controllerrouting eingerichtet wird:

public void Configuration(IAppBuilder app) {
  var config = new HttpConfiguration();
  config.Routes.MapHttpRoute("default", "{controller}/{id}",
    new { id = RouteParameter.Optional});
  app.UseWebApi(config);
}

Als Nächstes füge ich einen Controller hinzu, um eine API bereitzustellen, indem ich mit der rechten Maustaste auf das Projekt klicke und dann auf die "Add Web API Controller"-Klasse klicke. Ich nenne die Klasse "MyWebController" und lasse den generierten Code unverändert. Als Nächstes klicke ich mit der rechten Maustaste auf das Projekt und klicke dann auf "Veröffentlichen". Im Dialogfeld "Veröffentlichen" wähle ich unter der Registerkarte "Einstellungen" die Debugkonfiguration, damit ich die Website remote debuggen kann. Dann klicke ich auf "Weiter" und "Veröffentlichen".

Wenn ich zu meiner Azure-Website navigiere, wird die "Get"-Methode des Controllers standardmäßig aufgerufen, die eine JSON-Zeichenfolge als ["Wert1", "Wert2"] zurückgibt. Meine Website wird nun in Azure ausgeführt. So weit, so gut.

Nun füge ich eine Clientanwendung zum Aufrufen der Website-API hinzu, die gerade in der Cloud verfügbar gemacht wurde. Ich erstelle eine neue Konsolenanwendung namens "MyConsoleClient" und füge das NuGet-Paket "ASP.NET Web API 2.2 Client Libraries" hinzu. Dieses Paket enthält das "HttpClient"-Objekt, das ich verwenden werde, um die API aufzurufen. Der folgende Code wird der "main"-Methode hinzugefügt:

var httpClient = new HttpClient();
var requestMineType = 
  new MediaTypeWithQualityHeaderValue("application/json");
httpClient.DefaultRequestHeaders.Accept.Add(requestMineType);
var httpResponse =
  httpClient.GetAsync(
  "https://MyAzureWebsiteSample.azurewebsites.net/MyWeb").Result;
Console.WriteLine(httpResponse.Content.ReadAsStringAsync().Result);
Console.ReadLine();

Ich führe den Client nun aus, um zu sehen, wie die "Get"-Methode des Controllers aufgerufen und ["Wert1", "Wert2"] in der Konsole ausgegeben wird. Die habe die Debugkonfiguration für meine Website veröffentlicht. Obwohl Sie die Site lokal debuggen können, ist es mitunter hilfreich, die veröffentlichte Website noch in der Entwicklung remote zu debuggen. Um die veröffentlichte Website zu debuggen, wechsle ich im Portal zur Registerkarte "Konfigurieren" und aktiviere das Remotedebuggen, wobei ich die verwendete Version von Visual Studio auswähle (siehe Abbildung 2).

Aktivieren des Remotedebuggens für Microsoft Azure-Websites
Abbildung 2: Aktivieren des Remotedebuggens für Microsoft Azure-Websites

Um die Website remote zu debuggen und meinen Konsolenclient zu debuggen, habe ich der Zeile "GetAsync" eine Unterbrechung hinzugefügt. Als Nächstes öffne ich Server-Explorer, klicke mit der rechten Maustaste auf die Website und wähle "Debugger anfügen", siehe Abbildung 3.

Anfügen des Debuggers an die veröffentlichte Website
Abbildung 3: Anfügen des Debuggers an die veröffentlichte Website

Ich kann den Code nun schrittweise verfolgen, die Website auf meinem Computer remote debuggen und für meine Änderungen im Quellrepository ein Commit ausführen.

Einrichten der fortlaufenden Integration

Als Nächstes arbeite ich an der Integration meiner Website mit dem Quellrepository für die fortlaufende Integration (Continuous Integration, CI). Wäre es nicht cool, wenn Sie Code in Ihr Repository einchecken könnten, woraufhin das Websiteprojekt erstellt und automatisch auf Azure bereitgestellt würde? Die Funktion "Quellcodeverwaltung integrieren" von Azure-Websites bietet Ihnen eine einfache Möglichkeit zum Verknüpfen Ihres Quellrepositorys mit der Azure-Website für die fortlaufende Integration. Im Azure-Portal navigiere ich zur Registerkarte "Startseite" der Website und klicke auf "Bereitstellung über Quellcodeverwaltung einrichten" (siehe Abbildung 4).

Bereitstellung über Quellcodeverwaltung einrichten
Abbildung 4: Bereitstellung über Quellcodeverwaltung einrichten

Je nachdem, was Sie als Quellcodeverwaltungsanbieter verwenden, müssen Sie aus Visual Studio Online, lokalem Git-Repository, GitHub usw. wählen. Da mein Code sich im Visual Studio Online-Repository befindet, wähle ich es auf dem nächsten Bildschirm aus. Als Nächstes gebe ich den Namen meines Visual Studio Online-Kontos ein und autorisiere mein Konto. Ich muss zustimmen, dass die Verbindungsanforderung aus Azure an mein Visual Studio Online-Konto zugelassen wird. Dann wähle ich den Namen des Repositorys, der meinem Teamprojektnamen entspricht. Nachdem ich auf "Weiter" geklickt habe, wird die Verknüpfung zwischen meiner Azure-Website und meinem Visual Studio Online-Teamprojekt eingerichtet.

In der Option "Builds" im Team Explorer in Visual Studio sollte jetzt die für mich erstellte Builddefinition als "MyAzureWebsite­Sample_CD" angezeigt werden, auf ich mit der rechten Maustaste klicken kann, um die Definition zu bearbeiten. Auf der Registerkarte "Allgemein" ist die Warteschlangenverarbeitung standardmäßig deaktiviert, weshalb ich sie auf "Aktiviert" festlege. In den Prozessparametern unter "Build/Projekte" wähle ich die zu erstellende Projektmappe aus.

An diesem Punkt nehme ich auf der Registerkarte "Prozess" beliebige andere Änderungen an den Prozessparametern vor. Sehen Sie sich auf der Registerkarte "Prozess" den Parameter "Bereitstellung" an. Hier ist die Integration der Builddefinition in den Azure-Dienst eingerichtet. Wenn Sie mehrere Projekte im Repository haben, wird die erste Website gemäß der alphabetischen Reihenfolge bereitgestellt. Um dies zu vermeiden, stellen Sie sicher, dass Sie für jede Website über eine separate Projektmappe verfügen, für die Sie die fortlaufende Integration aktiviert haben. Checken Sie Ihren Code ein, oder klicken Sie mit der rechten Maustaste, und stellen Sie einen Build in die Warteschlange. Die Website sollte erstellt und in Azure veröffentlicht werden.

Sie können prüfen, ob die fortlaufende Integration funktioniert, indem Sie auf die Registerkarte "Bereitstellungen" der Website klicken (siehe Abbildung 5). Hier sehen Sie zum letzten Mal, dass eine erfolgreiche Bereitstellung aus dem CI-Build erfolgt ist.

Bereitstellungsverlauf mit fortlaufender Integration
Abbildung 5: Bereitstellungsverlauf mit fortlaufender Integration

Konfigurieren der Authentifizierung

Die Azure-Website ist nun für die Entwicklung bereit. Sie können Geschäftsfunktionen hinzufügen und von den Vorteilen der fortlaufenden Integration profitieren. Sie möchten die Authentifizierung für die Website einrichten, damit Sie Nutzer authentifizieren und autorisieren können. Es gibt verschiedene Szenarien für diese Einrichtung, deren Details Sie unter bit.ly/1CHVni3 finden.

Bevor ich die Authentifizierung für meine Azure-Website einrichte, füge ich das "Authorize"-Attribut meinem Controller hinzu und veröffentliche die Website. Beim Ausführen des Clients für den Zugriff auf die Website wird die folgende Meldung zurückgegeben:

{"Message": "Authorization has been denied for this request."}

Ich aktiviere nun die Authentifizierung auf meiner Azure-Website und aktualisiere den Konsolenclient so, dass entweder der API-Schlüssel oder Zertifikatanmeldeinformationen für die Authentifizierung bereitgestellt werden. Die Authentifizierung und Tokenerstellung wird an Azure Active Directory (AD) delegiert. Abbildung 6 zeigt den Workflow der Authentifizierung zwischen Client, AAD und Dienst.

Workflow der Azure Active Directory-Authentifizierung
Abbildung 6: Workflow der Azure Active Directory-Authentifizierung

Für die Authentifizierung mit AAD müssen der Client und die Website über entsprechende in AAD registrierte Anwendungseinträge verfügen. Hierzu wechsle ich im Portal zur Registerkarte "Active Directory", wähle das Verzeichnis "org." und klicke auf "Anwendungen". Als Nächstes wähle ich "Anwendung hinzufügen/Eine von meinem Unternehmen entwickelte Anwendung hinzufügen" und gebe den Namen der Website ein.

In meinem Fall gebe ich "MyAzureWebsiteSample" ein. Dann wähle ich die Option "Webanwendung" oder "Web-API" aus und klicke auf "Weiter". Auf dem nächsten Bildschirm gebe ich für "Anmelde-URL" die Adresse zum Öffnen meiner Website unter "MyAzureWebsiteSample.azurewebsites.net" und "[meinedomäne].onmicrosoft.com/MyAzureWebsiteSample" als "App-ID-URI" ein und klicke auf OK. Dadurch wird eine AAD-Anwendung für die Website erstellt. Als Nächstes füge ich AAD den Clientanwendungseintrag hinzu, indem ich die gleichen Schritte wiederhole. Für "Anmelde-URL" und "App-ID-URI" gebe ich "http://myconsoleclient" ein.

Da es sich um eine Clientanwendung handelt, muss es sich nicht um eine physische URL handeln, sodass ein gültiger URI ausreicht. Jetzt möchte ich den Client auf die Anwendung "MyAzureWebsiteSample" zugreifen lassen, sobald er authentifiziert wurde. Dazu klicke ich auf der Registerkarte "Konfigurieren" im Abschnitt "Berechtigungen für andere Anwendungen" auf "Anwendung hinzufügen", wodurch ein Popupfenster geöffnet wird. Ich wähle "Andere" im Menü "Anzeigen", suche nach "MyAzureWebsiteSample", wählen es aus und klicke auf "OK". Zurück auf der Registerkarte "Konfigurieren" gibt es unter "Delegierte Berechtigungen" eine Berechtigung für den Zugriff auf "MyAzureWebsiteSample" (siehe Abbildung 7). Ich versehe sie mit einem Häkchen und klicke dann auf "Anwendung hinzufügen".

Festlegen von Berechtigungen für eine Clientanwendung für den Zugriff auf die Azure-Website in Azure Active Directory
Abbildung 7: Festlegen von Berechtigungen für eine Clientanwendung für den Zugriff auf die Azure-Website in Azure Active Directory

Darüber hinaus notiere ich die Client-ID des Clientanwendungseintrags, da ich sie bald benötige. Wenn Sie den API-Schlüssel für die Authentifizierung verwenden möchten, wird auf dieser Konfigurationsseite ein Schlüssel erstellt. Da ich die Zertifikatauthentifizierung verwende, muss ich mein Zertifikat dem Clientanwendungseintrag in AAD zuordnen. Hierzu verwende ich das Azure AD-Modul für Windows PowerShell, um den Prozess zu automatisieren. Sie können es unter bit.ly/1D4gt8j herunterladen.

Ich führe die folgenden Windows PowerShell-Befehle aus, um eine CER-Datei vom lokalen Computer zu importieren, und lade das Zertifikat in den Clientanwendungseintrag hoch:

Connect-msolservice
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate
$cer.Import("$pwd\MyConsoleClientCert.cer")
$binCert = $cer.GetRawCertData()
$credValue = [System.Convert]::ToBase64String($binCert);
New-MsolServicePrincipalCredential -AppPrincipalId "<client id>" -Type asymmetric -Value $credValue -StartDate $cer.GetEffectiveDateString() -EndDate $cer.GetExpirationDateString() -Usage verify

Die Client-ID in diesem Befehl ist diejenige, die ich im vorherigen Schritt kopiert habe. Um zu prüfen, ob das Zertifikat erfolgreich hochgeladen wurde, führe ich das folgende Cmdlet zum Bereitstellen der Client-ID aus:

Get-MsolServicePrincipalCredential -AppPrincipalId "<clientid>" -ReturnKeyValues 1

Dadurch werden alle der Client-ID zugeordneten Zertifikate angezeigt. In diesem Fall sollte nur eines angezeigt werden. Damit ist das Einrichten meiner Anwendungen in AAD abgeschlossen. Der nächste Schritt ist das Aktivieren der Website und des Clients, wofür ich AAD für die Authentifizierung verwende. Zunächst aktualisiere ich das Projekt "MyAzureWebsiteSample" so, dass es für AAD eingerichtet wird. Ich füge die folgenden NuGet-Pakete für OWIN-Sicherheit im Zusammenhang mit der Authentifizierung hinzu: "Microsoft.Owin.Security" und "Microsoft.Owin.Security.ActiveDirectory".

In der "Startup"-Klasse von "MyAzureWebsiteSample" füge ich der "Configuration"-Methode den folgenden Code hinzu:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
  new WindowsAzureActiveDirectoryBearerAuthenticationOptions {
    TokenValidationParameters = new TokenValidationParameters
      {
        ValidAudience = "https://[mydomain].onmicrosoft.com/MyAzureWebsiteSample",
        ValidateAudience = true,
      },
      Tenant = "[mydomain].onmicrosoft.com"
});

Ersetzen Sie [mydomain] durch den Namen der AAD-Verzeichnisdomäne. Dadurch wird die Website angewiesen, die AAD-Authentifizierung für den angegebenen Zielgruppen-URI zu verwenden. Clients, die auf den Dienst zugreifen, müssen diesen URI zum Abrufen eines Tokens aus AAD bereitstellen. In der Clientkonsole verwende ich für Authentifizierungslogik die Active Directory-Authentifizierungsbibliothek (Active Directory Authentication Library, ADAL) und füge das NuGet-Paket "MyConsoleClient" der Konsolenanwendung hinzu.

ADAL

Im Client verwende ich von ADAL bereitgestellte APIs, um ein Token von AAD zu beziehen, indem die Zertifikatanmeldeinformationen angegeben werden. Ich ersetze den zuvor hinzugefügten Code durch den Code in Abbildung 8, der die Authentifizierung einschließt.

Abbildung 8: Hinzufügen der Authentifizierung zur API

var httpClient = new HttpClient();
var requestMineType = new MediaTypeWithQualityHeaderValue("application/json");
  httpClient.DefaultRequestHeaders.Accept.Add(requestMineType);
var authContext = new  AuthenticationContext(
  "https://login.windows.net/[mydomain].onmicrosoft.com");
var clientAssertionCertificate = new ClientAssertionCertificate("<clientId>",
  GetX509CertObject("CN=MyClientConsoleCert"));
var authResult = authContext.AcquireTokenAsync(
  "https://[mydomain].onmicrosoft.com/MyAzureWebsiteSample",
  clientAssertionCertificate).Result;
httpClient.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
var httpResponse =
  httpClient.GetAsync(
  "https://MyAzureWebsiteSample.azurewebsites.net/MyWeb").Result;
Console.WriteLine(httpResponse.Content.ReadAsStringAsync().Result);
Console.ReadLine();

Ersetzen Sie die Client-ID und den Namen meines Zertifikats durch Ihre eigenen Angaben. Ich habe den Zertifikatabrufcode in die "GetX509CertObject"-Methode abstrahiert, die den Zertifikatspeicher liest und das "X509Certificate"-Objekt erstellt. Wenn Sie den API-Schlüssel anstelle der Zertifikatauthentifizierung verwenden, erstellen Sie ein "ClientCredential"-Objekt, das die Client-ID und den im Portal notierten API-Schlüssel anstatt das "ClientAssertionCertificate"-Objekt übergibt. Wenn keine Clientanmeldeinformationen bereitgestellt werden, um das Token zu beziehen, werden Sie zur Eingabe der Benutzeranmeldeinformationen des AAD-Mandanten aufgefordert.

Ich führe den Code in Abbildung 8 aus, um den Client zu authentifizieren, rufe die "MyAzureWebsiteSample"-Controllermethode auf und gebe ["Wert1", "Wert2"] aus. Der Controller wird mit den Ansprüchen des Clients angezeigt, die ich zur weiteren Autorisierung des Clients verwenden kann. 

Automatisieren der Bereitstellung

Bisher habe ich in einer Entwicklungsumgebung zum Bereitstellen der Azure-Website gearbeitet. Ich muss bloß den Code einchecken, und die Website wird bereitgestellt, oder klicke mit der rechten Maustaste, und sie wird veröffentlicht – so einfach ist das.

Die ist jedoch in Qualitätssicherungs- oder Produktionsumgebungen so nicht möglich. Es ist ggf. nicht zulässig, die Bereitstellung aus Visual Studio vorzunehmen. Ich zeige Ihnen nun, wie Sie die Bereitstellung in einer beliebigen Umgebung mithilfe von Windows PowerShell automatisieren. Ich kann all diese Schritte im Portal durchführen, was jedoch viele manuelle Schritte erfordert.

Azure PowerShell stellt Cmdlets zum Erstellen von Azure-Ressourcen wie z. B. Websites, Speicher usw. bereit. Ich gehe einige der wichtigen Aspekte des Automatisierungsskripts durch. Das vollständige Skript ist im Quellcodedownload zu diesem Artikel verfügbar. Der Ressourcen-Manager-Modus in Azure PowerShell ermöglicht das logische Gruppieren mehrerer Ressourcen wie u. a. Website, Redis-Cache, SQL Azure in einer Ressourcengruppe. Ich verwende das Cmdlet "Switch-AzureMode", um meine Azure PowerShell-Umgebung zwischen dem "ResourceManager"- und "ServiceManagement"-Modus umzuschalten.

Der folgende Code veranschaulicht einige wichtige Punkte im Skript. Zunächst zeigt das Cmdlet "Add-AzureAccount" ein interaktives Fenster, das mich zur Anmeldung bei meinem Azure-Konto auffordert. Das Cmdlet "Select-AzureSubscription" legt das aktuelle Abonnement fest. Dann wechsle ich den Modus in "Ressourcen-Manager", erstelle eine neue Ressourcengruppe und füge meine Website als neue Ressource hinzu:

$SubscriptionId = "<subscriptionid>"
Add-AzureAccount
Select-AzureSubscription -SubscriptionId $SubscriptionId -Current
Switch-AzureMode -Name AzureResourceManager
$myResourceGroup = New-AzureResourceGroup -Name "MyResourceGroup" -Location "West US"
$mywebsite = New-AzureResource -Name "MyAzureWebsiteSample"
  -ResourceType "Microsoft.Web/sites" -ResourceGroupName "MyResourceGroup"
  -Location "West US" -ApiVersion "2014-04-01" -PropertyObject @{}

Ich verwende den Ressourcentyp "Microsoft.Web/Sites". Es gibt andere Ressourcentypen, wie z. B. "Microsoft.Sql/servers/databases", die Sie mit dem Cmdlet "New-resource" erstellen können. In diesem Codeausschnitt erstelle ich ein Azure Storage-Konto, um es meiner Website zum Speichern der Diagnoseprotokolle zuzuordnen. Ich verwende hier keine Ressourcen-Manager-Cmdlets. Ich habe das Azure Storage-Konto außerhalb meiner Ressourcengruppe erstellt. Derzeit wird das Hinzufügen von Speicherkonten zu Ressourcengruppen noch nicht unterstützt. Um eine Tabelle im Speicher zu erstellen, muss ich den Kontext abrufen. Ich erhalte den Kontext durch Übergabe von "StorageAccountKey". "StorageAccountKey" wird von einem Cmdlet an ein anderes übergeben, ohne dass der Benutzer Details kennen muss: 

$myStorage = New-AzureStorageAccount -StorageAccountName "MyStorageAccount"
  -Location "West US"
$storageAccountKey = Get-AzureStorageKey -StorageAccountName "MyStorageAccount"
$context = New-AzureStorageContext -StorageAccountName "MyStorageAccount"
  -StorageAccountKey $storageAccountKey.Primary
$logTable = New-AzureStorageTable -Name $MyStorageTableName -Context $context

Das Cmdlet "Enable-AzureWebsiteApplicationDiagnostic" ermöglicht die Diagnose mithilfe des angegebenen Speicherkontos:

Enable-AzureWebsiteApplicationDiagnostic -Name "MyAzureWebsiteSample"
  -Verbose -LogLevel Information -TableStorage
  -StorageAccountName "MyStorageAccount" –StorageTableName $MyStorageTableName

Für jede Website gibt es einige Einstellungen im Abschnitt "AppSettings" der Datei "web.config", die umgebungsspezifisch sind. Der folgende Codeausschnitt zeigt, wie die Einstellungen in "Appsettings" für eine Azure-Website basierend auf der Umgebung ersetzt werden, in der sie bereitgestellt werden. Diese Einstellungen überschreiben die in der Datei "web.config" vorhandenen Werte der Website:

$appSettings = @{
  "CurrentEnv" = “Test”;
  "ida:Audience" = “https://[mydomain].onmicrosoft.com/MyAzureWebsiteSample”;
  "ida:ClientId" = "8845acba-0820-4ed5-8926-5652s5353s662";
  "ida:Tenant" = "[mydomain].onmicrosoft.com";
  "any:other" = "some other setting";
} 
Set-AzureWebsite -Name “MyAzureWebsiteSample” -AppSettings $appSettings

Durch den Aufruf von "Set-AzureWebsite" wird eine Auflistung von Schlüsselwerten erstellt und auf der Website festgelegt. Dadurch werden die Einstellungen in "web.config" überschrieben. Sie können dies auch später über das Portal ändern.

Bislang habe ich die Infrastruktur meiner Website eingerichtet. Als Nächstes möchte ich die Anwendungslogik in meinem Dienst veröffentlichen. Ich verwende dazu das Cmdlet "Publish­AzureWebsiteProject". Ich muss den Namen meiner Website und des Pakets angeben, das als Teil der Buildausgabe für mein Projekt erstellt wurde:

Publish-AzureWebsiteProject -Package "<packagepath>" -Name "MyAzureWebsiteSample"

Ich habe den Paketpfad meiner Buildausgabe entnommen:

drop\_PublishedWebsites\MyAzureWebsiteSample_Package\MyAzureWebsiteSample.zip

Das Skript lädt auch das Zertifikat in AAD hoch. Das gesamte Skript ist im Codedownload für diesen Artikel verfügbar. Sie können auch bit.ly/1zTBeQo lesen, um mehr über die zahlreichen Funktionen zu erfahren, die das Portal für Azure-Websites zum Verwalten von Websiteeinstellungen und Schlüsseln bei Wechsel von Entwicklungs- zu Integrations- zu Bereitstellungsumgebungen für die Produktion zu bieten hat.  

Aktivieren von Application Insights

Sobald sich Ihre Website in der Produktion befindet, erhalten Sie die Telemetriedaten, die veranschaulichen, wie sich die Website im Hinblick auf Skalierungs- und Leistungsanforderungen verhält. Application Insights bietet eine Telemetrielösung für auf Azure bereitgestellte Ressourcen. Um Application Insights zu aktivieren, musste ich diese Option als Teil der Websitevorlage auswählen. Dadurch werden die erforderlichen NuGet-Pakete und die Datei "ApplicationInsights.config" (mit dem Instrumentationsschlüssel) dem Projekt hinzugefügt. Nach Veröffentlichen der Website wird die ApplicationInsights-Ressource erstellt und mit dem Schlüssel in der CONFIG-Datei verknüpft.

Erstellen Sie im neuen Portal für Produktionsumgebungen eine ApplicationInsights-Ressource. Derzeit gibt es keine Azure PowerShell-Cmdlets zum Einrichten von Application Insights im Portal. Notieren Sie sich in den Eigenschaften den Instrumentationsschlüssel. Sie müssen diesen Schlüssel der Datei "ApplicationInsights.config" hinzufügen, bevor die Website veröffentlicht wird, um sicherzustellen, dass er mit der Website bereitgestellt wird.

Allerdings besteht keine Möglichkeit, diese Datei während der Websiteveröffentlichung zu aktualisieren. Sie können dieses Problem umgehen, indem Sie nicht den Schlüssel in der Datei "ApplicationInsights.config" nutzen. Fügen Sie den Schlüssel stattdessen den Einstellungen in "appsettings" hinzu. Auf diese Weise können Sie ihn für jede Umgebung überschreiben. Woher weiß die Website, dass sie diesen Schlüssel verwenden soll? Hierfür habe ich den Startcode in meiner Website so aktualisiert, dass der Schlüssel in der Datei "web.config" gelesen und im Application Insights-Konfigurationsobjekt festgelegt wird:

Microsoft.ApplicationInsights.Extensibility.
  TelemetryConfiguration.Active.InstrumentationKey = "<read key from appsettings>";

Ich habe auch den Schlüssel aus der Datei "Applicationinsights.config" entfernt, da er nicht mehr erforderlich ist. Jetzt übergebe ich den Schlüssel an mein Azure PowerShell-Automatisierungsskript. Dadurch werden die Anwendungseinstellungen während der Websitebereitstellung aktualisiert. Nachdem Sie Application Insights eingerichtet haben, können Sie Leistungsdaten im Portal oder durch Installieren von Überwachungs-Agents anzeigen.

Zusammenfassung

Dies ist ein grundlegender Anleitungsartikel zum Überführen einer Azure-Website, für die die Authentifizierung und Automatisierung der Bereitstellung in Azure eingerichtet werden, aus einer Entwicklungs- in eine Produktionsumgebung. Azure bietet mittlerweile über Azure PowerShell und das neue verbesserte Portal (portal.azure.com) funktionsreiche und leistungsstarke APIs.

Sie können diese Einrichtung mit eigenen Ressourcen, wie z. B. SQL Azure oder zusätzliche Speicherressourcen, erweitern. Wenn Sie die hier erwähnten Techniken befolgen, können Sie schnell eine neue Azure-Website in Betrieb nehmen sowie die Authentifizierung und Automatisierung für Bereitstellungen in beliebigen Umgebungen einrichten.


Gyan Jadal ist Programmierer bei Microsoft. Er verfügt über umfangreiche Erfahrungen beim Entwerfen und Entwickeln von Lösungen für Anwendungen auf Basis von Azure und lokalen Unternehmenssystemen. Sie erreichen ihn unter gjadal@microsoft.com.

Unser Dank gilt dem folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Mani Sengodan