Een Django-app met SQL Server implementeren in Azure App Service

In dit artikel wordt uitgelegd hoe u een Django-toepassing implementeert die gebruikmaakt van de mssql-django back-end voor Azure App Service, waaronder configuratie van ODBC-stuurprogramma's, geheimen op basis van omgevingen en verificatie van beheerde identiteiten.

Prerequisites

  • Een Azure-abonnement
  • Een Azure SQL Database- of SQL Server exemplaar dat toegankelijk is vanuit Azure
  • Een Django-project geconfigureerd met mssql-django
  • Azure CLI geïnstalleerd

ODBC-stuurprogramma op Azure App Service

Azure App Service Linux-exemplaren bevatten het Microsoft ODBC-stuurprogramma voor SQL Server. U kunt de geïnstalleerde stuurprogrammaversie controleren door het volgende uit te voeren:

az webapp ssh --resource-group <your-rg> --name <your-app>
odbcinst -j

Note

Azure App Service bevat doorgaans ODBC-stuurprogramma 17 en/of 18 vooraf geïnstalleerd op Linux-abonnementen. Windows-app Service-abonnementen bevatten ook het ODBC-stuurprogramma.

Omgevingsvariabelen gebruiken voor geheimen

Codeer databasereferenties niet in settings.py. Gebruik omgevingsvariabelen en configureer deze als App Service-toepassingsinstellingen:

import os

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": os.environ.get("DB_NAME", "<your-database>"),
        "USER": os.environ.get("DB_USER", ""),
        "PASSWORD": os.environ.get("DB_PASSWORD", ""),
        "HOST": os.environ.get("DB_HOST", "<your-server>.database.windows.net"),
        "PORT": os.environ.get("DB_PORT", "1433"),
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

Tip

Voor vereiste waarden, zoals DB_NAME en DB_HOST, kunt u overwegen (zonder standaardinstelling) te gebruiken os.environ["DB_NAME"] , zodat de toepassing onmiddellijk mislukt met een duidelijke KeyError status als de omgevingsvariabele ontbreekt.

Stel de omgevingsvariabelen in Azure App Service in:

az webapp config appsettings set \
    --resource-group <your-rg> \
    --name <your-app> \
    --settings DB_NAME=<your-database> DB_HOST=<your-server>.database.windows.net DB_USER=<your-username> DB_PASSWORD=<your-password>

Gebruik verificatie van beheerde identiteit

Gebruik voor productie-implementaties beheerde identiteit om te voorkomen dat referenties worden opgeslagen. Door het systeem toegewezen beheerde identiteit inschakelen in uw App Service:

az webapp identity assign --resource-group <your-rg> --name <your-app>

Geef de beheerde identiteit toegang tot uw Azure SQL-database:

CREATE USER [<your-app-name>] FOR EXTERNAL PROVIDER;

ALTER ROLE db_datareader ADD MEMBER [<your-app-name>];
ALTER ROLE db_datawriter ADD MEMBER [<your-app-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<your-app-name>];

Note

Verdeel alleen de rollen die uw toepassing nodig heeft. De db_ddladmin vaste databaserol is alleen vereist als de toepassing migraties uitvoert. Voor workloads met alleen-leestoegang is db_datareader voldoende.

Als uw server is geconfigureerd voor alleen Microsoft Entra-verificatie, mislukt FROM EXTERNAL PROVIDER met Msg 33130 omdat de server Microsoft Graph niet kan bereiken om de naam van de identiteit om te zetten. Maak de gebruiker handmatig met CREATE USER [<your-app-name>] WITH SID = 0x<sid-hex>, TYPE = E, waarbij <sid-hex> is afgeleid van de toepassings-id (client) van de beheerde identiteit, niet van de object-id. Zie De identiteitstoegang verlenen in Azure SQL voor de conversiestappen.

Configureren settings.py voor het gebruik van beheerde identiteit:

import os

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": os.environ.get("DB_NAME", "<your-database>"),
        "HOST": os.environ.get("DB_HOST", "<your-server>.database.windows.net"),
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": "Authentication=ActiveDirectoryMsi",
        },
    },
}

Toegangstokens gebruiken met ManagedIdentityCredential

U kunt ook de TOKEN instelling gebruiken met azure.identity:

Waarschuwing

De TOKEN waarde wordt eenmaal opgehaald bij het opstarten van het proces en verloopt na 60-90 minuten. Gebruik deze methode alleen voor langlopende App Service-implementaties als u ook vernieuwingslogica voor tokens of recycling van kortstondige werknemers implementeert. Als het directe ActiveDirectoryMsi patroon in uw omgeving werkt, voorkomt dit het opstarttijdtokenprobleem.

import os
from azure.identity import ManagedIdentityCredential

credential = ManagedIdentityCredential()
token = credential.get_token("https://database.windows.net/.default").token

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": os.environ.get("DB_NAME", "<your-database>"),
        "HOST": os.environ.get("DB_HOST", "<your-server>.database.windows.net"),
        "PORT": "1433",
        "TOKEN": token,
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

Tip

DefaultAzureCredentialis handig voor het ontwikkelen en gedeelde codebases, omdat er automatisch meerdere referentietypen worden geprobeerd, dus dezelfde code werkt op een laptop, in CI en in Azure. Elk referentietype dat niet van toepassing is, voegt echter enkele seconden time-out toe, waardoor het opstarten wordt vertraagd. Omdat App Service altijd beheerde identiteit beschikbaar heeft, ManagedIdentityCredential wordt deze onmiddellijk zonder de testketen geverifieerd. Installeer azure-identity het bestand met vereisten: pip install azure-identity.

Migraties uitvoeren tijdens de implementatie

Voeg een script na de implementatie of opstartopdracht toe om migraties automatisch uit te voeren:

az webapp config set \
    --resource-group <your-rg> \
    --name <your-app> \
    --startup-file "python manage.py migrate && gunicorn myproject.wsgi"

Statische bestanden verzamelen

Statische bestandsafhandeling configureren voor productie:

STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")

Uitvoeren collectstatic als onderdeel van uw implementatie:

python manage.py collectstatic --noinput

Uitrollen naar App Service

App Service kan een Django-app op twee manieren hosten:

  • Ingebouwde installatiekopie van Linux Python: App Service bouwt uw code op basis van de bron en biedt de Python runtime.
  • Aangepaste Docker-installatiekopieën: u bouwt de installatiekopieën zelf en verwijst ernaar vanuit een containerregister.

Beide paden kunnen een door het systeem toegewezen beheerde identiteit gebruiken om te verifiëren bij Azure SQL, maar het recept verschilt. Kies het tabblad dat overeenkomt met uw implementatie.

Met de ingebouwde Linux Python-image installeert de Oryx-builder van App Service automatisch requirements.txt en start uw Django-app onder gunicorn. De lokale HTTP-proxy voor beheerde identiteit zorgt ervoor dat Authentication=ActiveDirectoryMsi rechtstreeks vanuit de ODBC-verbindingsreeks werkt. Gebruik de settings.py die wordt weergegeven in Verificatie met beheerde identiteit gebruiken.

Implementeer uw code met az webapp up, schakel door het systeem toegewezen beheerde identiteit in en stel de omgevingsvariabelen voor de database in:

az webapp up \
    --resource-group <your-rg> \
    --name <your-app> \
    --runtime "PYTHON:3.12" \
    --sku B1

az webapp identity assign --resource-group <your-rg> --name <your-app>

az webapp config appsettings set \
    --resource-group <your-rg> \
    --name <your-app> \
    --settings DB_NAME=<your-database> DB_HOST=<your-server>.database.windows.net

Verleen vervolgens de beheerde identiteit toegang tot SQL, zoals beschreven in Authenticatie met beheerde identiteit gebruiken.

Lokale ontwikkeling met Docker Compose

Gebruik Docker Compose om uw Django-app naast een SQL Server-container uit te voeren voor lokale ontwikkeling en testen:

# docker-compose.yml
services:
  db:
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      ACCEPT_EULA: "Y"
      MSSQL_SA_PASSWORD: "<password>"  # Must meet SQL Server complexity requirements
    ports:
      - "1433:1433"

  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      DB_HOST: db
      DB_NAME: mydb
      DB_USER: sa
      DB_PASSWORD: "<password>"
    depends_on:
      - db

Tip

De SQL Server-container maakt geen toepassingsdatabases automatisch. Nadat u de containers hebt gestart, maakt u de database en voert u migraties uit:

docker compose exec db /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "<password>" -No -Q "CREATE DATABASE mydb"
docker compose exec web python manage.py migrate

Voor de SQL Server-containerinstallatiekopie zijn ACCEPT_EULA=Y en een sterk SA-wachtwoord vereist. Gebruik voor productieomgevingen Azure SQL Database met beheerde identiteit in plaats van SQL Server referenties. Zie Verificatie van beheerde identiteiten gebruiken.