Freigeben über


Lernprogramm: Verwenden von Service Connector zum Erstellen einer Django-App mit Postgres auf Azure App Service

Hinweis

In diesem Tutorial verwenden Sie einen Dienstconnector, um eine Web-App mit einem Datenbankdienst zu verbinden. Dieses Lernprogramm ist eine Änderung des App-Dienst-Lernprogramms, daher werden möglicherweise einige Ähnlichkeiten angezeigt. Schauen Sie sich den Abschnitt "Erstellen eines kennwortlosen Connectors zu Postgres-Datenbank " an, um zu sehen, wo Service Connector ins Spiel kommt und vereinfacht den im App-Dienst-Lernprogramm angegebenen Verbindungsprozess.

In diesem Lernprogramm wird gezeigt, wie Sie eine datengesteuerte Python Django Web-App für Azure App Service bereitstellen und mit einer Azure Database for PostgreSQL Flexible Serverdatenbank verbinden.

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

  • Einrichten der ersten Umgebung mit Python und der Azure CLI
  • Erstellen einer Azure Database for PostgreSQL flexiblen Serverdatenbank
  • Bereitstellen von Code zum Azure App Service und Herstellen einer Verbindung mit dem flexiblen PostgreSQL-Server
  • Aktualisieren Ihres Codes und erneutes Bereitstellen
  • Anzeigen von Diagnoseprotokollen
  • Verwalten der Web-App im Azure-Portal

Einrichten der anfänglichen Umgebung

Starten Sie von Azure Cloud Shell im Azure Portal, und installieren Sie die kennwortlose Erweiterung des Serviceconnectors für die Azure CLI.

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

Klonen oder Herunterladen der Beispiel-App

Klonen Sie das Beispielrepository:

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

Navigieren Sie zum folgenden Ordner:

cd serviceconnector-webapp-postgresql-django-passwordless

In diesem Lernprogramm stellen Sie eine Django Web App für Azure App Service bereit. Die Web-App verwendet eine vom System zugewiesene managed Identity (kennwortlose Verbindungen) mit Azure rollenbasierten Zugriffssteuerung für den Zugriff auf Azure Storage und Azure Database for PostgreSQL - Flexible ServerRessourcen. Der Code verwendet die Klasse DefaultAzureCredential der Azure Identity-Clientbibliothek für Python. Die klasse DefaultAzureCredential erkennt automatisch, dass eine verwaltete Identität für den App-Dienst vorhanden ist und verwendet sie für den Zugriff auf andere Azure-Ressourcen.

  • Produktionseinstellungen befinden sich in der Datei "azuresite/production.py ". Entwicklungseinstellungen befinden sich in azuresite/settings.py.
  • Die App verwendet Produktionseinstellungen, wenn die WEBSITE_HOSTNAME Umgebungsvariable festgelegt wird. Azure App Service legt diese Variable automatisch auf die URL der Web-App fest, z. B. msdocs-django.azurewebsites.net.

Die Produktionseinstellungen gelten nicht speziell für App Service, sondern ermöglichen die Konfiguration von Django für die Ausführung in einer beliebigen Produktionsumgebung. Weitere Informationen finden Sie in der Checkliste für die Django-Bereitstellung. Weitere Informationen zu einigen Änderungen finden Sie unter Production-Einstellungen für Django auf Azure.

Treten Probleme auf? Informieren Sie uns darüber.

Erstellen einer Postgres-Datenbank in Azure

  1. Richten Sie die für das Tutorial erforderlichen Umgebungsvariablen fest.

    LOCATION="eastus"
    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="{your database password}"
    

    Wichtig

    Die ADMIN_PW muss 8 bis 128 Zeichen aus drei der folgenden Kategorien enthalten: englische Großbuchstaben, englische Kleinbuchstaben, Zahlen und nicht-alphanumerische Zeichen. Verwenden Sie beim Erstellen von Benutzernamen oder Kennwörtern nicht das Zeichen $. Später erstellen Sie Umgebungsvariablen mit diesen Werten, bei denen das Zeichen $ eine bestimmte Bedeutung innerhalb des Linux-Containers hat, der zum Ausführen Python Apps verwendet wird.

  2. Erstellen Sie eine Ressourcengruppe (Sie können den Namen bei Bedarf ändern). Der Ressourcengruppenname wird zwischengespeichert und automatisch auf nachfolgende Befehle angewandt.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    
  3. Erstellen Sie den Datenbankserver. Wenn Sie aufgefordert werden, den Zugriff auf die aktuelle Client-IP-Adresse zu aktivieren, geben Sie y "Ja" ein. Dieser Vorgang dauert einige Minuten:

    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
      --active-directory-auth Enabled
    

    Wenn der Befehl "az" nicht erkannt wird, stellen Sie sicher, dass die Azure CLI installiert ist, wie in "Einrichtung Ihrer anfänglichen Umgebung" beschrieben.

    Der Befehl "az postgres flexible-server create " führt die folgenden Aktionen aus, die einige Minuten dauern:

    • Erstellen Sie eine Standardressourcengruppe, wenn noch kein zwischengespeicherter Name vorhanden ist.
    • Erstellen Sie einen PostgreSQL Flexible Server:
      • Mit dem Servernamen, der mit dem --name Parameter angegeben ist. Der Name muss für alle Azure eindeutig sein.
      • Mit der mit dem --sku-name-Parameter angegebenen SKU.
    • Erstellen Sie ein Administratorkonto mit einem Benutzernamen und Kennwort, die mit den Parametern --admin-user und --admin-password angegeben sind.
    • Erstellen Sie eine Datenbank, deren Name mit dem --database-name Parameter spezifiziert ist.
  4. Konfigurieren Sie eine Firewall-Regel auf Ihrem Server mit dem Befehl az postgres flexible-server firewall-rule create. Diese Regel ermöglicht der lokalen Umgebung Zugriff auf den Server. (Wenn Sie aufgefordert werden, den Zugriff von Ihrer Client-IP-Adresse aus dem vorherigen Schritt zu aktivieren, können Sie diesen Schritt überspringen.)

    IP_ADDRESS=<your IP>
    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
    

    Verwenden Sie ein beliebiges Tool oder eine Website, die Ihre IP-Adresse anzeigt, um <your IP> im Befehl zu ersetzen. Sie können zum Beispiel die Website Was ist meine IP-Adresse? verwenden.

  5. Erstellen Sie eine Datenbank namens restaurant mit dem Befehl az postgres flexible-server execute.

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

Bereitstellen des Codes für Azure App Service

In diesem Abschnitt erstellen Sie einen App-Host in der App Service-App, verbinden die App mit der Postgres-Datenbank und stellen anschließend Ihren Code auf dem Host bereit.

Erstellen der App Service-App

  1. Stellen Sie im Terminal sicher, dass Sie sich im Repositoryordner "serviceconnector-webapp-postgresql-django-passwordless " befinden, der den App-Code enthält.

  2. Führen Sie den folgenden az webapp up Befehl aus, um den App-Diensthost für die App zu erstellen:

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

    Die sku definiert die Größe (CPU, Speicher) und die Kosten des App Service-Plans. Der Dienstplan B1 (Basic) verursacht geringe Kosten im Rahmen Ihres Azure-Abonnements. Für eine vollständige Liste der App Service-Pläne sehen Sie die Seite App Service – Preise an.

    Dieser Befehl führt die folgenden Aktionen aus, die einige Minuten dauern können, wobei Ressourcengruppe und Speicherort aus dem vorherigen az group create Befehl (die Gruppe $RESOURCE_GROUP_NAME in der eastus Region in diesem Beispiel) zwischengespeichert werden.

    • Erstellen Sie einen App Service-Plan im Standard-Preisniveau (B1). Sie können --sku weglassen, um Standardwerte zu verwenden.
    • Erstellen Sie die App Service-App.
    • Aktivieren Sie die Standardprotokollierung für die App.
    • Das Repository hochladen per ZIP-Bereitstellung mit aktivierter Buildautomatisierung.
  3. Konfigurieren Sie App Service zur Verwendung von start.sh im Repo mit dem Befehl az webapp config set.

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

Erstellen eines kennwortlosen Connectors für die Postgres-Datenbank

Nachdem der Code jetzt für App Service bereitgestellt wurde, besteht der nächste Schritt darin, die App mit der Postgres-Datenbank in Azure zu verbinden. Der App-Code erwartet, dass Datenbankinformationen in einer Umgebungsvariable namens AZURE_POSTGRESQL_CONNECTIONSTRING für den flexiblen PostgreSQL-Server und eine Umgebungsvariable namens AZURE_STORAGEBLOB_RESOURCEENDPOINT für Azure Storage Konto gefunden werden.

Die Dienstconnector-Befehle konfigurieren Azure Storage und Azure-Datenbank für PostgreSQL-Ressourcen zur Verwendung der verwalteten Identität und Azure-rollenbasierte Zugriffssteuerung. Die Befehle erstellen App-Einstellungen im App Service, die Ihre Web-App mit diesen Ressourcen verbinden. Die Ausgabe aus den Befehlen listet die Aktionen des Dienstconnectors auf, die zum Aktivieren der kennwortlosen Funktion ausgeführt werden.

Fügen Sie einen PostgreSQL Service-Connector mit dem Befehl az webapp connection create postgres-flexible hinzu. Die systemseitig zugewiesene verwaltete Identität wird verwendet, um die Web-App bei der Zielressource zu authentifizieren, in diesem Fall PostgreSQL.

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

Hinweis

Wird die Fehlermeldung „Das Abonnement ist nicht für die Verwendung des Ressourcenanbieters registriert“ angezeigt, führen Sie az provider register -n Microsoft.ServiceLinker aus, um den Dienstconnector-Ressourcenanbieter zu registrieren. Führen Sie anschließend erneut den Verbindungsbefehl aus.

In Ihrem Python Code greifen Sie auf diese Einstellungen als Umgebungsvariablen mit Anweisungen wie os.environ.get('AZURE_POSTGRESQL_HOST') zu. Weitere Informationen finden Sie unter Access-Umgebungsvariablen.

Treten Probleme auf? Lesen Sie zunächst das Handbuch zur Problembehandlung, andernfalls informieren Sie uns darüber.

Erstellen eines Speicherkontos und Herstellen einer Verbindung mit diesem

  1. Verwenden Sie den Befehl az webapp connection create storage-blob, um ein Speicherkonto zu erstellen und einen Dienstconnector zu konfigurieren, der die folgenden Einstellungen vornimmt:
  • Aktivieren der systemseitig zugewiesenen verwalteten Identität für die Web-App

  • Fügt die Web-App mit der Rolle Speicher Blob Datenmitwirkender zum neu erstellten Speicherkonto hinzu.

  • Konfigurieren des Speicherkontonetzwerks, um den Zugriff von der Web-App zu akzeptieren

    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))
    
  1. Aktualisieren Sie das Speicherkonto, damit die Restaurant-App-Benutzer öffentlichen Zugriff auf Bilder über den Blob-Dienst erhalten.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  2. Erstellen Sie einen Container namens photos im Speicherkonto mit dem Befehl az storage container create. Lassen Sie den anonymen Lesezugriff (öffentlich) auf Blobs im neu erstellten Container zu:

    # 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

Das Beispiel Python-App verwendet das Paket azure.identity und dessen DefaultAzureCredentialKlasse. Wenn die App in Azure ausgeführt wird, erkennt DefaultAzureCredential automatisch, ob eine verwaltete Identität für den App-Dienst vorhanden ist, und verwendet sie in diesem Fall für den Zugriff auf andere Azure-Ressourcen (Speicher und PostgreSQL in diesem Fall). Sie müssen dem App Service keine Storage-Schlüssel, Zertifikate oder Anmeldeinformationen zur Verfügung stellen, um auf diese Ressourcen zuzugreifen.

  1. Navigieren Sie zur bereitgestellten Anwendung unter der URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Es kann ein oder zwei Minuten dauern, bis die App gestartet ist. Wenn Sie eine Standardseite der App sehen, die nicht die Standardseite der Beispielanwendung ist, warten Sie eine Minute und aktualisieren Sie den Browser.

  2. Testen Sie die Funktionalität der Beispiel-App, indem Sie ein Restaurant und einige Bewertungen mit Fotos für das Restaurant hinzufügen. Das Restaurant und die Bewertungsinformationen werden in Azure Database for PostgreSQL gespeichert und die Fotos werden in Azure Storage gespeichert. Hier ist ein Beispiel-Screenshot:

    Screenshot der Beispiel-App mit Funktionen zur Restaurantüberprüfung mithilfe von Azure App Service, Azure PostgreSQL-Datenbank und Azure Storage.

Bereinigen von Ressourcen

Wenn Sie die App beibehalten oder weitere Lernprogramme ausführen möchten, fahren Sie mit den nächsten Schritten fort. Löschen Sie andernfalls die für dieses Tutorial erstellte Ressourcengruppe, um laufende Gebühren zu vermeiden:

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

Wenn Sie die Ressourcengruppe löschen, wird auch die Zuordnung aller darin enthaltenen Ressourcen aufgehoben, und die Ressourcen werden gelöscht. Stellen Sie sicher, dass Sie die Ressourcen in der Gruppe nicht mehr benötigen, bevor Sie den Befehl ausführen.

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

Treten Probleme auf? Informieren Sie uns darüber.

Nächster Schritt