자습서: 서비스 커넥터를 사용하여 Django 웹앱을 Azure 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 계정 및 컨테이너를 만듭니다.
  • 관리 ID 인증을 사용하여 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.30.0 이상을 설치합니다. 버전을 확인하려면 az --version을(를) 실행합니다. 업그레이드하려면 .를 실행합니다 az upgrade.
    2. az login 사용하고 프롬프트에 따라 Azure 로그인합니다.

환경 설정

  1. Microsoft.ServiceLinkerMicrosoft.DBforPostgreSQL 리소스 공급자를 사용하도록 구독이 등록되어 있는지 확인합니다. 그렇지 않은 경우 az provider register -n Microsoft.[name of service] 실행하여 공급자를 등록합니다.

  2. 다음 Azure CLI 확장을 설치합니다.

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

샘플 앱 복제

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

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

    또는 https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless 앱을 다운로드하여 serviceconnector-webapp-postgresql-django-passwordless 폴더로 압축을 풉니다.

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

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

환경 변수가 설정되면 앱에서 WEBSITE_HOSTNAME 프로덕션 설정을 사용합니다. Azure Postgres 연결 문자열의 경우 App Service는 이 변수를 웹앱의 URL(예: https://msdocs-django.azurewebsites.net)으로 자동으로 설정합니다.

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

초기 환경 변수 정의

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

  • LOCATION이(가) 귀하의 구독에서 리소스를 생성할 수 있는 충분한 할당량이 있는 Azure 지역이어야 하며, Azure Database for PostgreSQL이 귀하의 구독에 대해 제한되지 않아야 합니다.
  • ADMIN_PW에는 대문자, 소문자, 숫자, 특수 문자를 포함한 네 가지 범주 중 최소 세 가지 범주에서 8~128자의 문자가 포함되어야 하며, $은 제외합니다.
  1. 다음 환경 변수를 설정하고, <region><database password> 자리 표시자를 유효한 값으로 대체합니다.

    LOCATION="<region>"
    RAND_ID=$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    ADMIN_USER="demoadmin"
    ADMIN_PW="<database password>"
    
  2. 모든 프로젝트 리소스를 포함할 리소스 그룹을 만듭니다. 리소스 그룹 이름은 캐시되고 후속 명령에 자동으로 적용됩니다.

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

App Service에 앱 코드 배포

App Service에서 앱 호스트를 만들고 해당 호스트에 샘플 앱 코드를 배포합니다. 이 az webapp up 명령은 다음 작업을 수행합니다.

  • 기본(B1) 가격 책정 계층에서 App Service 계획을 만듭니다.
  • App Service 앱을 만듭니다.
  • 앱에 대한 기본 로깅을 사용하도록 설정합니다.
  • 빌드 자동화를 사용하도록 설정된 ZIP 배포를 사용하여 리포지토리를 업로드합니다.
  • 앱을 빌드합니다.

코드 sku 에서 App Service 계획의 CPU, 메모리 및 비용을 정의합니다. 기본(B1) 서비스 계획은 Azure 구독에 약간의 비용이 발생합니다. 매개 변수를 --sku 생략하여 기본 SKU(일반적으로 P1v3(Premium v3))를 사용할 수 있습니다. App Service 계획의 전체 목록은 App Service 가격 책정을 참조하세요.

  1. serviceconnector-webapp-postgresql-django-passwordless 리포지토리 폴더에서 다음 az webapp up 명령을 실행합니다.

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.10 \
      --sku B1
    

    참고

    배포에는 몇 분이 소요되며, 특히 기본 SKU의 경우 명령어가 응답하지 않거나 시간 초과될 수 있습니다. 앱이 성공적으로 빌드되고 출력이 표시 Starting the site되면 Ctrl+C를 선택하여 명령에서 종료할 수 있습니다.

  2. az webapp config set 명령을 실행하여 리포지토리 start.sh 파일을 사용하도록 앱을 구성합니다.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Azure Postgres 데이터베이스 만들기

앱 정보를 저장할 Azure Database for PostgreSQL 데이터베이스를 만듭니다. az postgres flexible-server create 명령은 지정된 리소스 그룹 내에 Azure Database for PostgreSQL 유연한 서버를 만듭니다.

  • 매개 변수에 --name 지정된 서버 이름입니다. 이름은 모든 Azure 고유해야 합니다.
  • 매개 변수에 지정된 SKU입니다 --sku-name .
  • 관리자 계정의 사용자 이름과 암호는 --admin-user--admin-password 매개 변수로 지정됩니다.
  1. Azure Database for PostgreSQL 서버를 만듭니다. 현재 클라이언트 IP 주소에 대한 액세스를 허용하라는 메시지가 표시되면, ‘예’를 선택하려면 y을 입력하세요.

    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
    
  2. 현재 클라이언트 IP 주소에 대한 액세스를 사용하도록 설정하라는 메시지가 표시되지 않으면 az postgres flexible-server firewall-rule create 명령을 사용하여 서버에서 방화벽 규칙을 구성합니다. 이 규칙은 로컬 환경에서 서버에 액세스할 수 있도록 허용합니다.

    IP_ADDRESS=<your IP address>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    팁 (조언)

    명령어에서 <your IP address>를 대체하기 위해 IP 주소를 표시하는 도구 또는 웹사이트를 사용하십시오. 예를 들어 내 IP 주소란?을 사용할 수 있습니다.

  3. restaurant 명령을 사용하여 서버에 명명된 데이터베이스를 만듭니다.

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

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

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

이 명령은 앱에 대한 데이터베이스 연결 정보를 제공하는 환경 AZURE_POSTGRESQL_CONNECTIONSTRING 변수를 만듭니다. 앱 코드는 다음과 같은 os.environ.get('AZURE_POSTGRESQL_HOST')문을 사용하여 앱 환경 변수에 액세스합니다. 자세한 내용은 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 restaurant \
  --client-type python \
  --system-identity

스토리지 계정 만들기 및 연결

az webapp connection create storage-blob 사용하여 Azure 스토리지 계정 및 서비스 커넥터를 만듭니다. 이 명령은 다음 작업을 수행합니다.

  • 웹앱에서 시스템 할당 관리 ID를 사용하도록 설정합니다.
  • 역할이 스토리지 Blob 데이터 기여자인 웹앱을 새 스토리지 계정에 추가합니다.
  • 웹앱에서 액세스를 허용하도록 스토리지 계정 네트워크를 구성합니다.
  • Azure Storage 계정에 대한 AZURE_STORAGEBLOB_RESOURCEENDPOINT 환경 변수를 만듭니다.
  1. 다음 명령을 실행하여 스토리지 계정 및 연결을 만듭니다.

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    
  2. 앱 사용자가 사진에 액세스할 수 있도록 Blob 공용 액세스를 허용하도록 스토리지 계정을 업데이트합니다.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. az storage container create를 사용하여 스토리지 계정에서 호출 photos 된 컨테이너를 만들고 새 컨테이너의 Blob에 대한 익명 공용 읽기 액세스를 허용합니다.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

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.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell 로컬 브라우저를 열 수 없으므로 az webapp browse 명령을 지원하지 않습니다. Cloud Shell 웹앱을 여는 가장 쉬운 방법은 앱의 Azure 포털 페이지에서 오른쪽 위에 있는 Default 도메인 링크를 선택하는 것입니다.

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

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

App Service, Azure Database for PostgreSQL 및 Azure Storage를 사용하여 레스토랑 리뷰 기능을 보여주는 샘플 앱의 스크린샷입니다.

리소스 정리

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

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

모든 리소스를 삭제하는 데 시간이 걸릴 수 있습니다. 인수 --no-wait 를 사용하면 명령이 즉시 반환됩니다.

Troubleshooting

이 자습서를 실행하는 데 문제가 있는 경우 다음 리소스를 참조하세요.

  • Azure App Service용 Linux Python 앱 문제 해결
  • 지원 요청