Share via


사용자 할당 관리 ID를 사용하여 Django 웹앱을 만들고 Azure에 배포

이 자습서에서는 Django 웹앱을 Azure 앱 Service에 배포합니다. 웹앱은 Azure 역할 기반 액세스 제어와 함께 사용자 할당 관리 ID(암호 없는 연결)를 사용하여 Azure StorageAzure Database for PostgreSQL - 유연한 서버 리소스에 액세스합니다. 이 코드는 Python용 Azure Identity 클라이언트 라이브러리DefaultAzureCredential 클래스를 사용합니다. 클래스는 DefaultAzureCredential App Service에 대한 관리 ID가 있는지 자동으로 검색하고 이를 사용하여 다른 Azure 리소스에 액세스합니다.

이 자습서에서는 사용자가 할당한 관리 ID를 만들고, 데이터베이스 및 스토리지 계정 리소스에 액세스할 수 있도록 App Service에 할당합니다. 시스템 할당 관리 ID를 사용하는 예제는 시스템 할당 관리 ID를 사용하여 Flask Python 웹앱 만들기 및 Azure에 배포를 참조 하세요. 사용자가 할당한 관리 ID는 여러 리소스에서 사용할 수 있고 해당 수명 주기는 연결된 리소스 수명 주기에서 분리되므로 권장됩니다. 관리 ID를 사용하는 모범 사례에 대한 자세한 내용은 관리 ID 모범 사례 권장 사항을 참조 하세요.

이 자습서에서는 Azure CLI를 사용하여 Python 웹앱을 배포하고 Azure 리소스를 만드는 방법을 보여 줍니다. 이 자습서의 명령은 Bash 셸에서 실행되도록 작성되었습니다. 로컬 환경 또는 Azure Cloud Shell과 같이 CLI가 설치된 모든 Bash 환경에서 자습서 명령을 실행할 수 있습니다. 환경 변수 설정 및 사용과 같은 일부 수정을 통해 Windows 명령 셸과 같은 다른 환경에서 이러한 명령을 실행할 수 있습니다.

샘플 앱 가져오기

이 자습서와 함께 수행하려면 샘플 Django 샘플 애플리케이션을 사용합니다. 샘플 애플리케이션을 다운로드하거나 개발 환경에 복제합니다.

  1. 샘플을 복제합니다.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. 애플리케이션 폴더로 이동합니다.

    cd msdocs-django-web-app-managed-identity
    

Azure PostgreSQL 유연한 서버 만들기

  1. 자습서에 필요한 환경 변수를 설정합니다.

    LOCATION="eastus"
    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="ChAnG33#ThsPssWD$RAND_ID"
    UA_NAME="UAManagedIdentityPythonTest$RAND_ID"
    

    Important

    ADMIN_PW 영어 대문자, 영어 소문자, 숫자 및 무수 문자의 세 가지 범주에서 8~128자를 포함해야 합니다. 사용자 이름 또는 암호를 만들 때 $ 문자를 사용하지 않습니다. 나중에 Python 앱을 실행하는 데 사용되는 Linux 컨테이너 내에서 문자에 특별한 의미가 있는 $ 이러한 값을 사용하여 환경 변수를 만듭니다.

  2. az group create 명령을 사용하여 리소스 그룹을 만듭니다.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. az postgres flexible-server create 명령을 사용하여 PostgreSQL 유연한 서버를 만듭니 다. (이 명령과 후속 명령은 Bash Shell('\')에 대한 줄 연속 문자를 사용합니다. 다른 셸의 줄 연속 문자를 변경합니다.)

    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 \
      --active-directory-auth Enabled \
      --public-access 0.0.0.0
    

    sku-name은 가격 책정 계층 및 컴퓨팅 구성의 이름입니다. 자세한 내용은 Azure Database for PostgreSQL 가격 책정을 참조하세요. 사용 가능한 SKU를 나열하려면 .를 사용합니다 az postgres flexible-server list-skus --location $LOCATION.

  4. az postgres flexible-server ad-admin create 명령을 사용하여 Azure 계정을 서버에 대한 Microsoft Entra 관리자로 추가합니다.

    ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv)
    ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv)
    echo $ACCOUNT_EMAIL, $ACCOUNT_ID
    az postgres flexible-server ad-admin create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --display-name $ACCOUNT_EMAIL \
      --object-id $ACCOUNT_ID \
      --type User
    
  5. az postgres flexible-server firewall-rule create 명령을 사용하여 서버에서 방화벽 규칙을 구성합니다. 이 규칙을 사용하면 로컬 환경에 액세스하여 서버에 연결할 수 있습니다. (Azure Cloud Shell을 사용하는 경우 이 단계를 건너뛸 수 있습니다.)

    IP_ADDRESS=<your IP>
    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> IP 주소를 표시하는 도구 또는 웹 사이트를 사용합니다. 예를 들어 내 IP 주소란? 웹 사이트를 사용할 수 있습니다.

  6. az postgres flexible-server execute 명령을 사용하여 명명된 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;'
    

Azure 앱 서비스 만들기 및 코드 배포

샘플 앱의 루트 폴더에서 이러한 명령을 실행하여 App Service를 만들고 코드를 배포합니다.

  1. az webapp up 명령을 사용하여 앱 서비스를 만듭니다 .

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

    skuApp Service 계획의 크기(CPU, 메모리) 및 비용을 정의합니다. B1(기본) 서비스 계획에는 Azure 구독에 약간의 비용이 발생합니다. App Service 요금제의 전체 목록은 App Service 가격 책정 페이지를 참조하세요.

  2. az webapp config set 명령을 사용하여 샘플 리포지토리의 start.sh 사용하도록 App Service를 구성합니다.

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

스토리지 계정 및 컨테이너 만들기

샘플 앱은 검토자가 제출한 사진을 Azure Storage에 Blob으로 저장합니다.

  • 사용자가 검토와 함께 사진을 제출하면 샘플 앱은 관리 ID DefaultAzureCredential 를 사용하여 컨테이너에 이미지를 쓰고 스토리지 계정에 액세스합니다.

  • 사용자가 식당에 대한 리뷰를 볼 때 앱은 연결된 리뷰마다 Blob Storage의 사진에 대한 링크를 반환합니다. 브라우저에서 사진을 표시하려면 스토리지 계정에서 사진에 액세스할 수 있어야 합니다. Blob 데이터는 익명(인증되지 않은) 액세스를 통해 공개적으로 읽을 수 있어야 합니다.

이 섹션에서는 컨테이너의 Blob에 대한 공용 읽기 액세스를 허용하는 스토리지 계정 및 컨테이너를 만듭니다. 이후 섹션에서는 사용자 할당 관리 ID를 만들고 스토리지 계정에 Blob을 쓰도록 구성합니다.

  1. az storage create 명령을 사용하여 스토리지 계정을 만듭니다.

    STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID"
    az storage account create \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --sku Standard_LRS \
      --allow-blob-public-access true
    
  2. az storage container create 명령을 사용하여 스토리지 계정에 photos라는 컨테이너를 만듭니다.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    참고 항목

    예를 들어 스토리지 계정의 네트워크 규칙에 의해 요청이 차단될 수 있음을 나타내는 오류가 발생하는 경우 다음 명령을 입력하여 Azure 사용자 계정에 컨테이너를 만들 수 있는 권한이 있는 Azure 역할이 할당되었는지 확인합니다.

    az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
    

    자세한 내용은 빠른 시작: Azure CLI를 사용하여 Blob 만들기, 다운로드 및 나열을 참조하세요. 여러 Azure 역할을 사용하면 "소유자", "기여자", "스토리지 Blob 데이터 소유자" 및 "Storage Blob 데이터 기여자"를 포함하여 스토리지 계정에 컨테이너를 만들 수 있습니다.

사용자가 할당한 관리 ID 만들기

사용자가 할당한 관리 ID를 만들고 App Service에 할당합니다. 관리 ID는 데이터베이스 및 스토리지 계정에 액세스하는 데 사용됩니다.

  1. az identity create 명령을 사용하여 사용자 할당 관리 ID를 만들고 나중에 사용할 수 있도록 클라이언트 ID를 변수에 출력합니다.

    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)
    echo $UA_CLIENT_ID
    
  2. az account show 명령을 사용하여 구독 ID를 가져오고 관리 ID의 리소스 ID를 생성하는 데 사용할 수 있는 변수에 출력합니다.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME"
    echo $RESOURCE_ID
    
  3. az webapp identity assign 명령을 사용하여 관리 ID를 App Service에 할당 합니다.

    export MSYS_NO_PATHCONV=1
    az webapp identity assign \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $APP_SERVICE_NAME \
        --identities $RESOURCE_ID
    
  4. az webapp config appsettings set 명령을 사용하여 관리 ID 및 기타 구성 정보의 클라이언트 ID를 포함하는 App Service 앱 설정을 만듭니다.

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \
        STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \
        STORAGE_CONTAINER_NAME=photos \
        DBHOST=$DB_SERVER_NAME \
        DBNAME=restaurant \
        DBUSER=$UA_NAME
    

샘플 앱은 환경 변수(앱 설정)를 사용하여 데이터베이스 및 스토리지 계정에 대한 연결 정보를 정의하지만 이러한 변수에는 암호가 포함되지 않습니다. 대신 .DefaultAzureCredential

샘플 앱 코드는 사용자가 할당한 관리 ID 클라이언트 ID를 생성자에 전달하지 않고 클래스 생성자를 사용합니다 DefaultAzureCredential . 이 시나리오에서 대체는 앱 설정으로 설정한 AZURE_CLIENT_ID 환경 변수에 대해 검사 것입니다.

AZURE_CLIENT_ID 환경 변수가 없으면 시스템 할당 관리 ID가 구성된 경우 사용됩니다. 자세한 내용은 DefaultAzureCredential 소개를 참조 하세요.

관리 ID에 대한 역할 만들기

이 섹션에서는 스토리지 계정 및 데이터베이스에 액세스할 수 있도록 관리 ID에 대한 역할 할당을 만듭니다.

  1. az role assignment create 명령을 사용하여 스토리지 계정에 액세스할 수 있도록 관리 ID에 대한 역할 할당을 만듭니 다.

    export MSYS_NO_PATHCONV=1
    az role assignment create \
    --assignee $UA_CLIENT_ID \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
    

    이 명령은 리소스 그룹에 대한 역할 할당의 범위를 지정합니다. 자세한 내용은 역할 할당 이해를 참조 하세요.

  2. az postgres 유연한 서버 실행 명령을 사용하여 Postgres 데이터베이스에 연결하고 동일한 명령을 실행하여 관리 ID에 역할을 할당합니다.

    ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ACCOUNT_EMAIL \
      --admin-password $ACCOUNT_EMAIL_TOKEN \
      --database-name postgres \
      --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
    

    명령을 실행하는 데 문제가 있는 경우 사용자 계정을 PosgreSQL 서버의 Microsoft Entra 관리자로 추가하고 방화벽 규칙에서 IP 주소에 대한 액세스를 허용했는지 확인합니다. 자세한 내용은 Azure PostgreSQL 유연한 서버 만들기 섹션을 참조하세요.

Azure에서 Python 웹앱 테스트

샘플 Python 앱은 azure.identity 패키지 및 해당 클래스를 DefaultAzureCredential 사용합니다. 앱이 Azure DefaultAzureCredential 에서 실행 중인 경우 App Service에 대한 관리 ID가 있는지 자동으로 감지하고, 이 경우 이를 사용하여 다른 Azure 리소스(이 경우 스토리지 및 PostgreSQL)에 액세스합니다. 이러한 리소스에 액세스하기 위해 App Service에 스토리지 키, 인증서 또는 자격 증명을 제공할 필요가 없습니다.

  1. URL http://$APP_SERVICE_NAME.azurewebsites.net에서 배포된 애플리케이션을 찾습니다.

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

  2. 레스토랑에 대한 사진과 함께 일부 리뷰를 추가하여 샘플 앱의 기능을 테스트합니다.

    레스토랑 및 검토 정보는 Azure Database for PostgreSQL에 저장되고 사진은 Azure Storage에 저장됩니다. 다음은 예제 스크린샷입니다.

    Azure 앱 Service, Azure PostgreSQL 데이터베이스 및 Azure Storage를 사용하는 식당 검토 기능을 보여 주는 샘플 앱의 스크린샷

정리

이 자습서에서는 모든 Azure 리소스가 동일한 리소스 그룹에 만들어졌습니다. az group delete 명령을 사용하여 리소스 그룹을 제거하면 리소스 그룹의 모든 리소스가 제거되며 앱에 사용되는 모든 Azure 리소스를 제거하는 가장 빠른 방법입니다.

az group delete  --name $RESOURCE_GROUP_NAME 

필요에 따라 --no-wait 인수를 추가하여 작업이 완료되기 전에 명령이 반환되도록 할 수 있습니다.

다음 단계