Erstellen und Bereitstellen einer Django-Web-App in Azure mit einer benutzerseitig zugewiesenen verwalteten Identität
In diesem Lernprogramm stellen Sie eine Django-Web-App für Azure-App Dienst bereit. Die Web-App verwendet eine vom Benutzer zugewiesene verwaltete Identität (kennwortlose Verbindungen) mit rollenbasierter Azure-Zugriffssteuerung für den Zugriff auf Azure Storage und Azure-Datenbank für PostgreSQL – flexible Serverressourcen. 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.
In diesem Lernprogramm erstellen Sie eine vom Benutzer zugewiesene verwaltete Identität und weisen sie dem App-Dienst zu, damit sie auf die Datenbank- und Speicherkontoressourcen zugreifen kann. Ein Beispiel für die Verwendung einer vom System zugewiesenen verwalteten Identität finden Sie unter Erstellen und Bereitstellen einer Flask Python-Web-App in Azure mit vom System zugewiesener verwalteter Identität. Vom Benutzer zugewiesene verwaltete Identitäten werden empfohlen, da sie von mehreren Ressourcen verwendet werden können, und ihre Lebenszykluszyklen werden von den Ressourcenlebenszyklen entkoppelt, mit denen sie verknüpft sind. Weitere Informationen zu bewährten Methoden für die Verwendung von verwalteten Identitäten finden Sie unter Empfehlungen für bewährte Methoden für verwaltete Identitäten.
In diesem Lernprogramm erfahren Sie, wie Sie die Python-Web-App bereitstellen und Azure-Ressourcen mithilfe der Azure CLI erstellen. Die Befehle in diesem Lernprogramm werden so geschrieben, dass sie in einer Bash-Shell ausgeführt werden. Sie können die Lernprogrammbefehle in einer beliebigen Bash-Umgebung ausführen, auf der die CLI installiert ist, z. B. Ihre lokale Umgebung oder die Azure Cloud Shell. Mit einigen Änderungen – z. B. Festlegen und Verwenden von Umgebungsvariablen – können Sie diese Befehle in anderen Umgebungen wie der Windows-Befehlsshell ausführen.
Abrufen der Beispiel-App
Verwenden Sie die Beispielanwendung Django, um zusammen mit diesem Lernprogramm zu folgen. Laden Sie die Beispielanwendung in Ihre Entwicklungsumgebung herunter, oder klonen Sie sie.
Klonen Sie das Beispiel.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
Navigieren Sie zum Anwendungsordner.
cd msdocs-django-web-app-managed-identity
Erstellen eines flexiblen Azure PostgreSQL-Servers
Richten Sie die für das Lernprogramm erforderlichen Umgebungsvariablen ein.
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="ChAnG33#ThsPssWD$RAND_ID" UA_NAME="UAManagedIdentityPythonTest$RAND_ID"
Wichtig
Dies
ADMIN_PW
muss 8 bis 128 Zeichen aus drei der folgenden Kategorien enthalten: Englische Großbuchstaben, englische Kleinbuchstaben, Zahlen und nichtalphanumerische 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 mithilfe des Befehls az group create eine Ressourcengruppe.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
Erstellen Sie einen flexiblen PostgreSQL-Server mit dem Befehl az postgres flexible-server create . (Diese und nachfolgende Befehle verwenden das Zeilenfortsetzungszeichen für Bash Shell ('\'). Ändern Sie das Zeilenfortsetzungszeichen für andere Shells.)
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 \ --public-access 0.0.0.0
Der Sku-Name ist der Name der Preisstufe und Der Berechnungskonfiguration. Weitere Informationen finden Sie unter Azure Database for PostgreSQL – Preise. Verwenden Sie
az postgres flexible-server list-skus --location $LOCATION
zum Auflisten der verfügbaren SKUs .Fügen Sie Ihr Azure-Konto als Microsoft Entra-Administrator für den Server hinzu, und führen Sie den Befehl "az postgres flexible-server ad-admin create " aus.
ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv) ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv) echo $ACCOUNT_EMAIL, $ACCOUNT_ID az postgres flexible-server ad-admin create \ --resource-group $RESOURCE_GROUP_NAME \ --server-name $DB_SERVER_NAME \ --display-name $ACCOUNT_EMAIL \ --object-id $ACCOUNT_ID \ --type User
Konfigurieren Sie eine Firewallregel auf Ihrem Server mit dem Befehl "az postgres flexible-server firewall-rule create ". Diese Regel ermöglicht den Zugriff auf Ihre lokale Umgebung, um eine Verbindung mit dem Server herzustellen. (Wenn Sie die Azure Cloud Shell verwenden, 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, das Ihre IP-Adresse anzeigt, um den Befehl zu ersetzen
<your IP>
. Sie können z. B. die Website "Meine IP-Adresse" verwenden.Erstellen Sie eine Datenbank
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;'
Erstellen eines Azure-App Diensts und Bereitstellen des Codes
Führen Sie diese Befehle im Stammordner der Beispiel-App aus, um einen App-Dienst zu erstellen und den Code dafür bereitzustellen.
Erstellen Sie einen App-Dienst mit dem Befehl "az webapp up ".
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, Arbeitsspeicher) und kosten des App Service-Plans. Der B1(Basic)-Serviceplan verursacht in Ihrem Azure-Abonnement eine geringe Kosten. Eine vollständige Liste der App Service-Pläne finden Sie auf der Seite App Service – Preise.
Konfigurieren Sie den App-Dienst so, dass der start.sh im Beispiel-Repository mit dem Befehl "az webapp config set" verwendet wird.
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Erstellen eines Speicherkontos und Containers
Die Beispiel-App speichert Fotos, die von Prüfern als Blobs in Azure Storage übermittelt werden.
Wenn ein Benutzer ein Foto mit seiner Überprüfung sendet, schreibt die Beispiel-App das Bild mithilfe der verwalteten Identität in den Container und
DefaultAzureCredential
um auf das Speicherkonto zuzugreifen.Wenn ein Benutzer die Rezensionen für ein Restaurant anzeigt, gibt die App einen Link zu dem Foto im BLOB-Speicher für jede Rezension zurück, die einem zugeordnet ist. Damit der Browser das Foto anzeigen kann, muss es in Ihrem Speicherkonto darauf zugreifen können. Die BLOB-Daten müssen für das öffentliche Lesen über anonymen (nicht authentifizierten) Zugriff verfügbar sein.
In diesem Abschnitt erstellen Sie ein Speicherkonto und einen Container, der öffentlichen Lesezugriff auf Blobs im Container zulässt. In späteren Abschnitten erstellen Sie eine vom Benutzer zugewiesene verwaltete Identität und konfigurieren sie so, dass Blobs in das Speicherkonto geschrieben werden.
Verwenden Sie den Befehl "az storage create " zum Erstellen eines Speicherkontos.
STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID" az storage account create \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --sku Standard_LRS \ --allow-blob-public-access true
Erstellen Sie einen Container namens "Fotos " im Speicherkonto mit dem Befehl "az storage container create ".
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --auth-mode login
Hinweis
Wenn der Befehl fehlschlägt, z. B. wenn Sie einen Fehler erhalten, der angibt, dass die Anforderung möglicherweise durch Netzwerkregeln des Speicherkontos blockiert wird, geben Sie den folgenden Befehl ein, um sicherzustellen, dass Ihrem Azure-Benutzerkonto eine Azure-Rolle mit der Berechtigung zum Erstellen eines Containers zugewiesen ist.
az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
Weitere Informationen finden Sie in der Schnellstartanleitung: Erstellen, Herunterladen und Auflisten von Blobs mit Azure CLI. Beachten Sie, dass Sie mit mehreren Azure-Rollen Container in einem Speicherkonto erstellen können, einschließlich "Owner", "Contributor", "Storage Blob Data Owner" und "Storage Blob Data Contributor".
Erstellen einer benutzerseitig zugewiesenen verwalteten Identität
Erstellen Sie eine vom Benutzer zugewiesene verwaltete Identität, und weisen Sie sie dem App-Dienst zu. Die verwaltete Identität wird verwendet, um auf das Datenbank- und Speicherkonto zuzugreifen.
Verwenden Sie den Befehl "az identity create ", um eine vom Benutzer zugewiesene verwaltete Identität zu erstellen und die Client-ID zur späteren Verwendung in eine Variable auszugeben.
UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv) echo $UA_CLIENT_ID
Verwenden Sie den Befehl "az account show ", um Ihre Abonnement-ID abzurufen und in eine Variable auszugeben, die zum Erstellen der Ressourcen-ID der verwalteten Identität verwendet werden kann.
SUBSCRIPTION_ID=$(az account show --query id --output tsv) RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME" echo $RESOURCE_ID
Weisen Sie die verwaltete Identität dem App-Dienst mit dem Az webapp Identity Assign-Befehl zu .
export MSYS_NO_PATHCONV=1 az webapp identity assign \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --identities $RESOURCE_ID
Erstellen Sie App Service-App-Einstellungen, die die Client-ID der verwalteten Identität und andere Konfigurationsinformationen enthalten, mit dem Befehl "az webapp config appsettings set ".
az webapp config appsettings set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \ STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \ STORAGE_CONTAINER_NAME=photos \ DBHOST=$DB_SERVER_NAME \ DBNAME=restaurant \ DBUSER=$UA_NAME
Die Beispiel-App verwendet Umgebungsvariablen (App-Einstellungen), um Verbindungsinformationen für das Datenbank- und Speicherkonto zu definieren, diese Variablen enthalten jedoch keine Kennwörter. Stattdessen erfolgt die Authentifizierung ohne Kennwort.DefaultAzureCredential
Der Beispiel-App-Code verwendet den DefaultAzureCredential
Klassenkonstruktor, ohne die vom Benutzer zugewiesene verwaltete Identitätsclient-ID an den Konstruktor zu übergeben. In diesem Szenario wird als Fallback die AZURE_CLIENT_ID Umgebungsvariable überprüft, die Sie als App-Einstellung festlegen.
Wenn die umgebungsvariable AZURE_CLIENT_ID nicht vorhanden ist, wird die vom System zugewiesene verwaltete Identität verwendet, wenn sie konfiguriert ist. Weitere Informationen finden Sie unter "Einführung in DefaultAzureCredential".
Erstellen von Rollen für die verwaltete Identität
In diesem Abschnitt erstellen Sie Rollenzuweisungen für die verwaltete Identität, um den Zugriff auf das Speicherkonto und die Datenbank zu ermöglichen.
Erstellen Sie eine Rollenzuweisung für die verwaltete Identität, um den Zugriff auf das Speicherkonto mit dem Befehl "az role assignment create " zu ermöglichen.
export MSYS_NO_PATHCONV=1 az role assignment create \ --assignee $UA_CLIENT_ID \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
Der Befehl gibt den Bereich der Rollenzuweisung für die Ressourcengruppe an. Weitere Informationen finden Sie unter "Grundlegendes zu Rollenzuweisungen".
Verwenden Sie den Befehl "az postgres flexible-server execute ", um eine Verbindung mit der Postgres-Datenbank herzustellen und dieselben Befehle auszuführen, um der verwalteten Identität Rollen zuzuweisen.
ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ACCOUNT_EMAIL \ --admin-password $ACCOUNT_EMAIL_TOKEN \ --database-name postgres \ --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
Wenn Sie Probleme beim Ausführen des Befehls haben, stellen Sie sicher, dass Sie Ihr Benutzerkonto als Microsoft Entra-Administrator für den PosgreSQL-Server hinzugefügt haben und dass Sie zugriff auf Ihre IP-Adresse in den Firewallregeln haben. Weitere Informationen finden Sie im Abschnitt Erstellen eines flexiblen Azure PostgreSQL-Servers.
Testen der Python-Web-App in Azure
Die Python-Beispiel-App verwendet das Azure.Identity-Paket und dessen DefaultAzureCredential
Klasse. Wenn die App in Azure ausgeführt wird, wird automatisch erkannt, DefaultAzureCredential
ob eine verwaltete Identität für den App-Dienst vorhanden ist und in diesem Fall verwendet wird, um auf andere Azure-Ressourcen zuzugreifen (Speicher und PostgreSQL in diesem Fall). Es ist nicht erforderlich, Speicherschlüssel, Zertifikate oder Anmeldeinformationen für den App-Dienst bereitzustellen, um auf diese Ressourcen zuzugreifen.
Navigieren Sie zur bereitgestellten Anwendung unter der URL
http://$APP_SERVICE_NAME.azurewebsites.net
.Es kann eine oder zwei Minuten dauern, bis die App gestartet wird. Wenn eine Standard-App-Seite angezeigt wird, die nicht die Standardmäßige Beispiel-App-Seite 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 für das Restaurant hinzufügen.
Das Restaurant und die Überprüfungsinformationen werden in der Azure-Datenbank für PostgreSQL gespeichert, und die Fotos werden in Azure Storage gespeichert. Hier ist ein Beispielfoto:
Bereinigung
In diesem Lernprogramm wurden alle Azure-Ressourcen in derselben Ressourcengruppe erstellt. Durch das Entfernen der Ressourcengruppe wird der Befehl "az group delete " entfernt, alle Ressourcen in der Ressourcengruppe und ist die schnellste Möglichkeit, alle azure-Ressourcen zu entfernen, die für Ihre App verwendet werden.
az group delete --name $RESOURCE_GROUP_NAME
Sie können optional das Argument --no-wait
hinzufügen, damit für den Befehl die Rückgabe erfolgen kann, bevor der Vorgang abgeschlossen ist.
Nächste Schritte
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für