Nasazení aplikace Django s SQL Server do Azure App Service

Tento článek vysvětluje, jak nasadit aplikaci Django, která používá mssql-django back-end k Azure App Service, včetně konfigurace ovladače ODBC, tajných kódů založených na prostředí a ověřování spravované identity.

Prerequisites

  • Předplatné Azure
  • Instance služby Azure SQL Database nebo SQL Serveru dostupná z Azure
  • Projekt Django nakonfigurovaný pomocí mssql-django
  • Nainstalované rozhraní Azure CLI

Ovladač ODBC na Azure App Service

Azure App Service instance Linuxu zahrnují ovladač MICROSOFT ODBC pro SQL Server. Nainstalovanou verzi ovladače můžete ověřit spuštěním následujícího příkazu:

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

Note

Azure App Service obvykle zahrnuje ovladač ODBC 17 a/nebo 18 předinstalovaný v plánech Linuxu. Plány služby App Service ve Windows také zahrnují ovladač ODBC.

Použití proměnných prostředí pro tajné kódy

Nezakódujte přihlašovací údaje databáze v settings.pysouboru . Použijte proměnné prostředí a nakonfigurujte je v nastavení aplikace služby App Service:

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

U požadovaných hodnot, jako jsou DB_NAME a DB_HOST, zvažte použití os.environ["DB_NAME"] (bez výchozí hodnoty), aby aplikace při chybějící proměnné prostředí okamžitě selhala s jasnou chybou KeyError.

Nastavte proměnné prostředí v Azure App Service:

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>

Použijte ověřování pomocí spravované identity

Pro produkční nasazení použijte spravovanou identitu, abyste se vyhnuli ukládání přihlašovacích údajů. Povolte spravovanou identitu přiřazenou systémem ve službě App Service:

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

Udělte spravované identitě přístup k vaší databázi Azure SQL:

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

Udělte pouze role, které vaše aplikace potřebuje. Db_ddladmin pevná role databáze se vyžaduje jenom v případě, že aplikace spouští migrace. Pro úlohy jen pro čtení je db_datareader dostačující.

Pokud je váš server nakonfigurovaný pro ověřování pouze pomocí Microsoft Entra, FROM EXTERNAL PROVIDER selže s chybou Msg 33130, protože server nemůže kontaktovat Microsoft Graph, aby přeložil název identity. Vytvořte uživatele ručně pomocí CREATE USER [<your-app-name>] WITH SID = 0x<sid-hex>, TYPE = E, kde <sid-hex> je odvozen z ID aplikace spravované identity (klienta), nikoli jeho ID objektu. Postup převodu najdete v tématu Udělení přístupu k identitě v Azure SQL.

Nakonfigurujte settings.py pro použití spravované identity:

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",
        },
    },
}

Použití přístupových tokenů s využitím ManagedIdentityCredential

Případně použijte nastavení TOKEN společně s azure.identity:

Caution

Hodnota TOKEN se načte jednou při spuštění procesu a vyprší po 60 až 90 minutách. U dlouhotrvajících nasazení služby App Service použijte tento přístup pouze v případě, že implementujete také logiku aktualizace tokenu nebo krátkodobou recyklaci pracovních procesů. Pokud ve vašem prostředí funguje přímý vzor ActiveDirectoryMsi, vyhnete se problému s tokenem při spuštění.

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

DefaultAzureCredentialje vhodný pro vývoj a sdílené základy kódu, protože zkouší více typů přihlašovacích údajů automaticky, takže stejný kód funguje na přenosném počítači, v CI a v Azure. Každý typ přihlašovacích údajů, který nelze použít, však přidává několik sekund zpoždění, což zpomaluje spouštění. Vzhledem k tomu, že služba App Service má vždy k dispozici spravovanou identitu, ManagedIdentityCredential ověřuje se okamžitě bez řetězu testů. Nainstalujte azure-identity do souboru s požadavky: pip install azure-identity.

Spouštění migrací během nasazení

Přidejte skript po nasazení nebo spouštěcí příkaz pro automatické spouštění migrací:

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

Shromažďování statických souborů

Konfigurace zpracování statických souborů pro produkční prostředí:

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

Spusťte collectstatic jako součást nasazení:

python manage.py collectstatic --noinput

Nasazení do služby App Service

App Service může hostovat aplikaci Django dvěma způsoby:

  • Integrovaná image Python Linuxu: App Service sestaví kód ze zdroje a poskytuje modul runtime Python.
  • Vlastní image Dockeru: image si sestavíte sami a odkážete na ni v registru kontejnerů.

Obě cesty můžou použít spravovanou identitu přiřazenou systémem k ověření v Azure SQL, ale recept se liší. Vyberte kartu, která odpovídá vašemu nasazení.

S předem připravenou imagí Linuxu s Pythonem nástroj Oryx Builder služby App Service automaticky nainstaluje requirements.txt a spustí vaši aplikaci Django pod gunicorn. Místní HTTP proxy pro spravovanou identitu umožňuje, aby Authentication=ActiveDirectoryMsi fungovalo přímo v rámci připojovacího řetězce ODBC. Použijte settings.py, jak je uvedeno v části Použití ověřování pomocí spravované identity.

Nasaďte kód pomocí az webapp up, povolte spravovanou identitu přiřazenou systémem a nastavte proměnné prostředí databáze:

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

Potom udělte spravované identitě přístup v SQL, jak je popsáno v tématu Použití ověřování spravované identity.

Místní vývoj s využitím Docker Compose

Pro místní vývoj a testování použijte Docker Compose ke spuštění aplikace Django společně s kontejnerem SQL Server:

# 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

Kontejner SQL Server nevytvoří databáze aplikací automaticky. Po spuštění kontejnerů vytvořte databázi a spusťte migrace:

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

Image kontejneru SQL Server vyžaduje ACCEPT_EULA=Y a silné heslo SA. V produkčních prostředích místo přihlašovacích údajů SQL Server použijte Azure SQL Database se spravovanou identitou. Viz Použití ověřování spravované identity.