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
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.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
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.
- Geben Sie den Servernamen mit dem Parameter
- 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.
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.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
Vergewissern Sie sich Terminal, dass Sie sich im Repositoryordner serviceconnector-webapp-postgresql-django-passwordless befinden, der den App-Code enthält.
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 Regioneastus
) 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
- Erstellen Sie den App Service-Plan im Basic-Tarif (B1). Sie können
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.
- 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
- 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))
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
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.
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.
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:
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.