이 자습서에서는 데이터 기반 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
사전 요구 사항
튜토리얼 리소스에 대한 쓰기 및 역할 할당 권한이 부여된 Azure 구독으로, Service Connector를 지원하는 Azure 리전에 위치하며 충분한 App Service 지원 및 할당량을 갖춘 구독이어야 합니다.
Azure Cloud Shell 자습서 단계를 실행하거나 로컬로 실행하려는 경우:
-
Azure CLI 2.30.0 이상을 설치합니다. 버전을 확인하려면
az --version을(를) 실행합니다. 업그레이드하려면 .를 실행합니다az upgrade. -
az login사용하고 프롬프트에 따라 Azure 로그인합니다.
-
Azure CLI 2.30.0 이상을 설치합니다. 버전을 확인하려면
환경 설정
Microsoft.ServiceLinker및Microsoft.DBforPostgreSQL리소스 공급자를 사용하도록 구독이 등록되어 있는지 확인합니다. 그렇지 않은 경우az provider register -n Microsoft.[name of service]실행하여 공급자를 등록합니다.다음 Azure CLI 확장을 설치합니다.
az extension add --name serviceconnector-passwordless --upgrade az extension add --name rdbms-connect
샘플 앱 복제
샘플 앱 리포지토리를 복제합니다.
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 폴더로 압축을 풉니다.
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자의 문자가 포함되어야 하며,$은 제외합니다.
다음 환경 변수를 설정하고,
<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>"모든 프로젝트 리소스를 포함할 리소스 그룹을 만듭니다. 리소스 그룹 이름은 캐시되고 후속 명령에 자동으로 적용됩니다.
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 가격 책정을 참조하세요.
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를 선택하여 명령에서 종료할 수 있습니다.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매개 변수로 지정됩니다.
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현재 클라이언트 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 주소란?을 사용할 수 있습니다.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환경 변수를 만듭니다.
다음 명령을 실행하여 스토리지 계정 및 연결을 만듭니다.
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))앱 사용자가 사진에 액세스할 수 있도록 Blob 공용 액세스를 허용하도록 스토리지 계정을 업데이트합니다.
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-accessaz 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_NAMEAzure Cloud Shell 로컬 브라우저를 열 수 없으므로
az webapp browse명령을 지원하지 않습니다. Cloud Shell 웹앱을 여는 가장 쉬운 방법은 앱의 Azure 포털 페이지에서 오른쪽 위에 있는 Default 도메인 링크를 선택하는 것입니다.
앱이 시작되려면 1~2분 정도 걸릴 수 있습니다. 샘플 앱이 아닌 기본 앱 페이지가 표시되면 잠시 기다렸다가 브라우저를 새로 고칩니다.
사진과 함께 레스토랑 및 일부 리뷰를 추가하여 샘플 앱의 기능을 테스트합니다. 앱은 다음 스크린샷과 유사해야 합니다.
리소스 정리
지속적인 요금을 방지하기 위해 이 자습서에 대해 만든 리소스를 포함하는 리소스 그룹을 삭제하여 삭제할 수 있습니다. 명령을 실행하기 전에 앱 또는 리소스가 더 이상 필요하지 않은지 확인합니다.
az group delete --name $RESOURCE_GROUP_NAME --no-wait
모든 리소스를 삭제하는 데 시간이 걸릴 수 있습니다. 인수 --no-wait 를 사용하면 명령이 즉시 반환됩니다.
Troubleshooting
이 자습서를 실행하는 데 문제가 있는 경우 다음 리소스를 참조하세요.
Azure App Service 용 Linux Python 앱 문제 해결- 지원 요청