Tutorial: Bereitstellen einer ASP.NET Core- und Azure SQL-Datenbank-App in Azure App Service

In diesem Tutorial erfahren Sie, wie Sie eine datengestützte ASP.NET Core-Web-App in Azure App Service bereitstellen und eine Verbindung mit einer Azure SQL-Datenbank-Instanz herstellen. Darüber hinaus stellen Sie eine Azure Cache for Redis bereit, um den Zwischenspeicherungscode in Ihrer Anwendung zu aktivieren. Azure App Service ist ein hochgradig skalierbarer Webhostingdienst mit Self-Patching, der Apps problemlos unter Windows oder Linux bereitstellen kann. Obgleich in diesem Tutorial eine ASP.NET Core 8.0-App verwendet wird, ist der Prozess für andere Versionen von ASP.NET Core identisch.

In diesem Tutorial lernen Sie Folgendes:

  • Erstellen einer sicheren standardmäßigen App Service-, SQL-Datenbank- und Redis-Cachearchitektur
  • Bereitstellen einer datengesteuerten Beispiel-ASP.NET Core-App
  • Verwenden von Verbindungszeichenfolgen und App-Einstellungen
  • Generieren eines Datenbankschemas durch Hochladen eines Migrationspakets
  • Streamen von Diagnoseprotokollen aus Azure
  • Verwalten der App im Azure-Portal
  • Herstellen und bereitstellen mithilfe der Azure Developer CLI
  • Verwenden der kennwortlosen SQL-Konnektivität mithilfe einer verwalteten Identität

Voraussetzungen

1. Ausführen des Beispiels

Zunächst richten Sie eine datengesteuerte Beispiel-App als Ausgangspunkt ein. Das Beispielrepository umfasst der Einfachheit halber eine Entwicklercontainerkonfiguration. Der Entwicklercontainer verfügt über alles, was Sie zum Entwickeln einer Anwendung benötigen, einschließlich der Datenbank, des Caches und aller Umgebungsvariablen, die von der Beispielanwendung benötigt werden. Der Entwicklercontainer kann in einem GitHub-Codespace ausgeführt werden, was bedeutet, dass Sie das Beispiel auf jedem Computer mit einem Webbrowser ausführen können.

Schritt 1: In einem neuen Browserfenster:

  1. Melden Sie sich bei Ihrem GitHub-Konto an.
  2. Navigiere zu https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/fork.
  3. Deaktivieren Sie die Option Nur Mainbranch kopieren. Sie benötigen alle Branches.
  4. Wählen Sie Fork erstellen aus.

Screenshot: wie eine Verzweigung des Beispiel-GitHub-Repositorys erstellt wird.

Schritt 2: Im GitHub-Fork:

  1. Wählen Sie für den Startbranch main>starter-no-infra aus. Dieser Branch enthält nur das Beispielprojekt und keine Azure-bezogenen Dateien oder Konfigurationen.
  2. Wählen Sie Code>Codespace im Mainbranch erstellen aus. Das Einrichten des Codespace dauert einige Minuten.

Screenshot: Erstellen eines Codespace in GitHub

Schritt 3: Im Codespace-Terminal:

  1. Führen Sie eine Datenbankmigration mit dotnet ef database update aus.
  2. Führen Sie die App mit dotnet run aus.
  3. Wenn die Benachrichtigung Your application running on port 5093 is available. angezeigt wird, wählen Sie Im Browser öffnen aus. Die Beispielanwendung sollte auf einer neuen Browserregisterkarte angezeigt werden. Um die Anwendung zu beenden, geben Sie Ctrl+C ein.

Screenshot: Ausführen der Beispielanwendung im GitHub-Codespace

Tipp

Sie können GitHub Copilot über dieses Repository befragen. Zum Beispiel:

  • @workspace Was macht dieses Projekt?
  • @workspace Wofür dient der Ordner „.devcontainer“?

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

1. Erstellen des App Service, der Datenbank und des Caches

In diesem Schritt erstellen Sie die Azure-Ressourcen. Die in diesem Tutorial ausgeführten Schritte erstellen eine Reihe standardmäßig sicherer Ressourcen, die App Service, Azure SQL-Datenbank und Azure Cache umfassen. Für den Erstellungsprozess geben Sie Folgendes an:

  • Den Namen für die Web-App. Dieser Name wird als Teil des DNS-Namens für Ihre Web-App im Format https://<app-name>.azurewebsites.net verwendet.
  • Die Region für die physische Ausführung der App in der Welt
  • Der Runtimestapel für die App. Hier wählen Sie die Version von .NET aus, die für Ihre App verwendet werden soll.
  • Der Hostingplan für die App. Dies ist der Tarif, der die Features und Skalierungskapazität für Ihre App enthält.
  • Die Ressourcengruppe für die App. Mit einer Ressourcengruppe können Sie (in einem logischen Container) alle für die Anwendung benötigten Azure-Ressourcen gruppieren.

Melden Sie sich beim Azure-Portal an, und führen Sie die folgenden Schritte aus, um Ihre Azure App Service-Ressourcen zu erstellen.

Schritt 1: Im Azure-Portal:

  1. Geben Sie auf der Suchleiste oben im Azure-Portal „Web App Datenbank“ ein.
  2. Wählen Sie das Element mit der Bezeichnung Web-App + Datenbank unter der Überschrift Marketplace aus. Sie können auch direkt zum Erstellungs-Assistenten navigieren.

Screenshot: Verwenden des Suchfelds auf der oberen Symbolleiste, um den Erstellungs-Assistenten „Web-App + Datenbank“ zu finden.

Schritt 2: Füllen Sie das Formular auf der Seite Web-App und Datenbank erstellen wie folgt aus.

  1. Ressourcengruppe: Wählen Sie die Option Neu erstellen aus, und verwenden Sie einen Namen wie msdocs-core-sql-tutorial.
  2. Region: Eine beliebige Azure-Region in Ihrer Nähe.
  3. Name: msdocs-core-sql-XYZ, wobei XYZ für drei beliebige Zeichen steht. Dieser Name muss innerhalb von Azure eindeutig sein.
  4. Runtimestapel: .NET 8 (LTS).
  5. Hinzufügen von Azure Cache for Redis?: Ja.
  6. Hostingplan: Basic. Wenn Sie bereit sind, können Sie später auf einen Produktionstarif hochskalieren.
  7. Wählen Sie SQLAzure als Datenbankmodul aus. Azure SQL-Datenbank ist eine vollständig verwaltete PaaS-Datenbank-Engine (Platform-as-a-Service), die immer auf der neuesten stabilen Version von SQL Server ausgeführt wird.
  8. Klicken Sie auf Überprüfen + erstellen.
  9. Wenn die Überprüfung abgeschlossen ist, wählen Sie Erstellen aus.

Screenshot: wie eine neue App und Datenbank im „Web-App + Datenbank“-Assistenten konfiguriert wird.

Schritt 3: Die Durchführung der Bereitstellung dauert einige Minuten. Wählen Sie nach Abschluss der Bereitstellung die Schaltfläche Zu Ressource wechseln aus. Sie werden direkt zur App Service App weitergeleitet, aber die folgenden Ressourcen werden erstellt:

  • Ressourcengruppe: Der Container für alle erstellten Ressourcen.
  • App Service-Plan: Definiert die Berechnungsressourcen für App Service. Ein Linux-Plan im Basic-Tarif wird erstellt.
  • App Service: Stellt Ihre App dar und wird im App Service Plan ausgeführt.
  • Virtuelles Netzwerk: Integriert in die App Service-App und isoliert den Back-End-Netzwerkdatenverkehr.
  • Private Endpunkte: Access-Endpunkte für den Datenbankserver und den Redis-Cache im virtuellen Netzwerk.
  • Netzwerkschnittstellen: Stellt private IP-Adressen dar, eine für jeden privaten Endpunkt.
  • Azure SQL-Datenbankserver: Nur von hinter seinem privaten Endpunkt aus zugänglich.
  • Azure SQL-Datenbank: Eine Datenbank und ein Benutzer werden für Sie auf dem Server erstellt.
  • Azure Cache for Redis: Nur von hinter seinem privaten Endpunkt aus zugänglich.
  • Private DNS-Zonen: Aktivieren der DNS-Auflösung des Datenbankservers und des Redis-Cache im virtuellen Netzwerk.

Screenshot: Abgeschlossener Bereitstellungsprozess

2. Überprüfen von Verbindungszeichenfolgen

Tipp

Die standardmäßige SQL-Datenbankverbindungszeichenfolge verwendet die SQL-Authentifizierung. Weitere Informationen zur sicheren, kennwortlosen Authentifizierung finden Sie unter Wie kann ich die SQL-Datenbankverbindung ändern, um stattdessen eine verwaltete Identität zu verwenden?

Der Erstellungsassistent hat bereits Verbindungszeichenfolgen für die SQL-Datenbank und den Redis-Cache generiert. Suchen Sie in diesem Schritt nach der generierten Verbindungszeichenfolge zur späteren Verwendung.

Schritt 1: Wählen Sie auf der Seite "App Service" im linken Menü Einstellungen >Umgebungsvariablen aus.

Screenshot: wie die Konfigurationsseite in App Service geöffnet wird.

Schritt 2:

  1. Suchen Sie AZURE_REDIS_CONNECTIONSTRING im Abschnitt App-Einstellungen. Diese Zeichenfolge wurde vom Erstellungsassistenten aus dem neuen Redis-Cache generiert. Um Ihre Anwendung einzurichten, benötigen Sie nur diesen Namen.
  2. Wählen Sie Verbindungszeichenfolgen aus, und suchen Sie AZURE_SQL_CONNECTIONSTRING im Abschnitt Verbindungszeichenfolgen. Diese Zeichenfolge wurde vom Erstellungsassistenten aus der neuen SQL-Datenbank generiert. Um Ihre Anwendung einzurichten, benötigen Sie nur diesen Namen.
  3. Wenn Sie möchten, können Sie die Einstellung auswählen und dessen Wert anzeigen, kopieren oder bearbeiten. Später ändern Sie Ihre Anwendung so, dass AZURE_SQL_CONNECTIONSTRING und AZURE_REDIS_CONNECTIONSTRING verwendet werden.

Screenshot: wie eine App-Einstellung erstellt wird.

3. Bereitstellen von Beispielcode

In diesem Schritt konfigurieren Sie die GitHub-Bereitstellung mithilfe von GitHub Actions. Es ist nur eine der vielen Möglichkeiten, um App Service bereitzustellen, aber auch eine hervorragende Möglichkeit, eine kontinuierliche Integration in Ihren Bereitstellungsprozess zu haben. Standardmäßig startet jede git push in Ihrem GitHub-Repository die Build- und Bereitstellungsaktion.

Schritt 1: Wählen Sie im linken Menü Bereitstellung> Bereitstellungscenter aus.

Screenshot: wie das Bereitstellungscenter in App Service geöffnet wird.

Schritt 2: Auf der Seite „Bereitstellungscenter“:

  1. Wählen Sie in Quelle die Option GitHub aus. Standardmäßig wird GitHub Actions als Buildanbieter ausgewählt.
  2. Melden Sie sich bei Ihrem GitHub-Konto an und folgen Sie der Aufforderung, Azure zu autorisieren.
  3. Wählen Sie in Organisation Ihr Konto aus.
  4. Wählen Sie unter Repository den Wert msdocs-app-service-sqldb-dotnetcore aus.
  5. Wählen Sie unter Branch den Eintrag starter-no-infra aus. Dies ist der gleiche Branch, in dem Sie mit Ihrer Beispiel-App gearbeitet haben, ohne Azure-bezogene Dateien oder Konfigurationen.
  6. Wählen Sie unter Authentifizierungstyp die Option Benutzerseitig zugewiesene Identität aus.
  7. Wählen Sie im oberen Menü Speichern aus. App Service committet eine Workflowdatei in das ausgewählte GitHub-Repository im .github/workflows-Verzeichnis. Standardmäßig erstellt das Bereitstellungscenter eine benutzerseitig zugewiesene Identität für den Workflow zur Authentifizierung mithilfe von Microsoft Entra (OIDC-Authentifizierung). Weitere Informationen zu alternativen Authentifizierungsoptionen finden Sie unter Bereitstellen in App Service mithilfe von GitHub Actions.

Screenshot: wie CI/CD mit GitHub Actions konfiguriert wird.

Schritt 3: führen Sie zurück im GitHub-Codespace Ihrer Beispiel-Verzweigung git pull origin starter-no-infra aus. Dadurch wird die neu committete Workflowdatei in Ihren Codespace übertragen.

Screenshot: „git pull“ in einem GitHub-Codespace

Schritt 4 (Option 1: mit GitHub Copilot):

  1. Starten Sie eine neue Chatsitzung, indem Sie die Ansicht Chat und dann die Option + auswählen.
  2. Fragen Sie "@workspace Wie stellt die App eine Verbindung mit der Datenbank und dem Cache her?" Copilot gibt Ihnen möglicherweise einige Erläuterungen über die MyDatabaseContext Klasse und wie sie in Program.cs konfiguriert wird.
  3. Frage: "Im Produktionsmodus soll die App die Verbindungszeichenfolge AZURE_SQL_CONNECTIONSTRING für die Datenbank und die App-Einstellung "AZURE_REDIS_CONNECTIONSTRING*" verwenden. Copilot gibt Ihnen möglicherweise einen Codevorschlag ähnlich dem in den Schritten unter Option 2: ohne GitHub Copilot unten und schlägt Ihnen sogar vor, die Änderung in der Program.cs-Datei vorzunehmen.
  4. Öffnen Sie Program.cs im Explorer, und fügen Sie den Codevorschlag hinzu. GitHub Copilot gibt Ihnen nicht jedes Mal die gleiche Antwort, und sie ist nicht immer richtig. Möglicherweise müssen Sie weitere Fragen stellen, um ihre Antwort zu optimieren. Tipps finden Sie unter Was kann ich mit GitHub Copilot in meinem Codespace machen?.

Screenshot, der zeigt, wie Sie eine Frage in einer neuen GitHub Copilot-Chatsitzung stellen

Schritt 4 (Option 2: ohne GitHub Copilot):

  1. Öffnen Sie Program.cs im Explorer.
  2. Suchen Sie den kommentierten Code (Zeilen 12–21), und heben Sie die Kommentierung auf. Dieser Code verbindet sich mithilfe von AZURE_SQL_CONNECTIONSTRING mit der Datenbank und stellt mithilfe der App-Einstellung AZURE_REDIS_CONNECTIONSTRING eine Verbindung mit dem Redis-Cache her.

Screenshot eines GitHub-Codespaces und der geöffneten Program.cs Datei.

Schritt 5 (Option 1: mit GitHub Copilot):

  1. Öffnen Sie github/workflows/starter-no-infra_msdocs-core-sql-XYZ im Explorer. Diese Datei wurde vom Erstellungs-Assistenten in App Service erstellt.
  2. Markieren Sie den dotnet publish Schritt, und wählen Sie .
  3. Fragen Sie Copilot: "dotnet ef installieren und dann ein Migrationspaket im selben Ausgabeordner erstellen."
  4. Wenn der Vorschlag akzeptabel ist, wählen Sie Annehmen. GitHub Copilot gibt Ihnen nicht jedes Mal die gleiche Antwort, und sie ist nicht immer richtig. Möglicherweise müssen Sie weitere Fragen stellen, um ihre Antwort zu optimieren. Tipps finden Sie unter Was kann ich mit GitHub Copilot in meinem Codespace machen?.

Screenshot der Verwendung von GitHub Copilot in einer GitHub-Workflowdatei.

Schritt 5 (Option 2: ohne GitHub Copilot):

  1. Öffnen Sie github/workflows/starter-no-infra_msdocs-core-sql-XYZ im Explorer. Diese Datei wurde vom Erstellungs-Assistenten in App Service erstellt.
  2. Fügen Sie unter dem Schritt dotnet publish einen Schritt hinzu, um das Entity Framework Core-Tool mit dem Befehl dotnet tool install -g dotnet-ef --version 8.* zu installieren.
  3. Fügen Sie unter dem neuen Schritt einen weiteren Schritt hinzu, um ein Datenbankmigrationspaket im Bereitstellungspaket zu generieren: dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle. Das Migrationspaket ist eine eigenständige ausführbare Datei, die Sie in der Produktionsumgebung ausführen können, ohne das .NET SDK zu benötigen. Der Linux-Container in App Service verfügt nur über die .NET-Runtime, nicht über das .NET SDK.

Screenshot der Schritte, die der GitHub-Workflowdatei für das Datenbankmigrationspaket hinzugefügt wurden.

Schritt 6:

  1. Wählen Sie die Quellsteuerungserweiterung aus.
  2. Geben Sie im Textfeld eine Commitnachricht ein, z. B. Configure Azure database and cache connections. Oder wählen Sie aus, und lassen Sie GitHub Copilot eine Commit-Nachricht für Sie generieren.
  3. Wählen Sie Commit aus, und bestätigen Sie dann mit Ja.
  4. Wählen Sie Änderungen synchronisieren 1 aus, und bestätigen Sie dann mit OK.

Screenshot der Änderungen, die committet und an GitHub gepusht werden.

Schritt 7: Zurück auf der Seite „Bereitstellungscenter“ im Azure-Portal:

  1. Wählen Sie Protokolle aus. Eine neue Bereitstellungsausführung wurde bereits durch Ihre committeten Änderungen gestartet. Möglicherweise müssen Sie Aktualisieren auswählen, um sie anzuzeigen.
  2. Wählen Sie in dem Protokollelement für die Bereitstellungsausführung den Eintrag Build/Deploy Logs mit dem neuesten Zeitstempel aus.

Screenshot: wie das Bereitstellungscenter in App Service geöffnet wird.

Schritt 8: Sie werden zu Ihrem GitHub-Repository weitergeleitet und sehen, dass die GitHub-Aktion ausgeführt wird. Die Workflowdatei definiert zwei separate Phasen, Erstellen und Bereitstellen. Warten Sie, bis die GitHub-Ausführung den Status Erfolg anzeigt. Dies dauert ca. 5 Minuten.

Screenshot: Aktive GitHub-Ausführung

4. Generieren des Datenbankschemas

Mit der durch das virtuelle Netzwerk geschützten SQL-Datenbank besteht die einfachste Möglichkeit zum Ausführen von dotnet-Datenbankmigrationsvorgängen in einer SSH-Sitzung mit dem App Service-Container.

Schritt 1: Zurück auf der Seite "App Service" im linken Menü wählen Sie Entwicklungstools>SSH und dann Gehe zu aus.

Screenshot: wie sie die SSH-Shell für Ihre App über das Azure-Portal öffnen.

Schritt 2: Im SSH-Terminal:

  1. Führen Sie cd /home/site/wwwroot aus. Hier finden Sie alle Ihre bereitgestellten Dateien.
  2. Führen Sie das Migrationsbundle aus, das vom GitHub-Workflow generiert wurde, mit dem Befehl ./migrationsbundle -- --environment Production. Wenn dies erfolgreich ist, stellt App Service erfolgreich eine Verbindung mit der SQL-Datenbank her. Denken Sie daran, dass --environment Production der in Program.cs vorgenommenenCodeänderungen entspricht.

Screenshot: die Befehle, die in der SSH-Shell ausgeführt werden, und ihre Ausgaben.

In der SSH-Sitzung können nur Änderungen an Dateien in /home über den Neustart der App hinaus bestehen bleiben. Änderungen außerhalb von /home bleiben nicht erhalten.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

5. Navigieren zur App

Schritt 1: Auf der App Service-Seite:

  1. Wählen Sie im Menü auf der linken Seite die Option Übersicht aus.
  2. Wählen Sie die URL Ihrer App aus. Sie können auch direkt zu https://<app-name>.azurewebsites.net navigieren.

Screenshot: wie ein App Service vom Azure-Portal gestartet wird.

Schritt 2: Fügen Sie der Liste einige Aufgaben hinzu. Glückwunsch! Sie führen eine sichere datengesteuerte ASP.NET Core-App in Azure App Service aus.

Screenshot der in App Service ausgeführten .NET Core-App.

Tipp

Die Beispielanwendung implementiert das Cache-Aside-Muster. Wenn Sie eine Datenansicht zum zweiten Mal besuchen oder dieselbe Seite nach Datenänderungen erneut laden, wird die Verarbeitungszeit auf der Webseite als viel schneller angezeigt, da die Daten aus dem Cache und nicht aus der Datenbank geladen werden.

6. Streamen von Diagnoseprotokollen

Azure App Service erfasst alle Nachrichten, die an der Konsole protokolliert werden, um Sie bei der Diagnose von Problemen mit Ihrer Anwendung zu unterstützen. Die Beispiel-App gibt Konsolenprotokollmeldungen an jedem ihrer Endpunkte aus, um diese Funktion zu veranschaulichen.

Schritt 1: Auf der App Service-Seite:

  1. Wählen Sie im linken Menü Überwachung>App Service Protokolle aus.
  2. Wählen Sie unter Anwendungsprotokollierung die Option Dateisystem und dann Speichern aus.

Screenshot: wie native Protokolle in App Service im Azure-Portal aktiviert werden.

Schritt 2: Wählen Sie im Menü auf der linken Seite die Option Protokollstream aus. Sie sehen die Protokolle für Ihre App, einschließlich Plattformprotokolle und Protokolle innerhalb des Containers.

Screenshot: wie der Protokollstream im Azure-Portal angezeigt wird.

7. Bereinigen von Ressourcen

Wenn Sie fertig sind, können Sie alle Ressourcen aus Ihrem Azure-Abonnement löschen, indem Sie die Ressourcengruppe löschen.

Schritt 1: In der Suchleiste oben im Azure-Portal:

  1. Geben Sie den Ressourcengruppennamen ein.
  2. Wählen Sie die Ressourcengruppe aus.

Screenshot: Suchen nach einer Ressourcengruppe und Navigieren zu einer Ressourcengruppe im Azure-Portal

Schritt 2: Wählen Sie auf der Seite „Ressourcengruppe“ die Option Ressourcengruppe löschen aus.

Screenshot: Position der Schaltfläche „Ressourcengruppe löschen“ im Azure-Portal.

Schritt 3:

  1. Geben Sie den Namen der Ressourcengruppe ein, um Ihre Löschung zu bestätigen.
  2. Klicken Sie auf Löschen.

Screenshot: Bestätigungsdialogfeld für das Löschen einer Ressourcengruppe im Azure-Portal:

2. Erstellen von Azure-Ressourcen und Bereitstellen einer Beispiel-App

In diesem Schritt erstellen Sie die Azure-Ressourcen und stellen eine Beispiel-App für App Service für Linux bereit. Die in diesem Tutorial ausgeführten Schritte erstellen eine Reihe standardmäßig sicherer Ressourcen, die App Service, Azure SQL-Datenbank und Azure Cache for Redis umfassen.

Der Entwicklercontainer verfügt bereits über die Azure Developer CLI (AZD).

  1. Führen Sie im Repositorystamm azd init aus.

    azd init --template dotnet-app-service-sqldb-infra
    
  2. Wenn Sie dazu aufgefordert werden, geben Sie die folgenden Antworten:

    Frage Antwort
    Das aktuelle Verzeichnis ist nicht leer. Möchten Sie ein Projekt hier in <Ihr Verzeichnis> initialisieren? Y
    Was möchten Sie mit diesen Dateien tun? Meine vorhandenen Dateien unverändert beibehalten
    Geben Sie einen neuen Umgebungsnamen ein. Geben Sie einen eindeutigen Namen ein. Die AZD-Vorlage verwendet diesen Namen als Teil des DNS-Namens Ihrer Web-App in Azure (<app-name>.azurewebsites.net). Alphanumerische Zeichen und Bindestriche sind zulässig.
  3. Melden Sie sich mithilfe des Befehls azd auth login bei Azure an, und folgen Sie der Eingabeaufforderung:

    azd auth login
    
  4. Führen Sie den azd up-Befehl aus, um die notwendigen Azure-Ressourcen zu erstellen und den App-Code bereitzustellen. Folgen Sie der Eingabeaufforderung, um das gewünschte Abonnement und den gewünschten Standort für die Azure-Ressourcen auszuwählen.

    azd up
    

    Die Ausführung des Befehls azd up dauert etwa 15 Minuten.(Der Großteil der Zeit fällt für den Redis-Cache an.) Außerdem wird Ihr Anwendungscode kompiliert und bereitgestellt. Sie ändern den Code jedoch später so, dass er mit App Service funktioniert. Während der Ausführung stellt der Befehl Nachrichten zum Bestimmungs- und Bereitstellungsprozess bereit, einschließlich eines Links zur Bereitstellung in Azure. Wenn er abgeschlossen ist, zeigt der Befehl auch einen Link zur Bereitstellungsanwendung an.

    Diese AZD-Vorlage enthält Dateien (azure.yaml und das Verzeichnis infra), die eine standardmäßig sichere Architektur mit den folgenden Azure-Ressourcen generieren:

    • Ressourcengruppe: Der Container für alle erstellten Ressourcen.
    • App Service-Plan: Definiert die Berechnungsressourcen für App Service. Ein Linux-Plan im Basic-Tarif wird erstellt.
    • App Service: Stellt Ihre App dar und wird im App Service Plan ausgeführt.
    • Virtuelles Netzwerk: Integriert in die App Service-App und isoliert den Back-End-Netzwerkdatenverkehr.
    • Private Endpunkte: Access-Endpunkte für den Datenbankserver und den Redis-Cache im virtuellen Netzwerk.
    • Netzwerkschnittstellen: Stellt private IP-Adressen dar, eine für jeden privaten Endpunkt.
    • Azure SQL-Datenbankserver: Nur von hinter seinem privaten Endpunkt aus zugänglich.
    • Azure SQL-Datenbank: Eine Datenbank und ein Benutzer werden für Sie auf dem Server erstellt.
    • Azure Cache for Redis: Nur von hinter seinem privaten Endpunkt aus zugänglich.
    • Private DNS-Zonen: Aktivieren der DNS-Auflösung des Datenbankservers und des Redis-Cache im virtuellen Netzwerk.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

3. Überprüfen von Verbindungszeichenfolgen

Tipp

Die standardmäßige SQL-Datenbankverbindungszeichenfolge verwendet die SQL-Authentifizierung. Weitere Informationen zur sicheren, kennwortlosen Authentifizierung finden Sie unter Wie kann ich die SQL-Datenbankverbindung ändern, um stattdessen eine verwaltete Identität zu verwenden?

Die von Ihnen verwendete AZD-Vorlage hat die Konnektivitätsvariablen für Sie bereits als App-Einstellungen generiert und gibt sie der Einfachheit halber im Terminal für Sie aus. App-Einstellungen sind eine Möglichkeit, um Verbindungsgeheimnisse aus Ihrem Coderepository herauszuhalten.

  1. Suchen Sie in der AZD-Ausgabe die App-Einstellungen AZURE_SQL_CONNECTIONSTRING und AZURE_REDIS_CONNECTIONSTRING. Um Geheimnisse zu schützen, werden nur die Einstellungsnamen angezeigt. Sie sehen in der AZD-Ausgabe wie folgt aus:

     App Service app has the following connection strings:
    
             - AZURE_SQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
     

    AZURE_SQL_CONNECTIONSTRING enthält die Verbindungszeichenfolge mit der SQL-Datenbank in Azure und AZURE_REDIS_CONNECTIONSTRING enthält die Verbindungszeichenfolge zum Azure Redis-Cache. Sie müssen sie später in Ihrem Code verwenden.

  2. Der Einfachheit halber enthält die AZD-Vorlage den direkten Link zur Seite „App-Einstellungen“ der App. Suchen Sie den Link, und öffnen Sie ihn auf einer neuen Browserregisterkarte.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

4. Ändern des Beispielcodes und erneutes Bereitstellen

  1. Starten Sie wieder im GitHub-Codespace Ihres Beispielbranches eine neue Chatsitzung, indem Sie die Chatansicht und dann + auswählen.

  2. Fragen Sie "@workspace Wie stellt die App eine Verbindung mit der Datenbank und dem Cache her?" Copilot gibt Ihnen möglicherweise einige Erläuterungen über die MyDatabaseContext Klasse und wie sie in Program.cs konfiguriert wird.

  3. Frage: "Im Produktionsmodus soll die App die Verbindungszeichenfolge AZURE_SQL_CONNECTIONSTRING für die Datenbank und die App-Einstellung "AZURE_REDIS_CONNECTIONSTRING*" verwenden. Copilot gibt Ihnen möglicherweise einen Codevorschlag ähnlich dem in den Schritten unter Option 2: ohne GitHub Copilot unten und schlägt Ihnen sogar vor, die Änderung in der Program.cs-Datei vorzunehmen.

  4. Öffnen Sie Program.cs im Explorer, und fügen Sie den Codevorschlag hinzu.

    GitHub Copilot gibt Ihnen nicht jedes Mal die gleiche Antwort, und sie ist nicht immer richtig. Möglicherweise müssen Sie weitere Fragen stellen, um ihre Antwort zu optimieren. Tipps finden Sie unter Was kann ich mit GitHub Copilot in meinem Codespace machen?.

Bevor Sie diese Änderungen bereitstellen, müssen Sie dennoch ein Migrationspaket generieren.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

4. Generieren des Datenbankschemas

Mit der durch das virtuelle Netzwerk geschützten SQL-Datenbank besteht die einfachste Möglichkeit zum Ausführen von Datenbankmigrationsvorgängen in einer SSH-Sitzung mit dem App Service-Container. Die Linux-Container des App-Diensts verfügen jedoch nicht über das .NET SDK, daher besteht die einfachste Möglichkeit zum Ausführen von Datenbankmigrationen darin, ein eigenständiges Migrationspaket hochzuladen.

  1. Generieren Sie ein Migrationspaket für Ihr Projekt mit dem folgenden Befehl:

    dotnet ef migrations bundle --runtime linux-x64 -o migrationsbundle
    

    Tipp

    Die Beispielanwendung (siehe DotNetCoreSqlDb.csproj) ist so konfiguriert, dass sie diese Migrationsbundle-Datei enthält. Während der azd package Phase wird Migrationsbundle zum Bereitstellungspaket hinzugefügt.

  2. Stellen Sie alle Änderungen mit azd up bereit.

    azd up
    
  3. Suchen Sie in der azd-Ausgabe die URL für die SSH-Sitzung, und navigieren Sie im Browser dorthin. Die Ausgabe sieht wie folgt aus:

     Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
     
  4. Führen Sie im SSH Terminal die folgenden Befehle aus:

    cd /home/site/wwwroot
    ./migrationsbundle -- --environment Production
    

    Wenn dies erfolgreich ist, stellt App Service erfolgreich eine Verbindung mit der Datenbank her. Denken Sie daran, dass --environment Production der in Program.cs vorgenommenenCodeänderungen entspricht.

In der SSH-Sitzung können nur Änderungen an Dateien in /home über den Neustart der App hinaus bestehen bleiben. Änderungen außerhalb von /home bleiben nicht erhalten.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

6. Navigieren zur App

  1. Suchen Sie in der AZD-Ausgabe die URL für Ihre App, und navigieren Sie im Browser dorthin. Die URL sieht in der AZD-Ausgabe wie folgt aus:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. Fügen Sie der Liste einige Aufgaben hinzu.

    Screenshot der ASP.NET Core Web App mit SQL-Datenbank, die in Azure ausgeführt wird, mit Aufgaben.

    Glückwunsch! Sie führen eine Web-App in Azure App Service mit sicherer Konnektivität zu Azure SQL Database aus.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

7. Streamen von Diagnoseprotokollen

Azure App Service kann Konsolenprotokolle erfassen, um Sie bei der Diagnose von Problemen mit Ihrer Anwendung zu unterstützen. Der Einfachheit halber sind für die AZD-Vorlage bereits die Protokollierung im lokalen Dateisystem sowie das Senden der Protokolle an einen Log Analytics-Arbeitsbereich aktiviert.

Die Beispielanwendung enthält standardmäßige Protokollierungsanweisungen, um diese Funktion wie im folgenden Codeschnipsel dargestellt zu veranschaulichen:

public async Task<IActionResult> Index()
{
    var todoItems = await _cache.GetAsync(_TodoItemsCacheKey);
    if (todoItems != null)
    {
        _logger.LogInformation("Data from cache.");
        var todoList = JsonConvert.DeserializeObject<List<Todo>>(Encoding.UTF8.GetString(todoItems));
        return View(todoList);
    }
    else
    {
        _logger.LogInformation("Data from database.");
        var todoList = await _context.Todo.ToListAsync();
        var serializedTodoList = JsonConvert.SerializeObject(todoList);
        await _cache.SetAsync(_TodoItemsCacheKey, Encoding.UTF8.GetBytes(serializedTodoList));
        return View(todoList);
    }
}

Suchen Sie in der AZD-Ausgabe den Link zum Streamen von App Service-Protokollen, und navigieren Sie im Browser dorthin. Der Link sieht in der AZD-Ausgabe wie folgt aus:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Erfahren Sie mehr über die Protokollierung in .NET-Apps in der Reihe unter Azure Monitor OpenTelemetry für .NET-, Node.js-, Python- und Java-Anwendungen aktivieren.

Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.

8. Bereinigen von Ressourcen

Führen Sie azd down aus, und folgen Sie den Eingabeaufforderungen, um alle Azure-Ressourcen in der aktuellen Bereitstellungsumgebung zu löschen.

azd down

Problembehandlung

Die Portalbereitstellungsansicht für Azure SQL-Datenbank zeigt einen Konfliktstatus an

Je nach ausgewähltem Abonnement und ausgewählter Region wird möglicherweise der Bereitstellungsstatus für Azure SQL Database als Conflict mit der folgenden Meldung in den Vorgangsdetails angezeigt:

InternalServerError: An unexpected error occured while processing the request.

Dieser Fehler wird höchstwahrscheinlich durch einen Grenzwert für Ihr Abonnement für die von Ihnen ausgewählte Region verursacht. Versuchen Sie, eine andere Region für Ihre Bereitstellung auszuwählen.

Im Azure-Portal zeigt die Protokolldatenstrom-UI für die Web-App Netzwerkfehler an

Es wird vielleicht dieser Fehler angezeigt:

Unable to open a connection to your app. This may be due to any network security groups or IP restriction rules that you have placed on your app. To use log streaming, please make sure you are able to access your app directly from your current network.

Dies ist in der Regel ein vorübergehender Fehler, wenn die App zum ersten Mal gestartet wird. Warten Sie ein paar Minuten, und überprüfen Sie es erneut.

Die SSH-Sitzung im Browser zeigt SSH CONN CLOSED

Es dauert ein paar Minuten, bis der Linux-Container gestartet wird. Warten Sie ein paar Minuten, und überprüfen Sie es erneut.

Die Portalprotokollstreamseite zeigt Connected! jedoch keine Protokolle an

Nachdem Sie Diagnoseprotokolle konfiguriert haben, wird die App neu gestartet. Möglicherweise müssen Sie die Seite aktualisieren, damit die Änderungen im Browser wirksam werden.

Häufig gestellte Fragen

Wie viel kostet diese Einrichtung?

Die Preise für die erstellte Ressourcen sind wie folgt:

  • Der App Service-Plan wird im Tarif Basic erstellt und kann hoch- oder herunterskaliert werden. Informationen dazu finden Sie unter App Service – Preise.
  • Die Azure SQL-Datenbank wird im universellen, serverlosen Tarif auf Hardware der Standardserie mit minimalen Kernen erstellt. Es fallen geringe Kosten an, und sie kann auf andere Regionen verteilt werden. Sie können die Kosten sogar noch weiter minimieren, indem Sie ihre maximale Größe verringern, oder Sie können sie hochskalieren, indem Sie die bedienende Dienstebene, die Computeebene, die Hardwarekonfiguration, die Anzahl der Kerne, die Datenbankgröße und die Zonenredundanz anpassen. Siehe Preise für Azure SQL-Datenbank.
  • Die Azure Cache for Redis wird in der Ebene Basic mit der minimalen Cachegröße erstellt. Diese Ebene ist mit geringen Kosten verbunden. Sie können sie auf leistungsstärkere Ebenen für eine höhere Verfügbarkeit, für Clustering und andere Features hochskalieren. Siehe Azure Cache for Redis: Preise.
  • Das virtuelle Netzwerk hat keine Gebühr, es sei denn, Sie konfigurieren zusätzliche Funktionen, z. B. Peering. Siehe Azure Virtual Network Preise.
  • Die private DNS-Zone verursacht eine kleine Gebühr. Siehe Azure DNS-Preise.

Wie stelle ich mit anderen Tools eine Verbindung mit dem Azure SQL-Datenbank-Server her, der hinter dem virtuellen Netzwerk gesichert ist?

  • Für den einfachen Zugriff aus einem Befehlszeilentool können Sie sqlcmd über das SSH-Terminal der App ausführen. sqlcmd ist im Container der App nicht enthalten, daher ist eine manuelle Installation erforderlich. Denken Sie daran, dass der installierte Client nicht über App-Neustarts hinweg beibehalten wird.
  • Um eine Verbindung über einen SQL Server Management Studio-Client oder über Visual Studio herzustellen, muss sich Ihr Computer innerhalb des virtuellen Netzwerks befinden. Es könnte beispielsweise eine Azure-VM sein, die mit einem der Subnetze verbunden ist, oder ein Computer in einem lokalen Netzwerk, das über eine Standort-zu-Standort-VPN-Verbindung mit dem virtuellen Azure-Netzwerk verfügt.

Wie funktioniert die lokale App-Entwicklung mit GitHub Actions?

Nehmen Sie die automatisch generierte Workflowdatei von App Service als Beispiel; jede git push startet eine neue Build- und Bereitstellungsausführung. Aus einem lokalen Klon des GitHub-Repositorys können Sie die gewünschten Updates zu GitHub pushen. Beispiel:

git add .
git commit -m "<some-message>"
git push origin main

Gewusst wie: Debuggen von Fehlern während der GitHub Actions-Bereitstellung

Wenn ein Schritt in der automatisch generierten GitHub-Workflowdatei fehlschlägt, versuchen Sie, den fehlerhaften Befehl zu ändern, um eine ausführlichere Ausgabe zu generieren. So können Sie beispielsweise eine ausführlichere Ausgabe von jedem der dotnet-Befehle abrufen, indem Sie die -v-Option hinzufügen. Committen und pushen Sie Ihre Änderungen, um eine weitere Bereitstellung in App Service auszulösen.

Ich habe keine Berechtigungen zum Erstellen einer benutzerseitig zugewiesenen Identität.

Siehe Einrichten der Bereitstellung von GitHub Actions über das Bereitstellungscenter.

Wie ändere ich die SQL-Datenbankverbindung, um stattdessen eine verwaltete Identität zu verwenden?

Die Standardverbindungszeichenfolge mit der SQL-Datenbank wird von Service Connector mit dem Namen defaultConnectorverwaltet und verwendet die SQL-Authentifizierung. Um sie durch eine Verbindung zu ersetzen, die eine verwaltete Identität verwendet, führen Sie die folgenden Befehle in der Cloudshell aus, nachdem sie die Platzhalter ersetzt haben:

az extension add --name serviceconnector-passwordless --upgrade
az sql server update --enable-public-network true
az webapp connection delete sql --connection defaultConnector --resource-group <group-name> --name <app-name>
az webapp connection create sql --connection defaultConnector --resource-group <group-name> --name <app-name> --target-resource-group <group-name> --server <database-server-name> --database <database-name> --client-type dotnet --system-identity --config-connstr true
az sql server update --enable-public-network false

Standardmäßig führt der Befehl az webapp connection create sql --client-type dotnet --system-identity --config-connstr die folgenden Aktionen aus:

  • Legt Ihren Benutzer als Microsoft Entra ID-Administrator des SQL-Datenbankservers fest.
  • Erstellt eine vom System zugewiesene verwaltete Identität, und gewährt ihm Zugriff auf die Datenbank.
  • Generiert eine kennwortlose Verbindungszeichenfolge namens AZURE_SQL_CONNECTIONGSTRING, die Ihre App bereits am Ende des Lernprogramms verwendet.

Ihre App sollte jetzt über eine Verbindung mit der SQL-Datenbank verfügen. Weitere Informationen finden Sie unter Tutorial: Herstellen einer Verbindung mit Azure-Datenbanken über App Service ohne Geheimnisse mithilfe einer verwalteten Identität.

Tipp

Möchten Sie keine öffentliche Netzwerkverbindung aktivieren? Sie können az sql server update --enable-public-network true überspringen, indem Sie die Befehle aus einer Azure-Cloudshell ausführen, die in Ihr virtuelles Netzwerk integriert ist, wenn Sie über die Rollenzuweisung Besitzer in Ihrem Abonnement verfügen.

Um der Identität den erforderlichen Zugriff auf die Datenbank zu gewähren, die durch das virtuelle Netzwerk gesichert ist, braucht az webapp connection create sql eine direkte Verbindung mit dem Datenbankserver mit Entra-ID-Authentifizierung. Standardmäßig verfügt die Azure Cloud Shell nicht über diesen Zugriff auf die durch das Netzwerk gesicherte Datenbank.

Was kann ich mit GitHub Copilot in meinem Codespace machen?

Möglicherweise haben Sie bemerkt, dass die GitHub Copilot-Chatansicht bereits verfügbar war, als Sie den Codespace erstellt haben. Zur Vereinfachung können Sie die GitHub Copilot-Chaterweiterung in die Containerdefinition einfügen (siehe .devcontainer/devcontainer.json). Sie benötigen jedoch ein GitHub Copilot-Konto (kostenlose 30-Tage-Testversion verfügbar).

Einige Tipps für die Unterhaltung mit GitHub Copilot:

  • In einer einzelnen Chatsitzung bauen die Fragen und Antworten aufeinander auf, und Sie können Ihre Fragen anpassen, um die Antworten zu optimieren.
  • Standardmäßig hat GitHub Copilot keinen Zugriff auf Dateien in Ihrem Repository. Um Fragen zu einer Datei zu stellen, öffnen Sie die Datei zuerst im Editor.
  • Damit GitHub Copilot beim Vorbereiten der Antworten Zugriff auf alle Dateien im Repository hat, beginnen Sie Ihre Frage mit @workspace. Weitere Informationen finden Sie unter Use the @workspace agent.
  • Innerhalb der Chatsitzung kann GitHub Copilot Änderungen vorschlagen und (mit @workspace) auch angeben, wo die Änderungen vorgenommen werden sollen. Copilot darf jedoch die Änderungen nicht für Sie vornehmen. Sie müssen entscheiden, ob Sie die vorgeschlagenen Änderungen hinzufügen und testen.

Im Folgenden finden Sie einige weitere Aussagen, mit denen Sie die Antwort optimieren können.

  • Ich möchte, dass dieser Code nur im Produktionsmodus ausgeführt wird.
  • Ich möchte, dass dieser Code nur in Azure App Service und nicht lokal ausgeführt wird.
  • Der Parameter "-output-path" scheint nicht unterstützt zu werden.

Fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie Ihre App mit einer benutzerdefinierten Domäne und einem Zertifikat schützen.

Oder sehen Sie sich weitere Ressourcen an: