이 문서에서는 mssql-django 백엔드를 사용하는 Django 애플리케이션을 Azure App Service에 배포하는 방법을 설명하며, ODBC 드라이버 구성, 환경 기반 비밀, 관리 ID 인증도 함께 다룹니다.
사전 요구 사항
- Azure 구독
- Azure에서 액세스할 수 있는 Azure SQL Database 또는 SQL Server 인스턴스
-
mssql-django로 구성된 Django 프로젝트 - Azure CLI 설치됨
Azure App Service의 ODBC 드라이버
Azure App Service Linux 인스턴스에는 Microsoft ODBC Driver for SQL Server 포함됩니다. 다음을 실행하여 설치된 드라이버 버전을 확인할 수 있습니다.
az webapp ssh --resource-group <your-rg> --name <your-app>
odbcinst -j
메모
Azure App Service 일반적으로 Linux 계획에 미리 설치된 ODBC 드라이버 17 및/또는 18을 포함합니다. Windows 앱 서비스 계획에는 ODBC 드라이버도 포함됩니다.
비밀에 환경 변수 사용
에서 데이터베이스 자격 증명 settings.py을 하드 코딩하지 마세요. 환경 변수를 사용하여 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
DB_NAME 및 DB_HOST와 같은 필수 값의 경우, 환경 변수가 누락되면 애플리케이션이 명확한 KeyError와 함께 즉시 실패하도록 os.environ["DB_NAME"](기본값 없이)를 사용하는 것을 고려하세요.
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>
관리 ID 인증 사용
프로덕션 배포의 경우 관리 ID를 사용하여 자격 증명을 저장하지 않습니다. App Service에서 시스템 할당 관리 ID를 사용하도록 설정합니다.
az webapp identity assign --resource-group <your-rg> --name <your-app>
관리 ID에 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>];
메모
애플리케이션에 필요한 역할만 부여합니다.
db_ddladmin 고정 데이터베이스 역할은 애플리케이션이 마이그레이션을 실행하는 경우에만 필요합니다. 읽기 전용 워크로드의 경우 충분합니다 db_datareader .
서버가 Microsoft Entra 전용 인증으로 구성된 경우, 서버가 ID 이름을 확인하기 위해 Microsoft Graph에 연결할 수 없으므로 FROM EXTERNAL PROVIDER는 Msg 33130와 함께 실패합니다.
CREATE USER [<your-app-name>] WITH SID = 0x<sid-hex>, TYPE = E를 사용하여 사용자를 수동으로 만듭니다. 여기서 <sid-hex>는 해당 개체 ID가 아니라 관리되는 ID의 애플리케이션(클라이언트) ID에서 파생됩니다. 변환 단계는 Azure SQL ID 액세스 권한 부여를 참조하세요.
관리 ID를 사용하도록 구성 settings.py :
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에서 액세스 토큰 사용
또는 azure.identity와 함께 TOKEN 설정을 사용합니다:
Caution
이 값은 TOKEN 프로세스 시작 시 한 번 가져오고 60-90분 후에 만료됩니다. 장기 실행 App Service 배포의 경우 토큰 새로 고침 논리 또는 수명이 짧은 작업자 재활용을 구현하는 경우에만 이 방법을 사용합니다. 사용자 환경에서 직접 ActiveDirectoryMsi 패턴이 작동하는 경우 시작 시간 토큰 문제를 방지합니다.
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
DefaultAzureCredential는 여러 자격 증명 형식을 자동으로 시도하므로 개발 및 공유 코드베이스에 편리하므로 랩톱, CI 및 Azure 동일한 코드가 작동합니다. 그러나 적용되지 않는 각 자격 증명 형식은 몇 초의 시간 제한을 추가하여 시작 속도를 늦출 수 있습니다. App Service는 항상 관리 ID를 사용할 수 있으므로 ManagedIdentityCredential 프로브 체인 없이 즉시 인증합니다. 요구 사항 파일에 설치 azure-identity : pip install azure-identity.
배포 중 마이그레이션 실행
배포 후 스크립트 또는 시작 명령을 추가하여 마이그레이션을 자동으로 실행합니다.
az webapp config set \
--resource-group <your-rg> \
--name <your-app> \
--startup-file "python manage.py migrate && gunicorn myproject.wsgi"
정적 파일 수집
프로덕션에 대한 정적 파일 처리를 구성합니다.
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
배포 과정의 일부로 collectstatic 실행:
python manage.py collectstatic --noinput
App Service에 배포
App Service는 다음과 같은 두 가지 방법으로 Django 앱을 호스트할 수 있습니다.
- 기본 제공 Linux Python 이미지: App Service는 소스에서 코드를 빌드하고 Python 런타임을 제공합니다.
- 사용자 지정 Docker 이미지: 이미지를 직접 빌드하고 컨테이너 레지스트리에서 참조합니다.
두 경로 모두 시스템 할당 관리 ID를 사용하여 Azure SQL 인증할 수 있지만 레시피는 다릅니다. 배포와 일치하는 탭을 선택합니다.
기본 제공 Linux Python 이미지를 사용하면 App Service의 Oryx 빌더가 requirements.txt를 설치하고 Django 앱을 gunicorn 하에서 자동으로 시작합니다. 로컬 관리형 ID HTTP 프록시를 사용하면 Authentication=ActiveDirectoryMsi가 ODBC 연결 문자열에서 직접 작동합니다.
관리 ID 인증 사용에 표시된 settings.py를 사용합니다.
코드를 배포하고 az webapp up, 시스템 할당 관리 ID를 사용하도록 설정하고, 데이터베이스 환경 변수를 설정합니다.
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
그런 다음 관리 ID 인증 사용에 설명된 대로 SQL에서 관리 ID 액세스 권한을 부여합니다.
Docker Compose를 사용한 로컬 개발
로컬 개발 및 테스트의 경우 Docker Compose를 사용하여 SQL Server 컨테이너와 함께 Django 앱을 실행합니다.
# 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 컨테이너는 애플리케이션 데이터베이스를 자동으로 만들지 않습니다. 컨테이너를 시작한 후 데이터베이스를 만들고 마이그레이션을 실행합니다.
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 컨테이너 이미지에는 ACCEPT_EULA=Y 강력한 SA 암호가 필요합니다. 프로덕션 환경의 경우 SQL Server 자격 증명 대신 관리 ID가 있는 Azure SQL Database 사용합니다.
관리 ID 인증 사용을 참조하세요.