Skapa och distribuera en Flask Python-webbapp till Azure med systemtilldelad hanterad identitet
I den här självstudien distribuerar du Python Flask-kod för att skapa och distribuera en webbapp som körs i Azure App Service. Webbappen använder sin systemtilldelade hanterade identitet (lösenordslösa anslutningar) med rollbaserad åtkomstkontroll i Azure för åtkomst till Azure Storage och Azure Database for PostgreSQL – flexibla serverresurser. Koden använder klassen DefaultAzureCredential i Azure Identity-klientbiblioteket för Python. Klassen DefaultAzureCredential
identifierar automatiskt att det finns en hanterad identitet för App Service och använder den för att komma åt andra Azure-resurser.
Du kan konfigurera lösenordslösa anslutningar till Azure-tjänster med hjälp av Service Connector eller så kan du konfigurera dem manuellt. Den här självstudien visar hur du använder Service Connector. Mer information om lösenordslösa anslutningar finns i Lösenordslösa anslutningar för Azure-tjänster. Information om Service Connector finns i dokumentationen för Service Connector.
Den här självstudien visar hur du skapar och distribuerar en Python-webbapp med hjälp av Azure CLI. Kommandona i den här självstudien skrivs för att köras i ett Bash-gränssnitt. Du kan köra självstudiekommandona i valfri Bash-miljö med CLI installerat, till exempel din lokala miljö eller Azure Cloud Shell. Med viss ändring – till exempel inställning och användning av miljövariabler – kan du köra dessa kommandon i andra miljöer som Windows-kommandogränssnittet. Exempel på hur du använder en användartilldelad hanterad identitet finns i Skapa och distribuera en Django-webbapp till Azure med en användartilldelad hanterad identitet.
Hämta exempelappen
Det finns ett Python-exempelprogram med Flask-ramverket som hjälper dig att följa med i den här självstudien. Ladda ned eller klona ett av exempelprogrammen till din lokala arbetsstation.
Klona exemplet i en Azure Cloud Shell-session.
git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
Gå till programmappen.
cd msdocs-flask-web-app-managed-identity
Granska autentiseringskoden
Exempelwebbappen måste autentisera till två olika datalager:
- Azure Blob Storage-server där den lagrar och hämtar foton som skickats av granskare.
- En Azure Database for PostgreSQL – flexibel serverdatabas där den lagrar restauranger och recensioner.
Den använder DefaultAzureCredential för att autentisera till båda datalager. Med DefaultAzureCredential
kan appen konfigureras att köras under identiteten för olika tjänsthuvudnamn, beroende på vilken miljö den körs i, utan att göra ändringar i koden. I en lokal utvecklingsmiljö kan appen till exempel köras under identiteten hos utvecklaren som är inloggad i Azure CLI, medan den i Azure, som i den här självstudien, kan köras under sin systemtilldelade hanterade identitet.
I båda fallen måste säkerhetsobjektet som appen körs under ha en roll för varje Azure-resurs som appen använder som gör att den kan utföra åtgärderna på den resurs som appen kräver. I den här självstudien använder du tjänstanslutningsprogram för att automatiskt aktivera den systemtilldelade hanterade identiteten i din app i Azure och tilldela den identiteten lämpliga roller på ditt Azure Storage-konto och Azure Database for PostgreSQL-server.
När den systemtilldelade hanterade identiteten har aktiverats och tilldelats lämpliga roller i datalager kan du använda DefaultAzureCredential
för att autentisera med nödvändiga Azure-resurser.
Följande kod används för att skapa en bloblagringsklient för att ladda upp foton i app.py
. En instans av DefaultAzureCredential
levereras till klienten, som den använder för att hämta åtkomsttoken för att utföra åtgärder mot Azure Storage.
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)
En instans av DefaultAzureCredential
används också för att hämta en åtkomsttoken för Azure Database for PostgreSQL i ./azureproject/get_conn.py
. I det här fallet hämtas token direkt genom att anropa get_token på autentiseringsuppgiftsinstansen och skicka rätt värde till den scope
. Token används sedan i stället för lösenordet i PostgreSQL-anslutnings-URI:n som returneras till anroparen.
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)
Mer information om hur du autentiserar dina appar med Azure-tjänster finns i Autentisera Python-appar till Azure-tjänster med hjälp av Azure SDK för Python. Mer information om DefaultAzureCredential
, inklusive hur du anpassar autentiseringskedjan som utvärderas för din miljö, finns i Översikt över DefaultAzureCredential.
Skapa en Azure PostgreSQL-server
Konfigurera de miljövariabler som behövs för självstudien.
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"
Viktigt!
ADMIN_PW
Måste innehålla mellan 8 och 128 tecken från tre av följande kategorier: engelska versaler, engelska gemener, siffror och icke-numeriska tecken. När du skapar användarnamn eller lösenord använder$
du inte tecknet. Senare skapar du miljövariabler med dessa värden där$
tecknet har särskild betydelse i Linux-containern som används för att köra Python-appar.Skapa en resursgrupp med kommandot az group create.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
Skapa en PostgreSQL-server med kommandot az postgres flexible-server create . (Detta och efterföljande kommandon använder radfortsättningstecknet för Bash Shell ('\'). Ändra radfortsättningstecknet för gränssnittet om det behövs.)
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
SKU-namnet är namnet på prisnivån och beräkningskonfigurationen. Mer information finns i Priser för Azure Database for PostgreSQL. Om du vill visa en lista över tillgängliga SKU:er använder du
az postgres flexible-server list-skus --location $LOCATION
.Skapa en databas med namnet
restaurant
med kommandot 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;'
Skapa en Azure App Service och distribuera koden
Skapa en apptjänst med kommandot az webapp up .
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1
SKU :n definierar storleken (CPU, minne) och kostnaden för App Service-planen. B1-tjänstplanen (Basic) medför en liten kostnad i din Azure-prenumeration. En fullständig lista över App Service-planer finns på sidan med priser för App Service.
Konfigurera App Service för att använda start.sh i lagringsplatsen med kommandot az webapp config set.
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Skapa lösenordslösa anslutningsappar till Azure-resurser
Kommandona för Service Connector konfigurerar Azure Storage- och Azure Database for PostgreSQL-resurser för att använda hanterad identitet och rollbaserad åtkomstkontroll i Azure. Kommandona skapar appinställningar i App Service som ansluter din webbapp till dessa resurser. Utdata från kommandona visar de åtgärder för tjänstanslutning som vidtagits för att aktivera lösenordslös kapacitet.
Lägg till en PostgreSQL-tjänstanslutning med kommandot az webapp connection create postgres-flexible . Den systemtilldelade hanterade identiteten används för att autentisera webbappen till målresursen PostgreSQL i det här fallet.
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
Lägg till en anslutningsapp för lagringstjänsten med kommandot az webapp connection create storage-blob .
Det här kommandot lägger också till ett lagringskonto och lägger till webbappen med rollen Storage Blob Data Contributor i lagringskontot.
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))
Skapa en container i lagringskontot
Python-exempelappen lagrar foton som skickats av granskare som blobar i en container i ditt lagringskonto.
När en användare skickar ett foto med sin granskning skriver exempelappen avbildningen till containern med hjälp av dess systemtilldelade hanterade identitet för autentisering och auktorisering. Du konfigurerade den här funktionen i det sista avsnittet.
När en användare visar recensionerna för en restaurang returnerar appen en länk till fotot i Blob Storage för varje granskning som har en associerad med den. För att webbläsaren ska kunna visa fotot måste det kunna komma åt det i ditt lagringskonto. Blobdata måste vara tillgängliga för att kunna läsas offentligt via anonym (oautentiserad) åtkomst.
För att förbättra säkerheten skapas lagringskonton med anonym åtkomst till blobdata inaktiverade som standard. I det här avsnittet aktiverar du anonym läsåtkomst på ditt lagringskonto och skapar sedan en container med namnet foton som ger offentlig (anonym) åtkomst till dess blobar.
Uppdatera lagringskontot för att tillåta anonym läsåtkomst till blobar med kommandot az storage account update .
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --allow-blob-public-access true
Aktivering av anonym åtkomst på lagringskontot påverkar inte åtkomsten för enskilda blobar. Du måste uttryckligen aktivera offentlig åtkomst till blobar på containernivå.
Skapa en container med namnet foton i lagringskontot med kommandot az storage container create . Tillåt anonym läsåtkomst (offentlig) till blobar i den nyligen skapade containern.
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)
Kommentar
I korthet använder det här kommandot lagringskontonyckeln för att auktorisera med lagringskontot. I de flesta scenarier är Microsofts rekommenderade metod att använda rollerna Microsoft Entra ID och Azure (RBAC). En snabb uppsättning instruktioner finns i Snabbstart: Skapa, ladda ned och lista blobar med Azure CLI. Observera att flera Azure-roller gör att du kan skapa containrar i ett lagringskonto, inklusive "Ägare", "Deltagare", "Storage Blob Data Owner" och "Storage Blob Data Contributor".
Mer information om anonym läsåtkomst till blobdata finns i Konfigurera anonym läsåtkomst för containrar och blobar.
Testa Python-webbappen i Azure
Python-exempelappen använder azure.identity-paketet och dess DefaultAzureCredential
klass. När appen körs i Azure DefaultAzureCredential
identifierar automatiskt om det finns en hanterad identitet för App Service och i så fall använder den den för att komma åt andra Azure-resurser (lagring och PostgreSQL i det här fallet). Du behöver inte ange lagringsnycklar, certifikat eller autentiseringsuppgifter till App Service för att få åtkomst till dessa resurser.
Bläddra till det distribuerade programmet på URL:en
http://$APP_SERVICE_NAME.azurewebsites.net
.Det kan ta en minut eller två innan appen startas. Om du ser en standardappsida som inte är standardexempelappsidan väntar du en minut och uppdaterar webbläsaren.
Testa funktionerna i exempelappen genom att lägga till en restaurang och några recensioner med foton för restaurangen.
Restaurangen och granskningsinformationen lagras i Azure Database for PostgreSQL och fotona lagras i Azure Storage. Här är ett exempel på skärmbild:
Rensa
I den här självstudien skapades alla Azure-resurser i samma resursgrupp. Om du tar bort resursgruppen tas alla resurser i resursgruppen bort med kommandot az group delete och det snabbaste sättet att ta bort alla Azure-resurser som används för din app.
az group delete --name $RESOURCE_GROUP_NAME
Du kan också lägga till --no-wait
argumentet så att kommandot kan returneras innan åtgärden har slutförts.