Azure App Service SQL Server ile Django uygulaması dağıtma

Bu makalede, ODBC sürücüsü yapılandırması, ortam tabanlı gizli bilgiler ve yönetilen kimlik doğrulaması da dahil olmak üzere, mssql-django arka ucunu kullanan bir Django uygulamasının Azure App Service'e nasıl dağıtılacağı açıklanmaktadır.

Prerequisites

  • Azure aboneliği
  • Azure'den erişilebilen bir Azure SQL Veritabanı veya SQL Server örneği
  • ile yapılandırılmış bir Django projesi mssql-django
  • Azure CLI yüklendi

Azure App Service'da ODBC sürücüsü

Azure App Service Linux örnekleri, SQL Server için Microsoft ODBC Sürücüsünü içerir. Aşağıdakini çalıştırarak yüklü sürücü sürümünü doğrulayabilirsiniz:

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

Note

Azure App Service genellikle Linux planlarında önceden yüklenmiş ODBC Sürücüsü 17 ve/veya 18'i içerir. Windows Uygulaması Hizmet planları ODBC sürücüsünü de içerir.

Gizli bilgiler için ortam değişkenlerini kullanın

settings.py içinde veritabanı kimlik bilgilerini sabit kod olarak yazmayın. Ortam değişkenlerini kullanın ve bunları App Service uygulama ayarları olarak yapılandırın:

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

DB_NAME ve DB_HOST gibi gerekli değerler için, ortam değişkeni eksik olduğunda uygulamanın açık bir KeyError ile hemen başarısız olması amacıyla, os.environ["DB_NAME"] öğesini (varsayılan olmadan) kullanmayı göz önünde bulundurun.

ortam değişkenlerini Azure App Service ayarlayın:

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>

Yönetilen kimlik doğrulama kullanma

Üretim dağıtımlarında kimlik bilgilerinin depolanmasını önlemek için yönetilen kimliği kullanın. App Service'inizde sistem tarafından atanan yönetilen kimliği etkinleştirin:

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

Yönetilen kimliğe Azure SQL veritabanınıza erişim izni verin:

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

Yalnızca uygulamanızın ihtiyaç duyduğu rolleri verin. db_ddladmin sabit veritabanı rolü yalnızca uygulama geçişleri çalıştırıyorsa gereklidir. Yalnızca okuma iş yükleri için db_datareader yeterlidir.

Sunucunuz yalnızca Microsoft Entra kimlik doğrulaması için yapılandırılmışsa, sunucu kimlik adını çözümlemek için Microsoft Graph’a erişemediğinden FROM EXTERNAL PROVIDER, Msg 33130 ile başarısız olur. Kullanıcıyı CREATE USER [<your-app-name>] WITH SID = 0x<sid-hex>, TYPE = E kullanarak el ile oluşturun; burada <sid-hex>, nesne kimliğinden değil, yönetilen kimliğin uygulama (istemci) kimliğinden türetilir. Dönüştürme adımları için bkz. Azure SQL kimlik erişimi verme.

settings.py öğesini yönetilen kimliği kullanacak şekilde yapılandırın:

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

ManagedIdentityCredential ile erişim belirteçlerini kullanma

Alternatif olarak, azure.identity ile TOKEN ayarını kullanın:

Caution

Değer TOKEN işlem başlangıcında bir kez getirilir ve 60-90 dakika sonra süresi dolar. Uzun süreli App Service dağıtımları için bu yaklaşımı yalnızca belirteç yenileme mantığını ya da kısa ömürlü çalışanların geri dönüştürülmesini de uyguluyorsanız kullanın. Doğrudan ActiveDirectoryMsi kalıbı ortamınızda çalışıyorsa, başlatma sırasında ortaya çıkan belirteç sorununu önler.

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

DefaultAzureCredentialgeliştirme ve paylaşılan kod temelleri için kullanışlıdır çünkü birden çok kimlik bilgisi türünü otomatik olarak dener, bu nedenle aynı kod dizüstü bilgisayarda, CI'de ve Azure'de çalışır. Ancak, uygulanmayan her kimlik bilgisi türü birkaç saniyelik zaman aşımı ekler ve bu da başlatmayı yavaşlatır. App Service her zaman yönetilen kimliğe sahip olduğundan, ManagedIdentityCredential yoklama zinciri olmadan hemen kimlik doğrulaması yapar. Gereksinimler dosyanıza yükleyin azure-identity : pip install azure-identity.

Dağıtım sırasında geçişleri çalıştırın

Geçişleri otomatik olarak çalıştırmak için dağıtım sonrası betiği veya başlangıç komutu ekleyin:

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

Statik dosyaları toplama

Üretim için statik dosya işlemeyi yapılandırın:

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

Dağıtımınızın bir parçası olarak collectstatic öğesini çalıştırın:

python manage.py collectstatic --noinput

App Service’e dağıtım yapın

App Service bir Django uygulamasını iki şekilde barındırabilir:

  • Yerleşik Linux Python görüntüsü: App Service kodunuzu kaynaktan oluşturur ve Python çalışma zamanını sağlar.
  • Özel Docker imajı: imajı kendiniz oluşturur ve bir kapsayıcı kayıt defterinden ona referans verirsiniz.

Her iki yol da sistem tarafından atanan yönetilen kimliği kullanarak Azure SQL kimlik doğrulaması yapabilir, ancak tarif farklıdır. Dağıtımınızla eşleşen sekmeyi seçin.

Yerleşik Linux Python imajıyla App Service'in Oryx oluşturucusu requirements.txt öğesini yükler ve Django uygulamanızı gunicorn altında otomatik olarak başlatır. Yerel yönetilen kimlik için HTTP vekil sunucusu, Authentication=ActiveDirectoryMsi öğesinin doğrudan ODBC bağlantı dizesinden çalışmasını sağlar. Yönetilen kimlik kimlik doğrulamasını kullanma bölümünde gösterilen settings.py öğesini kullanın.

ile az webapp upkodunuzu dağıtın, sistem tarafından atanan yönetilen kimliği etkinleştirin ve veritabanı ortam değişkenlerini ayarlayın:

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

Ardından, Yönetilen kimlik doğrulamasını kullanma bölümünde açıklandığı gibi, SQL'de yönetilen kimliğe erişim izni verin.

Docker Compose ile yerel geliştirme

Yerel geliştirme ve test için Docker Compose'u kullanarak Django uygulamanızı SQL Server kapsayıcıyla birlikte çalıştırın:

# 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

SQL Server kapsayıcısı uygulama veritabanlarını otomatik olarak oluşturmaz. Kapsayıcıları başlattıktan sonra veritabanını oluşturun ve geçişleri çalıştırın:

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

SQL Server kapsayıcı görüntüsü için ACCEPT_EULA=Y ve güçlü bir SA parolası gerekir. Üretim ortamları için SQL Server kimlik bilgileri yerine yönetilen kimlikle Azure SQL Veritabanı kullanın. Bkz. Yönetilen kimlik doğrulamasını kullanma.