Delen via


Een Flask Python-web-app maken en implementeren in Azure met door het systeem toegewezen beheerde identiteit

In deze tutorial zet je Python Flask-code in om een web-app te maken en te implementeren die draait op Azure App Service. De web-app maakt gebruik van zijn systeemtoegewezen beheerde identiteit (wachtwoordloze verbindingen) met Azure rolgebaseerd toegangsbeheer om toegang te krijgen tot Azure Storage en Azure Database for PostgreSQL - Flexible Server resources. De code maakt gebruik van de class DefaultAzureCredential van de Azure Identity-clientbibliotheek voor Python. De DefaultAzureCredential klasse detecteert automatisch dat er een beheerde identiteit bestaat voor de App Service en gebruikt deze om andere Azure-resources te benaderen.

U kunt verbindingen zonder wachtwoord met Azure-services configureren met behulp van Service Connector of u kunt ze handmatig configureren. Deze zelfstudie laat zien hoe u Service Connector gebruikt. Voor meer informatie over wachtwoordloze verbindingen, zie Wachtwoordloze verbindingen voor Azure-services. Zie de documentatie voor Service Connector voor meer informatie over Service Connector.

Deze zelfstudie laat zien hoe u een Python-web-app maakt en implementeert met behulp van de Azure CLI. Voer de opdrachten in deze zelfstudie uit in een Bash-omgeving waarop de Azure CLI is geïnstalleerd, zoals uw lokale omgeving of Azure Cloud Shell.

Zie voor voorbeelden van het gebruik van een door de gebruiker toegewezen beheerde identiteit, Een Django-web-app maken en implementeren in Azure met een door de gebruiker toegewezen beheerde identiteit.

De voorbeeld-app downloaden

Er is een Python-voorbeeldtoepassing beschikbaar die gebruikmaakt van het Flask-framework om u te helpen bij het volgen van deze zelfstudie. Download of kloon een van de voorbeeldtoepassingen naar uw lokale werkstation.

  1. Kloon het voorbeeld in een Azure Cloud Shell-sessie.

    git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
    
  2. Navigeer naar de toepassingsmap.

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

Verificatiecode onderzoeken

De voorbeeldweb-app moet worden geverifieerd bij twee verschillende gegevensarchieven:

  • Azure Blob Storage-server waarin foto's worden opgeslagen en opgehaald die door beoordelaars zijn ingediend.
  • Een Azure Database for PostgreSQL - een Flexible Server-database waarin restaurants en beoordelingen worden opgeslagen.

Het maakt gebruik van DefaultAzureCredential om te authenticeren bij beide gegevensopslag. Met DefaultAzureCredential, kan de app worden geconfigureerd om onder verschillende service-principals te draaien, afhankelijk van de omgeving waarin het draait, zonder wijzigingen in de code aan te brengen. In een lokale ontwikkelomgeving kan de app bijvoorbeeld worden uitgevoerd onder de identiteit van de ontwikkelaar die is aangemeld bij de Azure CLI, terwijl deze in Azure, zoals in deze zelfstudie, kan worden uitgevoerd onder de door het systeem toegewezen beheerde identiteit.

In beide gevallen moet de beveiligingsprincipaal waaronder de app wordt uitgevoerd, een rol hebben voor elke Azure-resource die de app gebruikt, zodat deze de acties kan uitvoeren op de resource die de app nodig heeft. In deze zelfstudie gebruikt u serviceconnectors om automatisch de door het systeem toegewezen beheerde identiteit in te schakelen in uw app in Azure en om die identiteit geschikte rollen toe te wijzen aan uw Azure-opslagaccount en Azure Database for PostgreSQL-server.

Nadat de door het systeem toegewezen beheerde identiteit is ingeschakeld en de juiste rollen voor de gegevensarchieven zijn toegewezen, kunt u DefaultAzureCredential gebruiken om te verifiëren bij de vereiste Azure-resources.

De volgende code wordt gebruikt om een blob-opslagclient te maken om foto's te uploaden in app.py. Er wordt een exemplaar van DefaultAzureCredential aan de client geleverd, waarmee toegangstokens worden verkregen voor het uitvoeren van bewerkingen op 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)

Er wordt ook een exemplaar gebruikt DefaultAzureCredential om een toegangstoken op te halen voor Azure Database for PostgreSQL in ./azureproject/get_conn.py. In dit geval wordt het token rechtstreeks verkregen door get_token aan te roepen op het referentie-exemplaar en het de juiste scope waarde mee te geven. Het token wordt vervolgens gebruikt op de plaats van het wachtwoord in de PostgreSQL-verbindings-URI die wordt geretourneerd aan de aanroeper.

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)

Zie Python-apps authenticeren bij Azure-services met behulp van de Azure SDK voor Python voor meer informatie over het authenticeren van uw apps met Azure-services. Zie het overzicht defaultAzureCredential voor meer informatie over DefaultAzureCredentialhet aanpassen van de referentieketen die wordt geëvalueerd voor uw omgeving.

Een Azure PostgreSQL-server maken

  1. Stel de omgevingsvariabelen in die nodig zijn voor de zelfstudie.

    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"
    

    Belangrijk

    De ADMIN_PW moet 8 tot 128 tekens bevatten uit drie van de volgende categorieën: Engelse hoofdletters, Engelse kleine letters, cijfers en niet-alfanumerieke tekens. Gebruik geen teken bij het maken van gebruikersnamen of wachtwoorden. Later maakt u omgevingsvariabelen met deze waarden, waarbij het $-teken een speciale betekenis heeft in de Linux-container die wordt gebruikt om Python-apps uit te voeren.

  2. Een resourcegroep maken met de opdracht az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Maak een PostgreSQL-server met de az postgres flexible-server create-opdracht. (Deze en volgende opdrachten gebruiken het regelvervolgteken voor Bash Shell ('\'). Wijzig indien nodig het regelvervolgteken voor de 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
    

    De sku-name is de naam van de prijscategorie en de rekenconfiguratie. Zie Prijzen voor Azure Database for PostgreSQL voor meer informatie. Als u beschikbare SKU's wilt weergeven, gebruikt u az postgres flexible-server list-skus --location $LOCATION.

  4. Maak een database genaamd restaurant met behulp van het commando 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;'
    

Een Azure-app-service maken en de code implementeren

  1. Maak een app-service aan met de opdracht az webapp up.

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

    De SKU definieert de grootte (CPU, geheugen) en de kosten van het app-serviceplan. Voor het B1-serviceplan (Basic) worden kleine kosten in uw Azure-abonnement in rekening gebracht. Voor een volledige lijst met App Service-abonnementen, bekijk de pagina 'App Service-prijzen'.

  2. Configureer App Service om de start.sh in de repo te gebruiken met het az webapp config set-commando.

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

Wachtwoordloze connectors maken voor Azure-resources

De serviceconnector-opdrachten configureren Azure Storage- en Azure Database for PostgreSQL-resources voor het gebruik van beheerde identiteiten en op rollen gebaseerd toegangsbeheer van Azure. De opdrachten maken app-instellingen in de App Service die uw web-app verbinden met deze resources. De uitvoer van de opdrachten bevat de acties van de serviceconnector die zijn uitgevoerd om de mogelijkheid zonder wachtwoord in te schakelen.

  1. Voeg een PostgreSQL-service connector toe met de commando az webapp connection create postgres-flexible. In dit geval wordt de door het systeem toegewezen beheerde identiteit gebruikt om de web-app te verifiëren bij de doelresource, 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. Voeg een opslagservice-koppeling toe met het commando az webapp connection create storage-blob.

    Met deze opdracht wordt ook een opslagaccount toegevoegd en wordt de web-app met de rol Storage Blob Data Contributor toegevoegd aan het opslagaccount.

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

Een container maken in het opslagaccount

In de Python-voorbeeld-app worden foto's die door recensenten worden ingediend als blobs opgeslagen in een container binnen uw opslagaccount.

  • Wanneer een gebruiker een foto indient met de beoordeling, schrijft de voorbeeld-app de afbeelding naar de container met behulp van de door het systeem toegewezen beheerde identiteit voor authenticatie en autorisatie. U hebt deze functionaliteit in de laatste sectie geconfigureerd.

  • Wanneer een gebruiker de beoordelingen voor een restaurant bekijkt, retourneert de app een koppeling naar de foto in blobopslag voor elke beoordeling waaraan een beoordeling is gekoppeld. Als u de foto wilt weergeven in de browser, moet deze toegang hebben tot de foto in uw opslagaccount. De blobgegevens moeten beschikbaar zijn voor openbaar lezen via anonieme (niet-geverifieerde) toegang.

Om de beveiliging te verbeteren, worden opslagaccounts gemaakt met anonieme toegang tot blobgegevens die standaard zijn uitgeschakeld. In deze sectie schakelt u anonieme leestoegang in voor uw opslagaccount en maakt u vervolgens een container met de naam foto's die openbare (anonieme) toegang biedt tot de blobs.

  1. Werk het opslagaccount bij om anonieme leestoegang tot blobs toe te staan met de opdracht az storage account update .

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

    Het inschakelen van anonieme toegang voor het opslagaccount heeft geen invloed op de toegang voor afzonderlijke blobs. U moet openbare toegang tot blobs expliciet inschakelen op containerniveau.

  2. Maak een container genaamd foto's in het opslagaccount met het commando az storage container create. Anonieme leestoegang (openbaar) tot blobs in de zojuist gemaakte container toestaan.

    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) 
    

    Notitie

    Voor kortheid gebruikt deze opdracht de opslagaccount-sleutel om zich bij het opslagaccount te autoriseren. Voor de meeste scenario's raadt Microsoft aan om Microsoft Entra ID en Azure (RBAC)-rollen te gebruiken. Voor een snelle set instructies, zie Quickstart: Blobs maken, downloaden en opsommen met Azure CLI. Met verschillende Azure-rollen kunt u containers maken in een opslagaccount, waaronder 'Eigenaar', 'Inzender', 'Eigenaar van opslagblobgegevens' en 'Inzender voor opslagblobgegevens'.

Zie Anonieme leestoegang configureren voor containers en blobs voor meer informatie over anonieme leestoegang tot blobgegevens.

De Python-web-app testen in Azure

De voorbeeld-Python-app maakt gebruik van het pakket azure.identity en zijn DefaultAzureCredential klasse. Wanneer de app wordt uitgevoerd in Azure, detecteert DefaultAzureCredential automatisch of er een beheerde identiteit bestaat voor de App Service en, als dat het geval is, gebruikt deze om toegang te krijgen tot andere Azure-resources (opslag en PostgreSQL in dit geval). U hoeft geen opslagsleutels, certificaten of referenties voor de App Service op te geven voor toegang tot deze resources.

  1. Blader naar de geïmplementeerde toepassing op de URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Het kan een paar minuten duren voordat de app is gestart. Als u een standaard-app-pagina ziet die niet de standaardpagina van de voorbeeld-app is, wacht u even en vernieuwt u de browser.

  2. Test de functionaliteit van de voorbeeld-app door een restaurant en enkele beoordelingen met foto's voor het restaurant toe te voegen.

    Het restaurant en de controlegegevens worden opgeslagen in Azure Database for PostgreSQL en de foto's worden opgeslagen in Azure Storage. Hier volgt een voorbeeldschermopname:

    Schermopname van de voorbeeld-app die de restaurantbeoordelingsfunctionaliteit laat zien met behulp van Azure App Service, Azure PostgreSQL Database en Azure Storage.

Opschonen

In deze handleiding zijn alle Azure-resources gemaakt in dezelfde resourcegroep. Door de opdracht az group delete uit te voeren, worden alle resources in de resourcegroep verwijderd. Dit is de snelste manier om alle Azure-resources te verwijderen die voor uw app worden gebruikt.

az group delete  --name $RESOURCE_GROUP_NAME 

U kunt desgewenst het --no-wait argument toevoegen zodat de opdracht kan terugkeren voordat de bewerking is voltooid.

Volgende stappen