이 자습서에서는 Django 웹 앱을 Azure App Service에 배포합니다. 웹앱은 사용자 할당된 관리 ID (암호 없는 연결)을 사용하여 Azure 역할 기반 액세스 제어를 통해 Azure Storage와 Azure Database for PostgreSQL - Flexible Server 리소스에 액세스합니다. 이 코드는 Python용 Azure Identity 클라이언트 라이브러리의 DefaultAzureCredential 클래스를 사용합니다.
DefaultAzureCredential 클래스는 App Service에 대한 관리 ID의 존재를 자동으로 감지하고, 이를 사용하여 다른 Azure 리소스에 접근합니다.
이 자습서에서는 사용자가 할당한 관리 ID를 만들고, 데이터베이스 및 스토리지 계정 리소스에 액세스할 수 있도록 App Service에 할당합니다. 시스템 할당 관리 ID를 사용하는 예로는 Flask Python 웹 앱을 만들고 Azure에 배포하는 방법을 참조할 수 있습니다. 사용자가 할당한 관리 ID는 여러 리소스에서 사용할 수 있고 해당 수명 주기는 연결된 리소스 수명 주기에서 분리되므로 권장됩니다. 관리 ID 사용에 대한 모범 사례에 대한 자세한 내용은 관리 ID 모범 사례 권장 사항을 참조하세요.
이 자습서에서는 Azure CLI를 사용하여 Python 웹앱을 배포하고 Azure 리소스를 만드는 방법을 보여줍니다. 이 자습서의 명령은 Bash 셸을 사용하는 동안 로컬 환경 또는 Azure Cloud Shell과 같이 CLI가 설치된 모든 Bash 환경에서 자습서 명령을 실행할 수 있습니다. 일부 수정을 통해 Windows 명령 셸과 같은 다른 환경에서 이러한 명령을 실행할 수 있습니다(예: 환경 변수를 설정하고 사용하도록 구문 수정).
샘플 앱 가져오기
이 자습서와 함께 수행하려면 샘플 Django 샘플 애플리케이션을 사용합니다. 샘플 애플리케이션을 다운로드하거나 개발 환경에 복제합니다.
샘플을 복제합니다.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git애플리케이션 폴더로 이동합니다.
cd msdocs-django-web-app-managed-identity
인증 코드 검사
샘플 웹앱은 두 개의 서로 다른 데이터 저장소에 인증해야 합니다.
- 검토자가 제출한 사진을 저장하고 검색하는 Azure Blob Storage 서버입니다.
- Azure Database for PostgreSQL - 레스토랑과 리뷰를 저장하는 유연한 서버 데이터베이스입니다.
DefaultAzureCredential을 사용하여 두 데이터 저장소에 인증합니다.
DefaultAzureCredential을 사용하면, 실행 중인 환경에 따라 다른 서비스 주체의 ID로 코드 변경 없이 앱을 구성할 수 있습니다. 예를 들어 로컬 개발 환경에서 앱은 Azure CLI에 로그인한 개발자의 ID로 실행되고, Azure에서는 이 자습서와 같이 사용자가 할당한 관리 ID로 실행할 수 있습니다.
두 경우 모두 앱이 실행되는 보안 주체에는 앱이 사용하는 각 Azure 리소스에 대한 역할이 있어야 하며, 이를 통해 앱에 필요한 리소스에 대한 작업을 수행할 수 있습니다. 이 자습서에서는 Azure CLI 명령을 사용하여 사용자 할당 관리 ID를 만들고 Azure에서 앱에 할당합니다. 그런 다음 Azure Storage 계정 및 Azure Database for PostgreSQL 서버에서 해당 ID에 적절한 역할을 수동으로 할당합니다. 마지막으로, 앱이 Azure에서 관리 ID를 사용하도록 설정하기 위해 AZURE_CLIENT_ID 환경 변수를 구성합니다.
사용자 할당 관리 ID가 앱 및 해당 런타임 환경에서 구성되고 데이터 저장소에 적절한 역할이 할당된 후에는 필요한 Azure 리소스로 인증하는 데 DefaultAzureCredential를 사용할 수 있습니다.
다음 코드는 ./restaurant_review/views.py에 사진을 업로드하기 위한 Blob Storage 클라이언트를 생성하는 데 사용됩니다. 클라이언트에 DefaultAzureCredential 인스턴스가 제공되며, 이는 Azure Storage에 대한 작업을 수행하기 위해 액세스 토큰을 획득하는 데 사용됩니다.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=account_url,
credential=azure_credential)
DefaultAzureCredential의 인스턴스는 ./azureproject/get_conn.py 내 Azure Database for PostgreSQL에 대한 액세스 토큰을 얻는 데에도 사용됩니다. 이 경우, 자격 증명 인스턴스에서 get_token을 직접 호출하고 적절한 scope 값을 전달하여 토큰을 획득합니다. 그런 다음, 토큰을 사용하여 PostgreSQL 연결 URI에서 암호를 설정합니다.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conf.settings.DATABASES['default']['PASSWORD'] = token.token
Azure 서비스와 함께 Python 앱을 인증하는 방법에 대해 더 알아보려면, Python용 Azure SDK를 사용하여 Azure 서비스에 Python 앱 인증하기를 참조하세요.
DefaultAzureCredential에 대해 자세히 알아보려면, 환경에 맞는 자격 증명 체인을 사용자 정의하는 방법을 포함하여 DefaultAzureCredential 개요를 참조하세요.
Azure PostgreSQL 유연한 서버 만들기
자습서에 필요한 환경 변수를 설정합니다.
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"중요
ADMIN_PW는 영어 대문자, 영어 소문자, 숫자, 특수 문자 중 세 가지 범주에서 8~128자를 포함해야 합니다. 사용자 이름이나 암호를 만들 때 절대로 문자를 사용하지$마십시오. 나중에 Python 앱을 실행하는 데 사용되는 Linux 컨테이너 내에서$문자가 특별한 의미를 가지는 이러한 값을 사용하여 환경 변수를 만듭니다.az group create 명령을 사용하여 리소스 그룹을 만듭니다.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAMEaz 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.0sku-name은 가격 책정 계층 및 컴퓨팅 구성의 이름입니다. 자세한 내용은 Azure Database for PostgreSQL 가격 책정을 참조하세요. 사용 가능한 SKU를 나열하려면 `az postgres flexible-server list-skus --location $LOCATION` 명령어를 사용하세요.
az postgres flexible-server ad-admin create 명령을 사용하여 서버에 대한 Microsoft Entra 관리자 역할로 Azure 계정을 추가합니다.
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 Useraz 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 주소를 표시하는 도구 또는 웹사이트를 사용하십시오. 예를 들어 What’s My IP Address? 웹사이트를 사용할 수 있습니다.restaurant라는 데이터베이스를 az postgres flexible-server execute 명령을 사용하여 만드십시오.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를 만들고 코드를 배포하려면 샘플 앱의 루트 폴더에서 이러한 명령을 실행합니다.
az webapp up 명령을 사용하여 앱 서비스를 만듭니다.
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1sku는 App Service 계획의 크기(CPU, 메모리) 및 비용을 정의합니다. B1(기본) 서비스 계획에는 Azure 구독에 약간의 비용이 발생합니다. App Service 요금제의 전체 목록은 App Service 가격 책정 페이지를 참조하세요.
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을 쓰도록 구성합니다.
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 trueaz 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 데이터 소유자, 및 스토리지 Blob 데이터 기여자가 포함됩니다.
사용자 할당 관리 ID 만들기
사용자가 할당한 관리 ID를 만들고 App Service에 할당합니다. 관리 ID는 데이터베이스 및 스토리지 계정에 액세스하는 데 사용됩니다.
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_IDaz 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_IDaz webapp identity assign 명령을 사용하여 App Service에 관리 ID를 할당합니다.
export MSYS_NO_PATHCONV=1 az webapp identity assign \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --identities $RESOURCE_IDaz 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에 대한 역할 할당을 만듭니다.
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"이 명령은 리소스 그룹에 대한 역할 할당의 범위를 지정합니다. 자세한 내용은 역할 할당 이해를 참조 하세요.
ko-KR: az postgres flexible-server execute 명령을 사용하여 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에 스토리지 키, 인증서 또는 자격 증명을 제공할 필요가 없습니다.
URL
http://$APP_SERVICE_NAME.azurewebsites.net에서 배포된 애플리케이션을 찾습니다.앱을 시작하는 데 1~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 인수를 추가하여 작업이 완료되기 전에 명령이 반환되도록 할 수 있습니다.