Share via


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.

  1. Klonen Sie das Beispiel.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. Navigieren Sie zum Anwendungsordner.

    cd msdocs-django-web-app-managed-identity
    

Erstellen eines flexiblen Azure PostgreSQL-Servers

  1. 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.

  2. Erstellen Sie mithilfe des Befehls az group create eine Ressourcengruppe.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. 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 $LOCATIONzum Auflisten der verfügbaren SKUs .

  4. 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
    
  5. 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.

  6. 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.

  1. 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.

  2. 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.

  1. 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
    
  2. 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.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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.

  1. 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".

  2. 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.

  1. 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.

  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 Überprüfungsinformationen werden in der Azure-Datenbank für PostgreSQL gespeichert, und die Fotos werden in Azure Storage gespeichert. Hier ist ein Beispielfoto:

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

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