Share via


Een Django-web-app maken en implementeren in Azure met een door de gebruiker toegewezen beheerde identiteit

In deze zelfstudie implementeert u een Django-web-app in Azure-app Service. De web-app maakt gebruik van een door de gebruiker 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.

In deze zelfstudie maakt u een door de gebruiker toegewezen beheerde identiteit en wijst u deze toe aan de App Service, zodat deze toegang heeft tot de database- en opslagaccountbronnen. Zie Een Flask Python-web-app maken en implementeren in Azure met een door het systeem toegewezen beheerde identiteit voor een voorbeeld van het gebruik van een door het systeem toegewezen beheerde identiteit. Door de gebruiker toegewezen beheerde identiteiten worden aanbevolen omdat ze door meerdere resources kunnen worden gebruikt en hun levenscyclus wordt losgekoppeld van de resourcelevenscycli waaraan ze zijn gekoppeld. Zie aanbevelingen voor aanbevolen procedures voor beheerde identiteiten voor meer informatie over aanbevolen procedures voor beheerde identiteiten.

In deze zelfstudie leert u hoe u de Python-web-app implementeert en Azure-resources maakt 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.

De voorbeeld-app downloaden

Gebruik de voorbeeldtoepassing Django om samen met deze zelfstudie te volgen. Download of kloon de voorbeeldtoepassing naar uw ontwikkelomgeving.

  1. Kloon het voorbeeld.

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

    cd msdocs-django-web-app-managed-identity
    

Een flexibele 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"
    UA_NAME="UAManagedIdentityPythonTest$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 flexibele PostgreSQL-server met de opdracht az postgres flexible-server create . (Deze en volgende opdrachten gebruiken het regelvervolgteken voor Bash Shell ('\'). Wijzig het regelvervolgteken voor andere shells.)

    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 \
      --active-directory-auth Enabled \
      --public-access 0.0.0.0
    

    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. Voeg uw Azure-account toe als Microsoft Entra-beheerder voor de server met de opdracht az postgres flexible-server ad-admin create .

    ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv)
    ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv)
    echo $ACCOUNT_EMAIL, $ACCOUNT_ID
    az postgres flexible-server ad-admin create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --display-name $ACCOUNT_EMAIL \
      --object-id $ACCOUNT_ID \
      --type User
    
  5. Configureer een firewallregel op uw server met de opdracht az postgres flexible-server firewall-rule create . Met deze regel kan uw lokale omgeving verbinding maken met de server. (Als u de Azure Cloud Shell gebruikt, kunt u deze stap overslaan.)

    IP_ADDRESS=<your IP>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    Gebruik een hulpprogramma of website waarop uw IP-adres wordt weergegeven om in de opdracht te vervangen <your IP> . U kunt bijvoorbeeld de website What's My IP Address gebruiken .

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

Voer deze opdrachten uit in de hoofdmap van de voorbeeld-app om een App Service te maken en de code erin te implementeren.

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

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --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 voorbeeldopslagplaats met de opdracht az webapp config set .

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

Een opslagaccount en container maken

In de voorbeeld-app worden foto's opgeslagen die door revisoren als blobs worden verzonden in Azure Storage.

  • Wanneer een gebruiker een foto verzendt met de beoordeling, schrijft de voorbeeld-app de afbeelding naar de container met behulp van beheerde identiteit en DefaultAzureCredential voor toegang tot het opslagaccount.

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

In deze sectie maakt u een opslagaccount en container die openbare leestoegang tot blobs in de container toestaat. In latere secties maakt u een door de gebruiker toegewezen beheerde identiteit en configureert u deze om blobs naar het opslagaccount te schrijven.

  1. Gebruik de opdracht az storage create om een opslagaccount te maken.

    STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID"
    az storage account create \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --sku Standard_LRS \
      --allow-blob-public-access true
    
  2. Maak een container met de naam foto's in het opslagaccount met de opdracht az storage container create .

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    Notitie

    Als de opdracht mislukt, bijvoorbeeld als u een foutmelding krijgt die aangeeft dat de aanvraag mogelijk wordt geblokkeerd door netwerkregels van het opslagaccount, voert u de volgende opdracht in om ervoor te zorgen dat uw Azure-gebruikersaccount een Azure-rol met toestemming heeft toegewezen om een container te maken.

    az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
    

    Zie Quickstart: Blobs maken, downloaden en vermelden met Azure CLI voor meer informatie. 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'.

Een door de gebruiker toegewezen beheerde identiteit maken

Maak een door de gebruiker toegewezen beheerde identiteit en wijs deze toe aan de App Service. De beheerde identiteit wordt gebruikt voor toegang tot de database en het opslagaccount.

  1. Gebruik de opdracht az identity create om een door de gebruiker toegewezen beheerde identiteit te maken en de client-id uit te voeren naar een variabele voor later gebruik.

    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)
    echo $UA_CLIENT_ID
    
  2. Gebruik de opdracht az account show om uw abonnements-id op te halen en deze uit te voeren naar een variabele die kan worden gebruikt om de resource-id van de beheerde identiteit samen te stellen.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME"
    echo $RESOURCE_ID
    
  3. Wijs de beheerde identiteit toe aan de App Service met de opdracht az webapp identity assign .

    export MSYS_NO_PATHCONV=1
    az webapp identity assign \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $APP_SERVICE_NAME \
        --identities $RESOURCE_ID
    
  4. Maak App Service-app-instellingen die de client-id van de beheerde identiteit en andere configuratiegegevens bevatten met de opdracht az webapp config appsettings set .

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \
        STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \
        STORAGE_CONTAINER_NAME=photos \
        DBHOST=$DB_SERVER_NAME \
        DBNAME=restaurant \
        DBUSER=$UA_NAME
    

De voorbeeld-app maakt gebruik van omgevingsvariabelen (app-instellingen) om verbindingsgegevens voor de database en het opslagaccount te definiëren, maar deze variabelen bevatten geen wachtwoorden. In plaats daarvan wordt verificatie zonder wachtwoord uitgevoerd met DefaultAzureCredential.

De code van de voorbeeld-app maakt gebruik van de DefaultAzureCredential klasseconstructor zonder de door de gebruiker toegewezen client-id van de beheerde identiteit door te geven aan de constructor. In dit scenario moet u controleren op de omgevingsvariabele AZURE_CLIENT_ID die u instelt als app-instelling.

Als de omgevingsvariabele AZURE_CLIENT_ID niet bestaat, wordt de door het systeem toegewezen beheerde identiteit gebruikt als deze is geconfigureerd. Zie Inleiding tot DefaultAzureCredential voor meer informatie.

Rollen maken voor de beheerde identiteit

In deze sectie maakt u roltoewijzingen voor de beheerde identiteit om toegang tot het opslagaccount en de database in te schakelen.

  1. Maak een roltoewijzing voor de beheerde identiteit om toegang tot het opslagaccount in te schakelen met de opdracht az role assignment create .

    export MSYS_NO_PATHCONV=1
    az role assignment create \
    --assignee $UA_CLIENT_ID \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
    

    Met de opdracht geeft u het bereik van de roltoewijzing aan de resourcegroep op. Zie Roltoewijzingen begrijpen voor meer informatie.

  2. Gebruik de opdracht az postgres flexible-server execute om verbinding te maken met de Postgres-database en voer dezelfde opdrachten uit om rollen toe te wijzen aan de beheerde identiteit.

    ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ACCOUNT_EMAIL \
      --admin-password $ACCOUNT_EMAIL_TOKEN \
      --database-name postgres \
      --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
    

    Als u problemen ondervindt bij het uitvoeren van de opdracht, controleert u of u uw gebruikersaccount hebt toegevoegd als Microsoft Entra-beheerder voor de PosgreSQL-server en of u toegang hebt verleend tot uw IP-adres in de firewallregels. Zie de sectie Een flexibele Azure PostgreSQL-server maken voor meer informatie.

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