Lernprogramm: Verbinden einer Django-Web-App mit Azure PostgreSQL mithilfe von Service Connector

In diesem Lernprogramm erfahren Sie, wie Sie eine datengesteuerte Python Django-Web-App für Azure App Service bereitstellen und Service Connector verwenden, um sie mit anderen Azure Diensten zu verbinden. Die Beispielweb-App speichert Restaurant- und Überprüfungsinformationen in einer Azure Database for PostgreSQL-Datenbank und speichert Fotos in einem Azure Storage Container.

Sie verwenden Azure CLI, um die folgenden Aufgaben auszuführen:

Hinweis

Dieses Lernprogramm ähnelt dem App Service Deploy a Python Django Web App with PostgreSQL in Azure Tutorial, verwendet jedoch eine vom System zugewiesene kennwortlose verwaltete Identität mit Azure rollenbasierten Zugriffssteuerung, um auf andere Azure Ressourcen zuzugreifen. Im Abschnitt "Erstellen einer kennwortlosen Dienstverbindung " in diesem Artikel wird gezeigt, wie Service Connector den Verbindungsprozess vereinfacht.

Die Web-App verwendet die DefaultAzureCredentialKlasse der Python Azure Identity-Clientbibliothek, um automatisch zu erkennen, wann eine verwaltete Identität vorhanden ist und verwendet sie für den Zugriff auf die anderen Ressourcen.

Voraussetzungen

  • Ein Azure-Abonnement mit Schreib- und Rollenzuweisungsberechtigungen für die Lernprogrammressourcen in einer Azure-Region, die den Service Connector unterstützt und über ausreichenden App Service-Support und Kontingent verfügt.

  • Azure Cloud Shell, um die Lernprogrammschritte auszuführen, oder wenn Sie es vorziehen, lokal auszuführen:

    1. Installieren Sie Azure CLI 2.30.0 oder höher. Führen Sie zum Überprüfen der Version az --version aus. Führen Sie zum Upgrade die Ausführung aus az upgrade.
    2. Melden Sie sich mit az login bei Azure an, und folgen Sie den Eingabeaufforderungen.

Richten Sie Ihre Umgebung ein

  1. Stellen Sie sicher, dass Ihr Abonnement registriert ist, um die Microsoft.ServiceLinker und Microsoft.DBforPostgreSQL-Ressourcenanbieter zu verwenden. Wenn nicht, führen Sie az provider register -n Microsoft.[name of service] aus, um die Anbieter zu registrieren.

  2. Installieren Sie die folgenden Azure CLI Erweiterungen:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    

Klonen der Beispiel-App

  1. Klonen Sie das Beispiel-App-Repository.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    Alternativ können Sie die App von https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless herunterladen und in einen Ordner namens serviceconnector-webapp-postgresql-django-passwordless entpacken.

  2. Wechseln Sie in das Verzeichnis des Repo-Ordners mit cd serviceconnector-webapp-postgresql-django-passwordless und führen Sie alle verbleibenden Befehle dort aus.

In der Beispiel-App befinden sich die Web App-Produktionseinstellungen in der Datei "azuresite/production.py ". Entwicklungseinstellungen befinden sich in azuresite/settings.py. Die Produktionseinstellungen konfigurieren Django für die Ausführung in einer Produktionsumgebung und sind nicht spezifisch für App Service.

Die App verwendet Produktionseinstellungen, wenn die WEBSITE_HOSTNAME Umgebungsvariable festgelegt wird. Für Azure Postgres-Verbindungszeichenfolgen legt der App-Dienst diese Variable automatisch auf die URL der Web-App fest, z. B. https://msdocs-django.azurewebsites.net.

Weitere Informationen finden Sie in der Checkliste für die Django-Bereitstellung. Siehe auch Production-Einstellungen für Django auf Azure.

Definieren anfänglicher Umgebungsvariablen

Der folgende Code definiert die erforderlichen Umgebungsvariablen für dieses Lernprogramm.

  • LOCATION muss eine Azure Region sein, in der Ihr Abonnement über ein ausreichendes Kontingent verfügt, um die Ressourcen zu erstellen und die Azure Database for PostgreSQL für Ihr Abonnement nicht einzuschränken.
  • Das ADMIN_PW Muss mindestens 8 bis 128 Zeichen in mindestens drei der vier Kategorien Großbuchstaben, Kleinbuchstaben, Ziffern und nichtalphanumerische Zeichen enthalten, ausgenommen $.
  1. Richten Sie die folgenden Umgebungsvariablen ein, und ersetzen Sie die <region> Platzhalter <database password> durch gültige Werte.

    LOCATION="<region>"
    RAND_ID=$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    ADMIN_USER="demoadmin"
    ADMIN_PW="<database password>"
    
  2. Erstellen Sie eine Ressourcengruppe , die alle Projektressourcen enthält. Der Ressourcengruppenname wird zwischengespeichert und automatisch auf nachfolgende Befehle angewandt.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Bereitstellen des App-Codes für App Service

Erstellen Sie den App-Host in App Service, und stellen Sie den Beispiel-App-Code auf diesem Host bereit. Der az webapp up Befehl führt die folgenden Aktionen aus:

  • Erstellt einen App Service-Plan im Preisniveau "Basic (B1)".
  • Erstellt die App Service-App.
  • Aktiviert die Standardprotokollierung für die App.
  • Lädt das Repository mithilfe der ZIP-Bereitstellung mit aktivierter Buildautomatisierung hoch.
  • Erstellt die App.

Im Code definiert der sku Code die CPU, den Arbeitsspeicher und die Kosten des App Service-Plans. Der Basisdienstplan (B1) verursacht in Ihrem Azure-Abonnement geringe Kosten. Sie können den --sku Parameter weglassen, um die Standard-SKU zu verwenden, in der Regel P1v3 (Premium v3). Eine vollständige Liste der App Service-Pläne finden Sie unter App Service-Preise.

  1. Führen Sie im Repositoryordner serviceconnector-webapp-postgresql-django-passwordless den folgenden az webapp up Befehl aus:

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.10 \
      --sku B1
    

    Hinweis

    Die Bereitstellung dauert einige Minuten, und der Befehl kann hängen bleiben oder eine Zeitüberschreitung verursachen, insbesondere bei einer Basic SKU. Sobald die App erfolgreich erstellt wurde und die Ausgabe angezeigt wird Starting the site, können Sie den Befehl beenden, indem Sie STRG+C auswählen.

  2. Konfigurieren Sie die App so, dass das Repository start.sh Datei verwendet wird, indem Sie den Befehl "az webapp config set" ausführen.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Erstellen der Postgres-Datenbank in Azure

Erstellen Sie die Azure Database for PostgreSQL-Datenbank zum Speichern von App-Informationen. Der Befehl az postgres flexible-server create erstellt einen Azure Database for PostgreSQL flexible Server in der angegebenen Ressourcengruppe, die:

  • Der im --name Parameter angegebene Servername. Der Name muss für alle Azure eindeutig sein.
  • SKU im --sku-name Parameter angegeben.
  • Benutzername und Kennwort des Administratorkontos, die in den Parametern --admin-user und --admin-password angegeben sind.
  1. Erstellen Sie den Azure Database for PostgreSQL-Server. Wenn Sie aufgefordert werden, den Zugriff auf die aktuelle Client-IP-Adresse zu aktivieren, geben Sie y "Ja" ein.

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4 \
      --microsoft-entra-auth Enabled
    
  2. Wenn Sie nicht aufgefordert werden, den Zugriff auf Ihre aktuelle Client-IP-Adresse zu aktivieren, konfigurieren Sie eine Firewallregel auf Ihrem Server mit dem Befehl "az postgres flexible-server firewall-rule create ". Diese Regel ermöglicht der lokalen Umgebung Zugriff auf den Server.

    IP_ADDRESS=<your IP address>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    Tipp

    Verwenden Sie ein beliebiges Tool oder eine Website, die Ihre IP-Adresse anzeigt, um <your IP address> im Befehl zu ersetzen. Sie können z. B. "Meine IP-Adresse" verwenden.

  3. Erstellen Sie eine Datenbank mit dem Namen restaurant auf dem Server, indem Sie den Befehl az postgres flexible-server execute verwenden.

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

Erstellen einer kennwortlosen Dienstverbindung

Verwenden Sie az webapp connection create postgres-flexible, um einen Dienst-Connector hinzuzufügen, der die Azure-Webanwendung mit der Postgres-Datenbank verbindet und dabei eine kennwortlose verwaltete Identitätsauthentifizierung nutzt. Der folgende Befehl konfiguriert Azure Database for PostgreSQL für die Verwendung der verwalteten Identität und Azure rollenbasierte Zugriffssteuerung. Die Befehlsausgabe listet die Aktionen auf, die der Dienstconnector ausführt.

Der Befehl erstellt eine Umgebungsvariable namens AZURE_POSTGRESQL_CONNECTIONSTRING , die die Datenbankverbindungsinformationen für die App bereitstellt. Der App-Code greift auf App-Umgebungsvariablen mit Befehlen wie os.environ.get('AZURE_POSTGRESQL_HOST') zu. Weitere Informationen finden Sie unter Access-Umgebungsvariablen.

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database restaurant \
  --client-type python \
  --system-identity

Speicherkonto erstellen und verbinden

Verwenden Sie az webapp connection create storage-blob, um ein Azure-Speicherkonto und einen Dienstanschluss zu erstellen. Der Befehl führt die folgenden Aktionen aus:

  • Aktiviert die vom System zugewiesene verwaltete Identität in der Web-App.
  • Fügt die Web-App mit der Rolle Storage Blob Data Contributor zum neuen Speicherkonto hinzu.
  • Konfiguriert das Netzwerk des Speicherkontos, um den Zugriff von der Web-App zu akzeptieren.
  • Erstellt eine Umgebungsvariable namens AZURE_STORAGEBLOB_RESOURCEENDPOINT für das Azure Storage Konto.
  1. Führen Sie den folgenden Befehl aus, um das Speicherkonto und die Verbindung zu erstellen:

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    
  2. Aktualisieren Sie das Speicherkonto, um öffentlichen Blob-Zugriff für App-Benutzer zum Zugriff auf Fotos zu ermöglichen.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. Verwenden Sie az storage container create, um einen Container namens photos im Speicherkonto zu erstellen, und erlauben Sie anonymen öffentlichen Lesezugriff auf Blobs im neuen Container.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

Testen der Python Web-App in Azure

Öffnen und testen Sie die Azure Restaurant Review Web App. Die App verwendet das Azure.Identity-Paket und dessen DefaultAzureCredential Klasse. Wenn die App in Azure ausgeführt wird, erkennt das DefaultAzureCredential automatisch, wann eine verwaltete Identität für den App-Dienst vorhanden ist, und verwendet sie für den Zugriff auf die Azure Storage und Azure Database for PostgreSQL Ressourcen. Die App muss keine Speicherschlüssel, Zertifikate oder Anmeldeinformationen für den Zugriff auf diese Ressourcen bereitstellen.

  • Bei einer lokalen Azure CLI-Installation können Sie az webapp browse verwenden, um die App in Ihrem Standardbrowser zu öffnen:

    az webapp browse --name $APP_SERVICE_NAME.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell kann keinen lokalen Browser öffnen, sodass der Befehl az webapp browse nicht unterstützt wird. Von Cloud Shell aus besteht die einfachste Möglichkeit zum Öffnen der Web-App darin, die Default-Domäne Link oben rechts auf der Azure Portalseite der App auszuwählen.

Es kann ein oder zwei Minuten dauern, bis die App gestartet ist. Wenn eine Standard-App-Seite angezeigt wird, die nicht die Beispiel-App ist, warten Sie eine Minute, und aktualisieren Sie den Browser.

Testen Sie die Funktionalität der Beispiel-App, indem Sie ein Restaurant und einige Bewertungen mit Fotos hinzufügen. Die App sollte dem folgenden Screenshot ähneln:

Screenshot der Beispiel-App mit Funktionen für die Restaurantüberprüfung mithilfe von App Service, Azure Database for PostgreSQL und Azure Storage.

Bereinigen von Ressourcen

Um laufende Gebühren zu vermeiden, können Sie die ressourcen, die Sie für dieses Lernprogramm erstellt haben, löschen, indem Sie die Ressourcengruppe löschen, die sie enthält. Achten Sie darauf, dass Sie die App oder die Ressourcen nicht mehr benötigen, bevor Sie den Befehl ausführen.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

Das Löschen aller Ressourcen kann einige Zeit dauern. Mit --no-wait dem Argument kann der Befehl sofort zurückgegeben werden.

Problembehandlung

Wenn beim Ausführen dieses Tutorials Probleme auftreten, sehen Sie sich die folgenden Ressourcen an: