튜토리얼: Service Connector를 사용하여 Django 웹 앱을 Azure Database for PostgreSQL에 연결하기

이 자습서에서는 데이터 기반 Python Django 웹앱을 배포하여 Service Connector를 Azure App Service 사용하여 다른 Azure 서비스에 연결하는 방법을 알아봅니다. 샘플 웹 애플리케이션은 레스토랑 및 리뷰 정보를 Azure Database for PostgreSQL 데이터베이스에 저장하고, 사진은 Azure Storage 컨테이너에 저장합니다.

Azure CLI 사용하여 다음 작업을 완료합니다.

  • Python Django 웹앱을 만들고 Azure App Service 배포합니다.
  • Azure Database for PostgreSQL 유연한 서버 및 데이터베이스를 만듭니다.
  • Azure Storage 계정 및 컨테이너를 만듭니다.
  • 관리 신원 인증이 적용된 Service Connector를 사용하여 웹 앱을 데이터베이스 및 스토리지 컨테이너에 연결합니다.
  • 웹앱과 상호 작용합니다.

참고

이 자습서는 app Service Azure 자습서에서 PostgreSQL을 사용하여 Python Django 웹앱 배포와 유사하지만 Azure 역할 기반 액세스 제어를 사용하여 시스템 할당 암호 없는 관리 ID를 사용하여 다른 Azure 리소스에 액세스합니다. 이 문서의 암호 없는 서비스 연결 만들기 섹션에서는 Service Connector가 연결 프로세스를 간소화하는 방법을 보여줍니다.

웹앱은 < Python DefaultAzureCredential 클래스를 사용하여 Python Azure ID 클라이언트 라이브러리 관리 ID가 있는지 자동으로 검색하고 이를 사용하여 다른 리소스에 액세스합니다.

사전 요구 사항

  • 튜토리얼 리소스에 대한 쓰기 및 역할 할당 권한이 부여된 Azure 구독으로, Service Connector를 지원하는 Azure 리전에 위치하며 충분한 App Service 지원 및 할당량을 갖춘 구독이어야 합니다.

  • Azure Cloud Shell 자습서 단계를 실행하거나 로컬로 실행하려는 경우:

    1. 安裝 Azure CLI 2.87.0 或更後版本。 버전을 확인하려면 az version을(를) 실행합니다. 업그레이드하려면 .를 실행합니다 az upgrade.
    2. Python 3을 설치합니다.
    3. Git를 설치합니다.
    4. az login 사용하고 프롬프트에 따라 Azure 로그인합니다.

환경 설정

  1. 구독에 대해 Microsoft.ServiceLinker 및 Microsoft.DBforPostgreSQL 리소스 공급자를 등록하세요.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. 최신 버전의 Service Connector 비밀번호 없는 확장 프로그램을 설치하세요. 매개변수는 --upgrade 이미 설치된 확장 프로그램을 업데이트합니다:

    az extension add --name serviceconnector-passwordless --upgrade
    

샘플 앱 복제

Important

튜토리얼의 샘플 저장소는 2026년 6월 15일에 보관되었으며, 현재는 활발히 유지보수되지 않습니다. 이 튜토리얼을 완료하는 데만 사용하세요.

  1. 샘플 앱 리포지토리를 복제합니다.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    또는 serviceconnector-webapp-postgresql-django-passwordless 저장소 에서 앱을 다운로드하여 serviceconnector-webapp-postgresql-django-passwordless라는 폴더에 압축을 풀 수도 있습니다.

  2. cd serviceconnector-webapp-postgresql-django-passwordless 명령을 사용하여 리포지토리 폴더로 이동한 후, 해당 폴더에서 나머지 모든 명령을 실행하세요.

샘플 앱에서는 웹 앱 프로덕션 설정이 azureproject/production.py 파일에 있습니다. 개발 설정은 AzureProject/settings.py 에서 가능합니다. 프로덕션 설정은 프로덕션 환경에서 실행되도록 Django를 구성하며 App Service와 관련이 없습니다.

환경 변수가 설정되면 앱에서 WEBSITE_HOSTNAME 프로덕션 설정을 사용합니다. App Service는 이 변수를 앱의 호스트 이름으로 설정합니다. 예: msdocs-django.azurewebsites.net.

자세한 내용은 Django 배포 검사 목록을 참조하세요. 또한 Azure프로덕션 설정을 참조하세요>.

초기 환경 변수 정의

다음 코드는 이 자습서에 필요한 환경 변수를 정의합니다.

  • LOCATION이(가) 귀하의 구독에서 리소스를 생성할 수 있는 충분한 할당량이 있는 Azure 지역이어야 하며, Azure Database for PostgreSQL이 귀하의 구독에 대해 제한되지 않아야 합니다.
  • PostgreSQL 관리자 비밀번호는 대문자, 소문자, 숫자, 비영숫자 문자 등 세 가지 범주 중 최소 8자에서 128자 이상을 포함해야 합니다. 이 튜토리얼에서는 비밀번호에 $를 사용하지 마세요.
  1. 다음 환경 변수를 설정하고, 유효한 값으로 대체 <region> 합니다:

    LOCATION="<region>"
    RAND_ID=$RANDOM$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app-$RAND_ID"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    APP_SERVICE_PLAN_NAME="$APP_SERVICE_NAME-plan"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    DATABASE_NAME="restaurant"
    STORAGE_ACCOUNT_NAME="account$RAND_ID"
    ADMIN_USER="demoadmin"
    
  2. PostgreSQL 관리자 비밀번호를 셸 기록에 표시하거나 추가하지 않고 읽으세요:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. 모든 프로젝트 리소스를 포함할 리소스 그룹을 만듭니다. 리소스 그룹 이름은 캐시되고 후속 명령에 자동으로 적용됩니다.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

App Service에 앱 코드 배포

App Service에서 앱 호스트를 만들고, 빌드 자동화를 활성화하며, 샘플 앱 코드를 배포하세요. 이 튜토리얼에서 사용하는 기본(B1) 앱 서비스 플랜은 Azure 구독 비용에 비용이 발생합니다. 현재 가격은 App Service 가격 책정을 참조하세요.

  1. 보관된 샘플의 requirements.txt 파일은 start.sh 가 사용하는 Gunicorn 서버를 선언하지 않습니다. 아직 존재하지 않는다면 로컬 복사본에 추가하세요:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. 기본(B1) 요금 계층에서 리눅스 앱 서비스 플랜을 만들고, 샘플의 시작 명령어로 웹 앱을 생성하세요:

    az appservice plan create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_PLAN_NAME \
      --location $LOCATION \
      --sku B1 \
      --is-linux
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --runtime "PYTHON:3.14" \
      --startup-file "start.sh"
    
  3. 배포가 패키지를 설치하도록 App Service 빌드 자동화를 활성화하세요 : requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. 저장소 루트에서 샘플 앱의 ZIP 파일을 생성하고 az webapp deploy를 사용하여 배포하세요:

    rm -f app.zip
    python -m zipfile -c app.zip *
    
    az webapp deploy \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --src-path app.zip \
      --type zip \
      --track-status false
    
    rm app.zip
    

    배포 명령어는 App Service가 ZIP 파일을 수락할 때 성공합니다. 빌드는 App Service에서 계속되며 몇 분이 걸릴 수 있습니다.

Azure에서 PostgreSQL 데이터베이스를 만드세요

앱 데이터를 저장할 Azure Database for PostgreSQL 유연한 서버와 데이터베이스를 생성하세요.

  1. Azure Database for PostgreSQL 서버를 만듭니다:

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4 \
      --microsoft-entra-auth Enabled
    

    이 명령어는 PostgreSQL 유연 서버 프로비저닝 상태가 .일 Succeeded때 성공합니다.

  2. 서버가 생성된 후 현재 셸에서 관리자 비밀번호를 제거하세요:

    unset ADMIN_PW
    
  3. az postgres를 사용하여 데이터베이스를 생성하세요. flexible-server db create:

    az postgres flexible-server db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --name $DATABASE_NAME
    

암호 없는 서비스 연결 만들기

az webapp connection create postgres-flexible을 사용해 Azure 웹 앱을 비밀번호 없는 관리 신원 인증으로 PostgreSQL 데이터베이스에 연결하는 서비스 커넥터를 추가하세요. 다음 명령은 관리 ID 및 Azure 역할 기반 액세스 제어를 사용하도록 Azure Database for PostgreSQL 구성합니다. 명령 출력에는 Service Connector에서 수행하는 작업이 나열됩니다.

이 명령어는 데이터베이스 연결 정보를 포함하는 앱 AZURE_POSTGRESQL_CONNECTIONSTRING 설정을 생성합니다. 샘플은 azureproject/production.py 에서 이 설정을 나타냅니다. 자세한 내용은 Access 환경 변수를 참조하세요.

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database $DATABASE_NAME \
  --client-type python \
  --system-identity \
  --yes

명령이 PostgreSQL flexible server 연결을 표시하고 AZURE_POSTGRESQL_CONNECTIONSTRING앱 설정을 생성하면 연결이 준비된 것입니다.

Service Connector를 사용하여 Django 웹앱을 Azure Storage에 연결하세요

Azure 스토리지 계정을 만들고, az webapp connection create storage-blob을 사용해 웹 앱에 연결하세요. 연결 명령어는 다음과 같은 동작을 수행합니다:

  • 웹앱에서 시스템 할당 관리 ID를 사용하도록 설정합니다.
  • 웹앱을 Storage Blob Data Contributor 역할로 스토리지 계정에 추가합니다.
  • 웹앱에서 액세스를 허용하도록 스토리지 계정 네트워크를 구성합니다.
  • Azure Storage 계정에 대한 AZURE_STORAGEBLOB_RESOURCEENDPOINT 환경 변수를 만듭니다.

Azure Storage 계정 만들기

로컬 중복 저장소가 있는 범용 v2 스토리지 계정을 생성하세요:

az storage account create \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $STORAGE_ACCOUNT_NAME \
  --location $LOCATION \
  --sku Standard_LRS \
  --kind StorageV2

비밀번호 없는 저장 연결 생성

저장 계정에 비밀번호 없는 연결을 만드세요:

az webapp connection create storage-blob \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --account $STORAGE_ACCOUNT_NAME \
  --client-type python \
  --system-identity

명령어가 스토리지 계정 연결을 보고하고 앱 설정을 생성 AZURE_STORAGEBLOB_RESOURCEENDPOINT 하면 연결이 준비된 상태입니다.

샘플 사진 용기를 구성하세요

  1. 이 아카이브된 샘플 앱에 대해 Azure Storage 계정을 업데이트하여 블롭에 대한 공개 읽기 권한을 허용하세요.

    참고

    이 보관된 샘플은 사진을 표시하기 위해 Blob URL을 직접 사용하므로, 이 자습서에서는 photos 컨테이너에 대한 익명 읽기 액세스를 사용하도록 설정합니다. 이 설정은 샘플에 특화된 것이며 Service Connector에서 요구하지 않습니다. 운영 애플리케이션의 경우, 컨테이너를 비공개로 유지하고 인증된 애플리케이션 엔드포인트와 같은 통제된 전달 방식을 사용하세요.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Microsoft Entra 인증을 사용해 컨테이너를 생성할 수 있도록 로그인한 사용자 권한을 할당하세요:

    SIGNED_IN_USER_ID=$(az ad signed-in-user show --query id --output tsv)
    STORAGE_ACCOUNT_ID=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query id \
      --output tsv)
    
    MSYS_NO_PATHCONV=1 az role assignment create \
      --assignee-object-id $SIGNED_IN_USER_ID \
      --assignee-principal-type User \
      --role "Storage Blob Data Contributor" \
      --scope $STORAGE_ACCOUNT_ID
    

    이 명령어를 설정하면 MSYS_NO_PATHCONV Windows의 Git Bash가 Azure 리소스 ID를 Windows 경로로 변환하는 것을 막습니다. Azure Cloud Shell이나 다른 Bash 환경에서는 아무런 영향이 없습니다. 역할 할당은 효과가 나타나기까지 몇 분이 걸릴 수 있습니다.

  3. az storage container create를 사용해 '그 컨테이너 내 블롭'에 익명 읽기 권한을 부여하는 컨테이너 photos 를 생성하세요:

    BLOB_ENDPOINT=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query primaryEndpoints.blob \
      --output tsv)
    
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

    응답에 photos 컨테이너에 대해 "created": true가 표시되면 해당 컨테이너가 준비된 것입니다.

Azure Python 웹앱 테스트

Azure Restaurant Review 웹앱을 열고 테스트합니다. 앱은 azure.identity 패키지 및 해당 클래스를 DefaultAzureCredential 사용합니다. Azure에서 앱이 실행될 때, DefaultAzureCredential는 App Service에 관리 ID가 있으면 이를 자동으로 감지하고 Azure Storage 및 Azure Database for PostgreSQL 리소스에 접근하는 데 사용합니다. 앱은 이러한 리소스에 액세스하기 위해 스토리지 키, 인증서 또는 자격 증명을 제공할 필요가 없습니다.

  • 로컬 Azure CLI 설치의 경우 az webapp browse 사용하여 기본 브라우저에서 앱을 열 수 있습니다.

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell 로컬 브라우저를 열 수 없으므로 az webapp browse 명령을 지원하지 않습니다. Cloud Shell에서 앱의 Azure 포털 페이지 오른쪽 상단에 있는 기본 도메인 링크를 선택하세요.

앱이 시작되려면 1~2분 정도 걸릴 수 있습니다. 샘플 앱이 아닌 기본 앱 페이지가 표시되면 잠시 기다렸다가 브라우저를 새로 고칩니다.

사진과 함께 레스토랑 및 일부 리뷰를 추가하여 샘플 앱의 기능을 테스트합니다. 앱은 다음 스크린샷과 유사해야 합니다.

고객 리뷰와 업로드된 사진이 포함된 레스토랑 리뷰 웹 앱 샘플 스크린샷입니다.

리소스 정리

지속적인 요금을 방지하기 위해 이 자습서에 대해 만든 리소스를 포함하는 리소스 그룹을 삭제하여 삭제할 수 있습니다. 명령을 실행하기 전에 앱 또는 리소스가 더 이상 필요하지 않은지 확인합니다.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

명령어는 즉시 반환되고 Azure는 리소스를 삭제합니다.

Troubleshooting

앱이 시작되지 않거나 리소스에 연결되지 않는다면, App Service 배포 로그를 확인하고, 해당 설정이 AZURE_POSTGRESQL_CONNECTIONSTRINGAZURE_STORAGEBLOB_RESOURCEENDPOINT 존재하는지 확인한 뒤, Azure 역할 할당이 적용될 때까지 몇 분간 기다리세요. Python 앱 시작 문제에 대해서는 다음 기사를 참조하세요:

  • Azure App Service용 Linux Python 앱 문제 해결