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 Anslut eller eller så kan du konfigurera dem manuellt. Den här självstudien visar hur du använder Service Anslut or. Mer information om lösenordslösa anslutningar finns i Lösenordslösa anslutningar för Azure-tjänster. Information om Service Anslut or finns i dokumentationen om Service Anslut or.

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.

  1. Klona exemplet i en Azure Cloud Shell-session.

    git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
    
  2. Gå till programmappen.

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

Skapa en Azure PostgreSQL-server

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

  2. Skapa en resursgrupp med kommandot az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. 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.

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

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

  2. 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 Tjänst Anslut eller 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.

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

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

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

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

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

    Skärmbild av exempelappen som visar funktioner för restauranggranskning med hjälp av Azure App Service, Azure PostgreSQL Database och Azure Storage.

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.

Nästa steg