Erstellen und Bereitstellen einer Flask Python-Web-App in Azure mit vom System zugewiesener verwalteter Identität

In diesem Lernprogramm stellen Sie Python Flask-Code bereit, um eine Web-App zu erstellen und bereitzustellen, die in Azure-App Service ausgeführt wird. Die Web-App verwendet die vom System zugewiesene verwaltete Identität (kennwortlose Verbindungen) mit rollenbasierter 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.

Sie können kennwortlose Verbindungen mit Azure-Diensten mithilfe von Service Verbinden or konfigurieren oder manuell konfigurieren. In diesem Lernprogramm wird gezeigt, wie Sie service Verbinden or verwenden. Weitere Informationen zu kennwortlosen Verbindungen finden Sie unter Kennwortlose Verbindungen für Azure-Dienste. Informationen zu Service Verbinden or finden Sie in der Service Verbinden or-Dokumentation.

In diesem Lernprogramm erfahren Sie, wie Sie eine Python-Web-App mithilfe der Azure CLI erstellen und bereitstellen. 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. Beispiele für die Verwendung einer vom Benutzer zugewiesenen verwalteten Identität finden Sie unter Erstellen und Bereitstellen einer Django-Web-App in Azure mit einer vom Benutzer zugewiesenen verwalteten Identität.

Abrufen der Beispiel-App

Eine Python-Beispielanwendung mit dem Flask-Framework steht Zur Verfügung, die Sie zusammen mit diesem Lernprogramm unterstützen kann. Laden Sie eine der Beispielanwendungen auf Ihre lokale Arbeitsstation herunter, oder klonen Sie sie.

  1. Klonen Sie das Beispiel in einer Azure Cloud Shell-Sitzung.

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

    cd msdocs-flask-web-app-managed-identity
    

Erstellen eines 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"
    

    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 PostgreSQL-Server mit dem befehl "az postgres flexible-server create ". (Diese und nachfolgende Befehle verwenden das Zeilenfortsetzungszeichen für Bash Shell ('\'). Ändern Sie bei Bedarf das Zeilenfortsetzungszeichen für die Shell.)

    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
    

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

  1. Erstellen Sie einen App-Dienst mit dem Befehl "az webapp up ".

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

    Die Sku definiert die Größe (CPU, Arbeitsspeicher) und kosten des App-Serviceplans. 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 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 kennwortloser Connectors für Azure-Ressourcen

Die Befehle "Service Verbinden or" konfigurieren Azure Storage und Azure-Datenbank für PostgreSQL-Ressourcen für die Verwendung der verwalteten Identität und der rollenbasierten Zugriffssteuerung von Azure. Die Befehle erstellen App-Einstellungen im App-Dienst, die Ihre Web-App mit diesen Ressourcen verbinden. Die Ausgabe aus den Befehlen listet die Aktionen des Dienstconnectors auf, die ausgeführt werden, um die kennwortlose Funktion zu aktivieren.

  1. Fügen Sie einen PostgreSQL-Dienstconnector mit der az webapp-Verbindung hinzu, um einen postgres-flexiblen Befehl zu erstellen. Die vom System 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
    
  2. Fügen Sie einen Speicherdienstconnector mit der az webapp-Verbindung hinzu, um speicher-blob-Befehl zu erstellen.

    Mit diesem Befehl wird auch ein Speicherkonto hinzugefügt und die Web-App mit Rollen "Storage Blob Data Contributor " zum Speicherkonto hinzugefügt.

    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))
    

Erstellen eines Containers im Speicherkonto

Die Python-Beispiel-App speichert Fotos, die von Prüfern als Blobs in einem Container in Ihrem Speicherkonto übermittelt werden.

  • Wenn ein Benutzer ein Foto mit seiner Überprüfung sendet, schreibt die Beispiel-App das Bild mithilfe der vom System zugewiesenen verwalteten Identität für die Authentifizierung und Autorisierung in den Container. Sie haben diese Funktionalität im letzten Abschnitt konfiguriert.

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

Um die Sicherheit zu verbessern, werden Speicherkonten standardmäßig mit anonymen Zugriff auf BLOB-Daten erstellt. In diesem Abschnitt aktivieren Sie anonymen Lesezugriff auf Ihr Speicherkonto und erstellen dann einen Container namens Fotos , der öffentlichen (anonymen) Zugriff auf seine BLOBs bietet.

  1. Aktualisieren Sie das Speicherkonto, um anonymen Lesezugriff auf Blobs mit dem Befehl "az storage account update" zu ermöglichen.

    az storage account update \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --allow-blob-public-access true
    

    Das Aktivieren des anonymen Zugriffs auf das Speicherkonto wirkt sich nicht auf den Zugriff für einzelne Blobs aus. Sie müssen den öffentlichen Zugriff auf Blobs auf Containerebene explizit aktivieren.

  2. Erstellen Sie einen Container namens "Fotos " im Speicherkonto mit dem Befehl "az storage container create ". Anonymen Lesezugriff (öffentlich) auf Blobs im neu erstellten Container zulassen.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \
          --query [0].value --output tsv) 
    

    Hinweis

    Aus Platzgründen verwendet dieser Befehl den Speicherkontoschlüssel, um mit dem Speicherkonto zu autorisieren. Für die meisten Szenarien empfiehlt sich der empfohlene Ansatz von Microsoft darin, Microsoft Entra-ID- und Azure-Rollen (RBAC) zu verwenden. Eine kurze Reihe von Anweisungen 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".

Weitere Informationen zum anonymen Lesezugriff auf Blobdaten finden Sie unter Konfigurieren des anonymen Lesezugriffs für Container und Blobs.

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