Teilen über


Tutorial: Verwenden des Dienstconnectors zum Erstellen einer Django-App mit Postgres für Azure App Service

Hinweis

In diesem Tutorial verwenden Sie einen Dienstconnector, um eine Web-App mit einem Datenbankdienst zu verbinden. Dieses Tutorial ist eine Änderung des App Service-Tutorials, sodass eventuell einige Ähnlichkeiten erkennbar sind. In Abschnitt Erstellen eines kennwortlosen Connectors mit der Postgres-Datenbank erfahren Sie, wo der Dienstconnector ins Spiel kommt und den im App Service-Tutorial beschriebenen Verbindungsaufbau vereinfacht.

In diesem Tutorial wird veranschaulicht, wie Sie eine datengesteuerte Python-Web-App (Django) für Azure App Service bereitstellen und mit einer Datenbankinstanz von Azure Database for PostgreSQL – Flexible Server verbinden.

In diesem Tutorial wird die Azure CLI verwendet, um folgende Aufgaben auszuführen:

  • Einrichten der anfänglichen Umgebung mit Python und der Azure CLI
  • Erstellen einer Datenbank mit Azure Database for PostgreSQL – Flexible Server
  • Bereitstellen von Code für Azure App Service und Herstellen einer Verbindung mit PostgreSQL – Flexible Server
  • Aktualisieren Ihres Codes und erneutes Bereitstellen
  • Anzeigen von Diagnoseprotokollen
  • Verwalten der Web-App im Azure-Portal

Einrichten der anfänglichen Umgebung

Starten Sie in Azure Cloud Shell im Azure-Portal, und installieren Sie die kennwortlose Dienstconnector-Erweiterung 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 Tutorial stellen Sie eine Django-Web-App in Azure App Service bereit. Die Web-App verwendet eine systemseitig zugewiesene verwaltete Identität (kennwortlose Verbindungen) mit rollenbasierter Azure-Zugriffssteuerung für den Zugriff auf Ressourcen für Azure Storage und Azure Database for PostgreSQL – Flexibler Server. Der Code verwendet die DefaultAzureCredential-Klasse der Azure Identity-Clientbibliothek für Python. Die DefaultAzureCredential-Klasse 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.

  • Die Produktionseinstellungen befinden sich in der Datei azuresite/production.py. Die Entwicklungseinstellungen befinden sich in azuresite/settings.py.
  • Von der App werden Produktionseinstellungen verwendet, wenn die Umgebungsvariable WEBSITE_HOSTNAME festgelegt ist. Von Azure App Service wird diese Variable automatisch auf die URL der Web-App festgelegt, 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 Bereitstellungsprüfliste für Django. Ausführliche Informationen zu einigen Änderungen finden Sie unter Produktionseinstellungen für Django in Azure.

Treten Probleme auf? Informieren Sie uns darüber.

Erstellen einer Postgres-Datenbankinstanz 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

    ADMIN_PW muss zwischen 8 und 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. Dabei hat das Zeichen $ innerhalb des Linux-Containers, der zum Ausführen von Python-Apps verwendet wird, eine besondere Bedeutung.

  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 für „Yes“ (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
    

    Wird der Befehl az nicht erkannt, sollten Sie sich vergewissern, dass die Azure CLI wie unter Einrichten der anfänglichen Umgebung beschrieben installiert wurde.

    Der Befehl az postgres flexible-server create führt die folgenden Aktionen aus, die einige Minuten in Anspruch nehmen:

    • Erstellen Sie eine Standardressourcengruppe, wenn noch kein zwischengespeicherter Name vorhanden ist.
    • Erstellen Sie eine Instanz von PostgreSQL – Flexible Server:
      • Geben Sie den Servernamen mit dem Parameter --name an. Der Name muss in ganz Azure eindeutig sein.
      • Geben Sie die SKU mit dem Parameter --sku-name an.
    • Erstellen Sie ein Administratorkonto mit einem Benutzernamen und einem Kennwort, die mit den Parametern --admin-user und --admin-password angegeben werden.
    • Erstellen Sie eine Datenbank, deren Name mit dem Parameter --database-name angegeben wird.
  4. Konfigurieren Sie eine Firewallregel auf dem Server mithilfe des Befehls 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 beliebige Website, mit dem bzw. der Sie Ihre IP-Adresse anzeigen können, um <your IP> im Befehl zu ersetzen. Sie können z. B. die Website What's My IP Address? verwenden.

  5. Erstellen Sie eine Datenbank mit dem Namen restaurant mithilfe des Befehls 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 in 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. Vergewissern Sie sich Terminal, dass Sie sich im Repositoryordner serviceconnector-webapp-postgresql-django-passwordless befinden, der den App-Code enthält.

  2. Führen Sie den folgenden Befehl az webapp up aus, um den App Service-Host 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
    

    sku legt die Größe (CPU, Arbeitsspeicher) und die Kosten des App Service-Plans fest. Der Dienstplan „B1 (Basic)“ verursacht eine geringe Gebühr in Ihrem Azure-Abonnement. Eine vollständige Liste der App Service-Pläne finden Sie auf der Seite App Service – Preise.

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

    • Erstellen Sie den App Service-Plan im Basic-Tarif (B1). Sie können --sku auslassen, um die Standardwerte zu verwenden.
    • Erstellen Sie die App Service-App.
    • Aktivieren Sie die Standardprotokollierung für die App.
    • Hochladen des Repositorys per ZIP-Bereitstellung mit aktivierter Buildautomatisierung
  3. Verwenden Sie den Befehl az webapp config set, um App Service für die Verwendung von start.sh im Repository zu konfigurieren.

    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 nun in App Service bereitgestellt ist, muss als Nächstes eine Verbindung zwischen der App und der Postgres-Datenbank in Azure hergestellt werden. Der App-Code erwartet die Datenbankinformationen für den flexiblen PostgresSQL-Server in einer Umgebungsvariablen namens AZURE_POSTGRESQL_CONNECTIONSTRING und für ein Azure Storage-Konto in einer Umgebungsvariablen namens AZURE_STORAGEBLOB_RESOURCEENDPOINT.

Die Dienstconnectorbefehle konfigurieren Azure Storage- und Azure Database for PostgreSQL-Ressourcen für die Verwendung der verwalteten Identität und der rollenbasierten Zugriffssteuerung in Azure. Die Befehle erstellen App-Einstellungen in 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.

  1. Fügen Sie einen PostgreSQL-Dienstconnector 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 "{0}" 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 wird auf diese Einstellungen in Form von Umgebungsvariablen mit Anweisungen wie os.environ.get('AZURE_POSTGRESQL_HOST')zugegriffen. Weitere Informationen finden Sie unter Zugreifen auf 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. Dabei wird ein Dienstconnector erstellt, der die folgenden Konfigurationen vornimmt:
  • Aktivieren der systemseitig zugewiesenen verwalteten Identität für die Web-App

  • Hinzufügen der Web-App mit der Rolle Mitwirkender an Storage-Blobdaten zum neu erstellten Speicherkonto

  • 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 so, dass der öffentliche Blobzugriff für Benutzer der Restaurant-App auf Bilder ermöglicht wird:

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  2. Erstellen Sie mit dem Befehl az storage container create einen Container mit dem Namen photos im Speicherkonto. 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

Die Python-Beispiel-App verwendet das Paket azure.identity und dessen DefaultAzureCredential-Klasse. Wenn die App in Azure ausgeführt wird, erkennt DefaultAzureCredential automatisch, ob eine verwaltete Identität für App Service vorhanden ist, und verwendet sie in diesem Fall für den Zugriff auf andere Azure-Ressourcen (in diesem Fall Speicher und PostgreSQL). Es ist nicht erforderlich, Speicherschlüssel, Zertifikate oder Anmeldeinformationen für App Service bereitzustellen, 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 wird. Wenn eine App-Standardseite angezeigt wird, bei der es sich nicht um die Standardseite der Beispiel-App handelt, 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. Die Restaurant- und Bewertungsinformationen werden in Azure Database for PostgreSQL und die Fotos in Azure Storage gespeichert. Dies ist ein Beispielscreenshot:

    Screenshot: Beispiel-App mit Funktionen für Restaurantbewertungen mit Azure App Service, Azure PostgreSQL Database und Azure Storage

Bereinigen von Ressourcen

Wenn Sie die App behalten oder mit weiteren Tutorials fortfahren möchten, fahren Sie direkt mit Nächste Schritte 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. Das Argument --no-wait ermöglicht, dass der Befehl sofort zurückgegeben wird.

Treten Probleme auf? Informieren Sie uns darüber.

Nächster Schritt