Freigeben über


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

In diesem Tutorial stellen Sie Python Flask Code bereit, um eine Web-App zu erstellen und im Azure App Service bereitzustellen. Die Web-App verwendet ihre vom System zugewiesene verwaltete Identität (passwortlose Verbindungen) mit rollenbasierter Zugriffssteuerung von Azure für den Zugriff auf Azure Storage und Azure Datenbank for PostgreSQL - Flexible Server Ressourcen. Der Code verwendet die DefaultAzureCredential- Klasse der Azure Identity Client-Bibliothek für Python. Die DefaultAzureCredential-Klasse erkennt automatisch, dass eine verwaltete Identität für den App Service existiert und verwendet diese für den Zugriff auf andere Azure Ressourcen.

Sie können passwortlose Verbindungen zu Azure Services mit Hilfe des Konnektors konfigurieren, oder Sie können sie manuell konfigurieren. Dieses Tutorial zeigt Ihnen, wie Sie den Dienst Connector verwenden. Weitere Informationen über passwortlose Verbindungen finden Sie unter Passwortlose Verbindungen für Azure Services. Informationen über Dienst Connector finden Sie in der Dienst Connector Dokumentation.

Dieses Tutorial zeigt Ihnen, wie Sie eine Python Web-App mit Hilfe des Azure CLI erstellen und bereitstellen. Die Befehle in diesem Tutorial sind so geschrieben, dass sie in einer Bash-Shell ausgeführt werden können. Sie können die Befehle des Tutorials in jeder Bash-Umgebung ausführen, in der das CLI installiert ist, wie z. B. in Ihrer lokalen Umgebung oder in der Azure Cloud Shell. Mit einigen Modifikationen - z. B. dem Festlegen und Verwenden von Umgebungsvariablen - können Sie diese Befehle auch in anderen Umgebungen wie der Windows Command Shell ausführen. Beispiele für die Verwendung einer vom Benutzer zugewiesenen verwalteten Identität finden Sie unter Erstellen und Bereitstellen einer Django Web-App auf Azure mit einer vom Benutzer zugewiesenen verwalteten Identität.

Abrufen der Beispiel-App

Eine Python-Beispielanwendung, die das Flask Framework verwendet, ist verfügbar, damit Sie diesem Tutorial folgen können. 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 zu dem Anwendungsordner.

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

Untersuchen Sie den Code für die Authentifizierung

Die Beispiel-Web-App muss sich bei zwei verschiedenen Datenspeichern authentifizieren:

  • Azure Blob Storage Server, auf dem sie die von den Prüfern gesendeten Fotos speichert und abruft.
  • Eine Azure Datenbank for PostgreSQL - Flexible Server Datenbank, in der sie Restaurants und Bewertungen speichert.

Sie verwendet DefaultAzureCredential, um sich bei beiden Datenspeichern zu authentifizieren. Mit DefaultAzureCredential kann die App so konfiguriert werden, dass sie je nach Umgebung, in der sie ausgeführt wird, unter der Identität verschiedener Dienstprinzipale ausgeführt wird, ohne dass Änderungen am Code vorgenommen werden müssen. In einer lokalen Entwicklungsumgebung kann die App beispielsweise unter der Identität des Entwicklers ausgeführt werden, der am Azure CLI angemeldet ist, während sie in Azure, wie in diesem Tutorial, unter der vom System zugewiesenen verwalteten Identität ausgeführt werden kann.

In beiden Fällen muss das Sicherheitsprinzipal, unter dem die App ausgeführt wird, über eine Rolle für jede von der App verwendete Azure-Ressource verfügen, die es ihr erlaubt, die von der App benötigten Aktionen auf der Ressource durchzuführen. In diesem Tutorial verwenden Sie Dienst-Konnektoren, um die vom System zugewiesene verwaltete Identität auf Ihrer App in Azure automatisch zu aktivieren und dieser Identität entsprechende Rollen auf Ihrem Azure Storage-Konto und Azure Datenbank for PostgreSQL Server zuzuweisen.

Nachdem die vom System zugewiesene verwaltete Identität aktiviert ist und ihr die entsprechenden Rollen auf den Datenspeichern zugewiesen wurden, können Sie DefaultAzureCredential verwenden, um sich bei den erforderlichen Ressourcen auf Azure zu authentifizieren.

Der folgende Code wird verwendet, um einen Blob-Storage Client zum Hochladen von Fotos in app.py zu erstellen. Dem Client wird eine Instanz von DefaultAzureCredential zur Verfügung gestellt, über die er Zugriffstoken erhält, um Vorgänge gegen Azure Storage durchzuführen.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
    account_url=account_url,
    credential=azure_credential)

Eine Instanz von DefaultAzureCredential wird auch verwendet, um einen Zugriffstoken für die Azure Datenbank for PostgreSQL in ./azureproject/get_conn.py zu erhalten. In diesem Fall wird das Token direkt erworben, indem Sie get_token auf der Anmeldeinformation-Instanz aufrufen und den entsprechenden scope-Wert übergeben. Das Token wird dann anstelle des Kennworts in der an den Aufrufer zurückgegebenen PostgreSQL-Verbindungs-URI verwendet.

azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)

Mehr über die Authentifizierung Ihrer Apps bei Azure Services erfahren Sie unter Authentifizierung von Python-Apps bei Azure Services mit dem Azure SDK für Python. Um mehr über DefaultAzureCredential zu erfahren, einschließlich der Anpassung der Anmeldeinformationen, die für Ihre Umgebung ausgewertet werden, siehe DefaultAzureCredential Übersicht.

Erstellen Sie einen Azure PostgreSQL Server

  1. Legen Sie die Umgebungsvariablen fest, die Sie für das Tutorial benötigen.

    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

    Die ADMIN_PW muss 8 bis 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 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. (Dieser und die folgenden Befehle verwenden das Zeilenfortsetzungszeichen für die Bash Shell („\“). Ändern Sie bei Bedarf das Zeilenfortsetzungszeichen für Ihre 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 Rechenkonfiguration. Weitere Informationen finden Sie unter Azure Database for PostgreSQL – Preise. Um die verfügbaren SKUs aufzulisten, verwenden Sie az postgres flexible-server list-skus --location $LOCATION.

  4. Erstellen Sie eine Datenbank namens 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;'
    

Azure App Service erstellen und den Code bereitstellen

  1. Erstellen Sie einen App Service 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, Speicher) und die Kosten für den App Service-Plan. Für den Plan B1 (Basic) fallen in Ihrem Azure-Abonnement geringe Kosten an. Eine vollständige Liste der App Service-Pläne finden Sie auf der Seite App Service – Preise.

  2. Konfigurieren Sie den App Service zur Verwendung der start.sh im Repo mit dem Befehl az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Erzeugen Sie passwortlose Konnektoren zu Azure Ressourcen

Die Befehle des Dienstes Konnektor konfigurieren die Ressourcen Azure Storage und Azure Datenbank for PostgreSQL für die Verwendung der verwalteten Identität und der rollenbasierten Zugriffssteuerung von Azure. Die Befehle erstellen App-Einstellungen im App Service, die Ihre Web-App mit diesen Ressourcen verbinden. Die Ausgabe der Befehle listet die Aktionen des Dienst-Konnektors auf, die zur Aktivierung der passwortlosen Funktionalität durchgeführt wurden.

  1. Fügen Sie einen PostgreSQL Dienst Konnektor mit dem Befehl az webapp connection create postgres-flexible hinzu. Die vom System zugewiesene verwaltete Identität wird verwendet, um die Web-App bei der Zielressource, in diesem Fall PostgreSQL, zu authentifizieren.

    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 mit dem Befehl az webapp connection create storage-blob einen Konnektor für den Storage-Dienst hinzu.

    Dieser Befehl fügt auch ein Storage-Konto hinzu und fügt die Web-App mit der Rolle Mitwirkender für Storage Blob-Daten zum Storage-Konto hinzu.

    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 beispielhafte Python App sendet Fotos als Blob in einem Container in Ihrem Storage-Konto.

  • Wenn ein Benutzer ein Foto mit seiner Rezension sendet, schreibt die Beispiel-App das Image in den Container und verwendet dabei die vom System zugewiesene verwaltete Identität zur Authentifizierung und Autorisierung. Sie haben diese Funktion im letzten Abschnitt konfiguriert.

  • Wenn ein Benutzer die Bewertungen für ein Restaurant anschaut, gibt die App für jede Bewertung, der ein Foto zugeordnet ist, einen Link zu dem Foto im Blob-Storage zurück. Damit der Browser das Foto anzeigen kann, muss er auf das Foto in Ihrem Storage-Konto zugreifen können. Die Blob-Daten müssen durch anonymen (nicht authentifizierten) Zugriff öffentlich zum Lesen verfügbar sein.

Um die Sicherheit zu erhöhen, werden Storage-Kontos erstellt, bei denen der anonyme Zugriff auf Blob-Daten standardmäßig deaktiviert ist. In diesem Abschnitt aktivieren Sie den anonymen Lesezugriff auf Ihr Storage-Konto und erstellen dann einen Container mit dem Namen photos, der öffentlichen (anonymen) Zugriff auf seine Blobs bietet.

  1. Aktualisieren Sie das Storage-Konto mit dem Befehl az storage account update, um anonymen Lesezugriff auf Blobs zuzulassen.

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

    Die Aktivierung des anonymen Zugriffs auf das Storage-Konto hat keinen Einfluss auf die Zugriffsmöglichkeit auf einzelne Blobs. Sie müssen den öffentlichen Zugriff auf Blobs auf der Ebene des Containers ausdrücklich erlauben.

  2. Erstellen Sie im Storage-Konto mit dem Befehl az storage container create einen Container namens photos. Anonymen (öffentlichen) Lesezugriff 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

    Der Einfachheit halber verwendet dieser Befehl den Schlüssel des Storage-Kontos zur Autorisierung mit dem Storage-Konto. Für die meisten Szenarien empfiehlt Microsoft die Verwendung von Microsoft Entra ID und Azure (RBAC) Rollen. Eine Kurzanleitung finden Sie unter Schnellstart: Erstellen, Herunterladen und Auflisten von Blobs mit Azure CLI. Beachten Sie, dass mehrere Azure-Rollen es Ihnen erlauben, Container in einem Storage-Konto zu erstellen, darunter „Besitzer“, „Mitwirkender“, „Storage Blob Data Besitzer“ und „Storage Blob Data Mitwirkender“.

Um mehr über den anonymen Lesezugriff auf Blob-Daten zu erfahren, siehe Anonymen Lesezugriff für Container und Blobs konfigurieren.

Python-Web-App in Azure testen

Die Beispiel-Python App verwendet das azure.identity-Paket und seine DefaultAzureCredential-Klasse. Wenn die App in Azure ausgeführt wird, erkennt DefaultAzureCredential automatisch, ob eine verwaltete Identität für den App Service vorhanden ist und verwendet diese gegebenenfalls für den Zugriff auf andere Azure Ressourcen (in diesem Fall Storage und PostgreSQL). Sie müssen dem App Service keine Storage-Schlüssel, Zertifikate oder Anmeldeinformationen zur Verfügung stellen, um auf diese Ressourcen zuzugreifen.

  1. Navigieren Sie zu der bereitgestellten Anwendung unter der URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Es kann ein oder zwei Minuten dauern, bis die App gestartet ist. Wenn Sie eine Standardseite der App sehen, die nicht die Standardseite der Beispielanwendung 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.

    Die Restaurant- und Bewertungsinformationen werden in Azure Datenbank for PostgreSQL gespeichert und die Fotos werden in Azure Storage gespeichert. Hier ist ein Beispiel-Screenshot:

    Screenshot der Beispiel-App, die die Restaurantbewertungsfunktionalität unter Verwendung von Azure App Service, Azure Datenbank for PostgreSQL und Azure Storage zeigt.

Bereinigung

In diesem Tutorial wurden alle Azure-Ressourcen in derselben Ressourcengruppe erstellt. Das Entfernen der Ressourcengruppe mit dem Befehl Az-Gruppe löschen entfernt alle Ressourcen in der Ressourcengruppe und ist der schnellste Weg, um alle für Ihre App verwendeten Azure-Ressourcen zu entfernen.

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