이 자습서에서는 데이터 기반 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
사전 요구 사항
튜토리얼 리소스에 대한 쓰기 및 역할 할당 권한이 부여된 Azure 구독으로, Service Connector를 지원하는 Azure 리전에 위치하며 충분한 App Service 지원 및 할당량을 갖춘 구독이어야 합니다.
Azure Cloud Shell 자습서 단계를 실행하거나 로컬로 실행하려는 경우:
- 安裝 Azure CLI 2.87.0 或更後版本。 버전을 확인하려면
az version을(를) 실행합니다. 업그레이드하려면 .를 실행합니다az upgrade. - Python 3을 설치합니다.
- Git를 설치합니다.
-
az login사용하고 프롬프트에 따라 Azure 로그인합니다.
- 安裝 Azure CLI 2.87.0 或更後版本。 버전을 확인하려면
환경 설정
구독에 대해
Microsoft.ServiceLinker및Microsoft.DBforPostgreSQL리소스 공급자를 등록하세요.az provider register --namespace Microsoft.ServiceLinker az provider register --namespace Microsoft.DBforPostgreSQL최신 버전의 Service Connector 비밀번호 없는 확장 프로그램을 설치하세요. 매개변수는
--upgrade이미 설치된 확장 프로그램을 업데이트합니다:az extension add --name serviceconnector-passwordless --upgrade
샘플 앱 복제
Important
튜토리얼의 샘플 저장소는 2026년 6월 15일에 보관되었으며, 현재는 활발히 유지보수되지 않습니다. 이 튜토리얼을 완료하는 데만 사용하세요.
샘플 앱 리포지토리를 복제합니다.
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git또는 serviceconnector-webapp-postgresql-django-passwordless 저장소 에서 앱을 다운로드하여 serviceconnector-webapp-postgresql-django-passwordless라는 폴더에 압축을 풀 수도 있습니다.
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자 이상을 포함해야 합니다. 이 튜토리얼에서는 비밀번호에
$를 사용하지 마세요.
다음 환경 변수를 설정하고, 유효한 값으로 대체
<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"PostgreSQL 관리자 비밀번호를 셸 기록에 표시하거나 추가하지 않고 읽으세요:
read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo모든 프로젝트 리소스를 포함할 리소스 그룹을 만듭니다. 리소스 그룹 이름은 캐시되고 후속 명령에 자동으로 적용됩니다.
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
App Service에 앱 코드 배포
App Service에서 앱 호스트를 만들고, 빌드 자동화를 활성화하며, 샘플 앱 코드를 배포하세요. 이 튜토리얼에서 사용하는 기본(B1) 앱 서비스 플랜은 Azure 구독 비용에 비용이 발생합니다. 현재 가격은 App Service 가격 책정을 참조하세요.
보관된 샘플의 requirements.txt 파일은 start.sh 가 사용하는 Gunicorn 서버를 선언하지 않습니다. 아직 존재하지 않는다면 로컬 복사본에 추가하세요:
grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt기본(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"배포가 패키지를 설치하도록 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저장소 루트에서 샘플 앱의 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 유연한 서버와 데이터베이스를 생성하세요.
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때 성공합니다.서버가 생성된 후 현재 셸에서 관리자 비밀번호를 제거하세요:
unset ADMIN_PWaz 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 하면 연결이 준비된 상태입니다.
샘플 사진 용기를 구성하세요
이 아카이브된 샘플 앱에 대해 Azure Storage 계정을 업데이트하여 블롭에 대한 공개 읽기 권한을 허용하세요.
참고
이 보관된 샘플은 사진을 표시하기 위해 Blob URL을 직접 사용하므로, 이 자습서에서는
photos컨테이너에 대한 익명 읽기 액세스를 사용하도록 설정합니다. 이 설정은 샘플에 특화된 것이며 Service Connector에서 요구하지 않습니다. 운영 애플리케이션의 경우, 컨테이너를 비공개로 유지하고 인증된 애플리케이션 엔드포인트와 같은 통제된 전달 방식을 사용하세요.az storage account update \ --resource-group $RESOURCE_GROUP_NAME \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-access trueMicrosoft 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_PATHCONVWindows의 Git Bash가 Azure 리소스 ID를 Windows 경로로 변환하는 것을 막습니다. Azure Cloud Shell이나 다른 Bash 환경에서는 아무런 영향이 없습니다. 역할 할당은 효과가 나타나기까지 몇 분이 걸릴 수 있습니다.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_NAMEAzure 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 앱 문제 해결