Delen 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
    

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 een door de gebruiker 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 Azure CLI-opdrachten om een door de gebruiker toegewezen beheerde identiteit te maken en deze toe te wijzen aan uw app in Azure. Vervolgens wijst u die identiteit handmatig toe aan uw Azure-opslagaccount en azure Database for PostgreSQL-server. Ten slotte stelt u de AZURE_CLIENT_ID omgevingsvariabele voor uw app in Azure in om te configureren DefaultAzureCredential voor het gebruik van de beheerde identiteit.

Nadat de door de gebruiker toegewezen beheerde identiteit is geconfigureerd in uw app en de runtime-omgeving en de juiste rollen in de gegevensarchieven is toegewezen, kunt u deze gebruiken DefaultAzureCredential om te verifiëren met de vereiste Azure-resources.

De volgende code wordt gebruikt om een blob-opslagclient te maken om foto's te uploaden in ./restaurant_review/views.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 om het wachtwoord in te stellen in de PostgreSQL-verbindings-URI.

azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conf.settings.DATABASES['default']['PASSWORD'] = 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 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 is de terugval om te controleren op de AZURE_CLIENT_ID omgevingsvariabele die u instelt als een app-instelling.

Als de AZURE_CLIENT_ID omgevingsvariabele 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, moet u ervoor zorgen dat u uw gebruikersaccount hebt toegevoegd als Microsoft Entra-beheerder voor de PosgreSQL-server en dat 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