Delen via


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

In deze zelfstudie implementeert u Python Flask-code om een web-app te maken en te implementeren die wordt uitgevoerd in Azure-app Service. De web-app maakt gebruik van de door het systeem toegewezen beheerde identiteit (wachtwoordloze verbindingen) met op rollen gebaseerd toegangsbeheer van Azure voor toegang tot Azure Storage- en Azure Database for PostgreSQL - Flexible Server-resources. De code maakt gebruik van de klasse 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 toegang te krijgen tot andere Azure-resources.

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. Zie wachtwoordloze verbindingen voor Azure-services voor meer informatie over verbindingen zonder wachtwoord. Zie de documentatie voor serviceconnector voor meer informatie over Service Connector.

In deze zelfstudie leert u hoe u een Python-web-app maakt en implementeert met behulp van de Azure CLI. De opdrachten in deze zelfstudie worden geschreven om te worden uitgevoerd in een Bash-shell. U kunt de zelfstudieopdrachten uitvoeren in elke Bash-omgeving waarop de CLI is geïnstalleerd, zoals uw lokale omgeving of Azure Cloud Shell. Met enkele aanpassingen, bijvoorbeeld het instellen en gebruiken van omgevingsvariabelen, kunt u deze opdrachten uitvoeren in andere omgevingen, zoals Windows-opdrachtshell. Zie Een Django-web-app maken en implementeren in Azure met een door de gebruiker toegewezen beheerde identiteit voor voorbeelden van het gebruik van 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 zijn ingediend door revisoren.
  • Een Azure Database for PostgreSQL - Flexible Server-database waarin restaurants en beoordelingen worden opgeslagen.

Het maakt gebruik van DefaultAzureCredential om te verifiëren bij beide gegevensarchieven. Hiermee DefaultAzureCredentialkan de app worden geconfigureerd om te worden uitgevoerd onder de identiteit van verschillende service-principals, afhankelijk van de omgeving waarin de app wordt uitgevoerd, zonder wijzigingen aan te brengen in code. 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 zich verifiëren DefaultAzureCredential met 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, dat wordt gebruikt om toegangstokens te verkrijgen om bewerkingen uit te voeren 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 deze door te geven aan de juiste scope waarde. 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 verifiëren bij Azure-services met behulp van de Azure SDK voor Python voor Python voor meer informatie over het verifiëren 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 naam moet 8 tot 128 tekens bevatten uit drie van de volgende categorieën: Nederlandse hoofdletters, Nederlandse kleine letters, cijfers en niet-phanumerische tekens. Bij het maken van gebruikersnamen of wachtwoorden wordt het $ teken niet gebruikt. 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 opdracht az postgres flexible-server create . (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-naam is de naam van de prijscategorie en 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 met de naam restaurant az postgres flexible-server execute command.

    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 met behulp van 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 Service-plan. Voor het B1-serviceplan (Basic) worden kleine kosten in uw Azure-abonnement in rekening gebracht. Bekijk de pagina met App Service-prijzen voor een volledige lijst met App Service-abonnementen.

  2. Configureer App Service voor het gebruik van de start.sh in de opslagplaats met de opdracht az webapp config set .

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

Connectors zonder wachtwoord 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-serviceconnector toe met de opdracht 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 opslagserviceconnector toe met de opdracht az webapp connection create storage-blob .

    Met deze opdracht wordt ook een opslagaccount toegevoegd en wordt de web-app toegevoegd met rol Inzender voor opslagblobgegevens 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 opgeslagen die door revisoren als blobs worden verzonden in een container in uw opslagaccount.

  • Wanneer een gebruiker een foto verzendt met de beoordeling, schrijft de voorbeeld-app de installatiekopieën naar de container met behulp van de door het systeem toegewezen beheerde identiteit voor verificatie 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 met de naam foto's in het opslagaccount met de opdracht 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 sleutel van het opslagaccount om het opslagaccount te autoriseren. Voor de meeste scenario's is de aanbevolen benadering van Microsoft om Rollen voor Microsoft Entra ID en Azure (RBAC) te gebruiken. Zie quickstart: Blobs maken, downloaden en vermelden met Azure CLI voor een snelle set instructies. Houd er rekening mee dat u met verschillende Azure-rollen containers kunt 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 Python-voorbeeld-app maakt gebruik van het pakket azure.identity en de DefaultAzureCredential bijbehorende klasse. Wanneer de app wordt uitgevoerd in Azure, DefaultAzureCredential detecteert u automatisch of er een beheerde identiteit bestaat voor de App Service. Als dat het geval is, wordt deze gebruikt voor toegang 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 met de functionaliteit van restaurantbeoordeling met behulp van Azure-app Service, Azure PostgreSQL Database en Azure Storage.

Opschonen

In deze zelfstudie zijn alle Azure-resources gemaakt in dezelfde resourcegroep. Als u de resourcegroep verwijdert, worden met de opdracht az group delete alle resources in de resourcegroep verwijderd en is dit 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 worden geretourneerd voordat de bewerking is voltooid.

Volgende stappen