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.
Klonen Sie das Beispiel in einer Azure Cloud Shell-Sitzung.
git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
Navigieren Sie zum Anwendungsordner.
cd msdocs-flask-web-app-managed-identity
Erstellen eines 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"
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 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 $LOCATION
zum Auflisten der verfügbaren SKUs .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
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.
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.
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
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.
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.
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.
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.