Django-alkalmazás üzembe helyezése SQL Serverrel az Azure App Service-ben

Ez a cikk bemutatja, hogyan helyezhet üzembe egy mssql-django backendet használó Django-alkalmazást az Azure App Service-ben, beleértve az ODBC-illesztőprogram konfigurálását, a környezeti változókban tárolt titkos kulcsokat és a felügyelt identitással történő hitelesítést.

Prerequisites

  • Azure-előfizetés
  • Azure-ből elérhető Azure SQL Database vagy SQL Server-példány
  • mssql-django-val konfigurált Django-projekt
  • Az Azure CLI telepítve lett

ODBC-illesztőprogram az Azure App Service-ben

Azure App Service Linux-példányok tartalmazzák a SQL Server Microsoft ODBC-illesztőprogramot. A telepített illesztőprogram-verziót a következő futtatásával ellenőrizheti:

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

Note

Azure App Service általában tartalmazza az ODBC Driver 17 és/vagy 18 előre telepített Linux-csomagokat. Windows-alkalmazás szolgáltatáscsomagok az ODBC-illesztőt is tartalmazzák.

Környezeti változók használata titkos kódokhoz

Ne kódolja az adatbázis hitelesítő adatait a fájlban settings.py. Használjon környezeti változókat, és konfigurálja őket App Service-alkalmazásbeállításokként:

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

Az olyan kötelező értékek esetén, mint a(z) DB_NAME és DB_HOST, érdemes a(z) os.environ["DB_NAME"] használni (alapértelmezett érték nélkül), hogy az alkalmazás azonnal leálljon egy egyértelmű KeyError üzenettel, ha a környezeti változó hiányzik.

A környezeti változók beállítása a 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>

Felügyelt identitáshitelesítés használata

Éles környezetben történő üzembe helyezésekhez használjon felügyelt identitást, hogy elkerülje a hitelesítő adatok tárolását. A rendszer által hozzárendelt felügyelt identitás engedélyezése az App Service-ben:

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

Adjon hozzáférést a felügyelt identitásnak a Azure SQL-adatbázishoz:

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

Csak az alkalmazás által igényelt szerepkörök megadása. A db_ddladmin rögzített adatbázis-szerepkör csak akkor szükséges, ha az alkalmazás áttelepítéseket futtat. Csak olvasási munkaterhelésekhez a db_datareader elegendő.

Ha a kiszolgáló csak Microsoft Entra-hitelesítésre van konfigurálva, a(z) FROM EXTERNAL PROVIDER a(z) Msg 33130 hibaüzenettel meghiúsul, mert a kiszolgáló nem tudja elérni a Microsoft Graphet az identitás nevének feloldásához. Hozza létre manuálisan a felhasználót a(z) CREATE USER [<your-app-name>] WITH SID = 0x<sid-hex>, TYPE = E használatával, ahol a(z) <sid-hex> a felügyelt identitás alkalmazás- (ügyfél-)azonosítójából, nem pedig az objektumazonosítójából származik. Az átalakítás lépéseit lásd: Identitáshozzáférés biztosítása Azure SQL.

Konfigurálja settings.py a felügyelt identitás használatára:

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

Hozzáférési jogkivonatok használata a ManagedIdentityCredential használatával

Alternatív megoldásként használja a(z) TOKEN beállítást a(z) azure.identity elemmel:

Caution

Az TOKEN érték a folyamat indításakor egyszer lesz lekérve, és 60–90 perc elteltével lejár. Hosszú ideig futó App Service-üzembe helyezések esetén csak akkor használja ezt a megközelítést, ha tokenfrissítési logikát vagy a feldolgozófolyamat rövid ciklusú újraindítását is megvalósítja. Ha a közvetlen ActiveDirectoryMsi minta működik az Ön környezetében, elkerülhető vele az indításkori tokennel kapcsolatos probléma.

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

DefaultAzureCredentiala fejlesztéshez és a megosztott kódbázisokhoz kényelmes, mert automatikusan több hitelesítőadat-típust próbál ki, így ugyanaz a kód működik laptopon, CI-ben és Azure. Azonban minden olyan hitelesítő adattípus, amely nem alkalmazható, több másodperces időtúllépést ad hozzá, ami lelassítja az indítást. Mivel az App Service mindig elérhető felügyelt identitással rendelkezik, ManagedIdentityCredential azonnal hitelesít a mintavételi lánc nélkül. Vegye fel a(z) azure-identity elemet a requirements fájlba: pip install azure-identity.

Migrációk futtatása telepítés közben

Az áttelepítések automatikus futtatásához adjon hozzá egy üzembe helyezés utáni szkriptet vagy indítási parancsot:

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

Statikus fájlok gyűjtése

Statikus fájlkezelés konfigurálása éles környezetben:

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

Futtassa collectstatic a telepítés részeként:

python manage.py collectstatic --noinput

Üzembe helyezés az App Service-ben

Az App Service kétféleképpen üzemeltethet Django-alkalmazást:

  • Beépített Linux Python rendszerkép: Az App Service forrásból hozza létre a kódot, és biztosítja a Python futtatókörnyezetet.
  • Egyéni Docker-rendszerkép: a rendszerképet saját maga hozhatja létre, és egy tárolóregisztrációs adatbázisból hivatkozhat rá.

Mindkét útvonal használhat rendszer által hozzárendelt felügyelt identitást a hitelesítéshez a Azure SQL, de a recept eltér. Válassza ki a telepítésének megfelelő lapfület.

A beépített Linuxos Python-rendszerképpel az App Service Oryx-buildrendszere automatikusan telepíti a requirements.txt elemet, és a Django-alkalmazást a gunicorn alatt indítja el. A helyi felügyeltidentitás-HTTP-proxy lehetővé teszi, hogy a Authentication=ActiveDirectoryMsi közvetlenül az ODBC-kapcsolati sztringből működjön. Használja a settings.pyFelügyelt identitás hitelesítés használata című témakörben láthatót.

Telepítse a kódot a rendszer által hozzárendelt felügyelt identitás engedélyezésével az webapp up, és állítsa be az adatbázis-környezeti változókat:

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

Ezután adja meg a felügyelt identitáshoz való hozzáférést az SQL-ben a Felügyelt identitás hitelesítésének használata című cikkben leírtak szerint.

Helyi fejlesztés a Docker Compose használatával

Helyi fejlesztéshez és teszteléshez a Docker Compose használatával futtassa a Django-alkalmazást egy SQL Server tároló mellett:

# 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

A SQL Server tároló nem hoz létre automatikusan alkalmazásadatbázisokat. A tárolók elindítása után hozza létre az adatbázist, és futtassa az áttelepítéseket:

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

A SQL Server konténerképéhez ACCEPT_EULA=Y és egy erős SA-jelszó szükséges. Éles környezetekben az SQL Server-hitelesítő adatok helyett az Azure SQL Database-et használja felügyelt identitással. Lásd: Felügyelt identitáshitelesítés használata.