Självstudie: Ansluta en Django-webbapp till Azure PostgreSQL med hjälp av Service Connector

I den här självstudien får du lära dig hur du distribuerar en datadriven webbapp i Python Django till Azure App Service och använder Service Connector för att ansluta den till andra Azure-tjänster. Exempelwebbappen lagrar restaurang- och recensioninformation i en Azure Database for PostgreSQL och lagrar foton i en Azure Storage-container.

Du använder Azure CLI för att utföra följande uppgifter:

Kommentar

Den här självstudien liknar App Service Distribuera en Python Django-webbapp med PostgreSQL i Azure, men använder en systemtilldelad lösenordslös hanterad identitet med rollbaserad åtkomstkontroll i Azure för att få åtkomst till andra Azure-resurser. Avsnittet Skapa en lösenordslös tjänstanslutning i den här artikeln visar hur Service Connector förenklar anslutningsprocessen.

Webbappen använder klassen DefaultAzureCredential för klientbiblioteket Python Azure Identity för att automatiskt identifiera när en hanterad identitet finns och använder den för att komma åt de andra resurserna.

Förutsättningar

  • En Azure-prenumeration med skriv- och rolltilldelningsbehörigheter för självstudieresurserna i en Azure region som supports Service Connector och har tillräckligt App Service-stöd och kvot.

  • Azure Cloud Shell för att genomföra handledningsstegen eller om du föredrar att köra lokalt:

    1. Installera Azure CLI 2.30.0 eller senare. Kontrollera din version genom att köra az --version. Om du vill uppgradera kör du az upgrade.
    2. Logga in på Azure med hjälp av az login och följ anvisningarna.

Konfigurera din miljö

  1. Kontrollera att din prenumeration är registrerad för att använda resursleverantörer Microsoft.ServiceLinker och Microsoft.DBforPostgreSQL. Annars kör du az provider register -n Microsoft.[name of service] för att registrera leverantörerna.

  2. Installera följande Azure CLI tillägg:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    

Klona exempelappen

  1. Klona exempelapplagringsplatsen.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    Du kan också ladda ned appen från https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless och packa upp den i en mapp med namnet serviceconnector-webapp-postgresql-django-passwordless.

  2. Ändra kataloger till lagringsplatsmappen med hjälp av cd serviceconnector-webapp-postgresql-django-passwordless och kör alla återstående kommandon från mappen.

I exempelappen finns inställningarna för webbappens produktion i filen azuresite/production.py . Utvecklingsinställningarna finns i azuresite/settings.py. Produktionsinställningarna konfigurerar Django att köras i alla produktionsmiljöer och är inte specifika för App Service.

Appen använder produktionsinställningar när WEBSITE_HOSTNAME miljövariabeln anges. För Azure Postgres-anslutningssträngar anger App Service automatiskt den här variabeln till URL:en för webbappen, till exempel https://msdocs-django.azurewebsites.net.

Mer information finns i checklistan för Django-distribution. Se även inställningar för Production för Django på Azure.

Definiera inledande miljövariabler

Följande kod definierar nödvändiga miljövariabler för den här handledningen.

  • LOCATION måste vara en Azure region där din prenumeration har tillräcklig kvot för att skapa resurserna och inte begränsar Azure Database for PostgreSQL för din prenumeration.
  • ADMIN_PW Måste innehålla mellan 8 och 128 tecken i minst tre av de fyra kategoriernas versaler, gemener, siffror och icke-numeriska tecken, exklusive $.
  1. Konfigurera följande miljövariabler och ersätt <region> platshållarna och <database password> med giltiga värden.

    LOCATION="<region>"
    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="<database password>"
    
  2. Skapa en resursgrupp som ska innehålla alla projektresurser. Resursgruppens namn cachelagras och tillämpas automatiskt på efterföljande kommandon.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Distribuera appkoden till App Service

Skapa appvärden i App Service och distribuera exempelappens kod till appvärden. Kommandot az webapp up utför följande åtgärder:

  • Skapar en App Service-plan på prisnivån Basic (B1).
  • Skapar App Service-appen.
  • Aktiverar standardloggning för appen.
  • Laddar upp lagringsplatsen med hjälp av ZIP-distribution med versionsautomation aktiverat.
  • Skapar appen.

I koden sku definierar cpu, minne och kostnad för App Service-planen. Tjänstplanen Basic (B1) medför en liten kostnad i din Azure-prenumeration. Du kan utelämna parametern --sku för att använda standard-SKU:n, vanligtvis P1v3 (Premium v3). En fullständig lista över App Service-planer finns i Priser för App Service.

  1. Kör följande kommando från mappen az webapp up:

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

    Kommentar

    Implementeringen tar några minuter och kommandot kan fastna eller överskrida tidsgränsen, särskilt på en Grundläggande SKU. När appen har skapats och utdata visas Starting the site kan du avsluta kommandot genom att välja Ctrl+C.

  2. Konfigurera appen så att den använder lagringsplatsen start.sh-filen genom att köra kommandot az webapp config set .

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

Skapa Postgres-databasen i Azure

Skapa Azure Database for PostgreSQL-databasen för att lagra appinformation. Kommandot az postgres flexible-server create skapar en Azure Database for PostgreSQL flexibel server i den angivna resursgruppen som har:

  • Servernamn som anges i parametern --name . Namnet måste vara unikt för alla Azure.
  • SKU som anges i parametern --sku-name .
  • Användarnamn och lösenord för administratörskonto som anges i parametrarna --admin-user och --admin-password .
  1. Skapa en Azure-databas för PostgreSQL-server. Om du uppmanas att aktivera åtkomst till den aktuella klientens IP-adress anger du y ja.

    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 \
      --microsoft-entra-auth Enabled
    
  2. Om du inte uppmanas att aktivera åtkomst till din aktuella klient-IP-adress konfigurerar du en brandväggsregel på servern med kommandot az postgres flexible-server firewall-rule create . Den här regeln ger din lokala miljö åtkomst till servern.

    IP_ADDRESS=<your IP address>
    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
    

    Tips/Råd

    Använd valfritt verktyg eller webbplats som visar din IP-adress för att ersätta <your IP address> i kommandot. Du kan till exempel använda Vad är min IP-adress?.

  3. Skapa en databas med namnet restaurant på servern 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 lösenordslös tjänstanslutning

Använd az webapp connection create postgres-flexible för att lägga till en tjänstekoppling som ansluter Azure-webbappen till Postgres-databasen med hjälp av lösenordsfri autentisering med hanterad identitet. Följande kommando konfigurerar Azure Database for PostgreSQL att använda hanterad identitet och Azure rollbaserad åtkomstkontroll. Kommandoutdata visar de åtgärder som Service Connector vidtar.

Kommandot skapar en miljövariabel med namnet AZURE_POSTGRESQL_CONNECTIONSTRING som tillhandahåller information om databasanslutningen för appen. Appkoden kommer åt appmiljövariabler med instruktioner som os.environ.get('AZURE_POSTGRESQL_HOST'). Mer information finns i Åtkomstmiljövariabler.

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

Skapa och ansluta till ett lagringskonto

Använd az webapp connection create storage-blob för att skapa ett Azure lagringskonto och en tjänstanslutning. Kommandot utför följande åtgärder:

  • Aktiverar systemtilldelad hanterad identitet i webbappen.
  • Lägger till webbappen med rollen Storage Blob Data Contributor till det nya lagringskontot.
  • Konfigurerar lagringskontots nätverk för att acceptera åtkomst från webbappen.
  • Skapar en miljövariabel med namnet AZURE_STORAGEBLOB_RESOURCEENDPOINT för Azure Storage-kontot.
  1. Kör följande kommando för att skapa lagringskontot och anslutningen:

    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))
    
  2. Uppdatera lagringskontot för att tillåta offentlig blobåtkomst för appanvändare att komma åt foton.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. Använd az storage container create för att skapa en container som heter photos i lagringskontot och tillåta anonym offentlig läsåtkomst till blobar i den nya containern.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

Testa Python-webbappen i Azure

Öppna och testa webbappen Azure Restaurant Review. Appen använder azure.identity-paketet och dess DefaultAzureCredential klass. När appen körs i Azure identifierar DefaultAzureCredential automatiskt när en hanterad identitet finns för App Service och använder den för att komma åt Azure Storage och Azure Database for PostgreSQL resurser. Appen behöver inte ange lagringsnycklar, certifikat eller autentiseringsuppgifter för att få åtkomst till dessa resurser.

  • För en lokal Azure CLI installation kan du använda az webapp browse för att öppna appen i standardwebbläsaren:

    az webapp browse --name $APP_SERVICE_NAME.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell kan inte öppna en lokal webbläsare, så den stöder inte kommandot az webapp browse. Från Cloud Shell är det enklaste sättet att öppna webbappen att välja Default-domän länk längst upp till höger på appens Azure portalsida.

Det kan ta en minut eller två innan appen startas. Om du ser en standardappsida som inte är exempelappen väntar du en minut och uppdaterar webbläsaren.

Testa funktionerna i exempelappen genom att lägga till en restaurang och några recensioner med foton. Appen bör likna följande skärmbild:

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

Rensa resurser

För att undvika löpande avgifter kan du ta bort de resurser som du skapade för den här självstudien genom att ta bort den resursgrupp som innehåller dem. Se till att du inte längre behöver appen eller resurserna innan du kör kommandot.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

Det kan ta lite tid att ta bort alla resurser. Argumentet --no-wait gör att kommandot kan returneras omedelbart.

Felsökning

Om du har problem med att köra den här handledningen kan du se följande resurser: