영어로 읽기

다음을 통해 공유


App Service에 컨테이너화된 Python 앱 배포

이 문서는 Python 웹앱을 컨테이너화하고 Azure 앱 Service에 배포하는 방법에 대한 자습서의 일부입니다. App Service를 사용하면 컨테이너화된 웹앱을 실행하고 Docker Hub, Azure Container Registry 및 Visual Studio Team Services를 사용하여 CI/CD(지속적인 통합/지속적인 배포) 기능을 통해 배포할 수 있습니다.

자습서의 이 부분에서는 컨테이너용 App Service 웹앱을 사용하여 App Service에 컨테이너화된 Python 웹앱을 배포하는 방법을 알아봅니다. Web App for Containers를 사용하면 기본 컨테이너 오케스트레이터를 관리하고 유지하는 것에 대해 걱정하지 않고 컨테이너를 구성하는 데 집중할 수 있습니다.

다음 단계에 따라 Docker 컨테이너 이미지를 사용하여 App Service 웹 사이트로 이동합니다. App Service는 인증을 위해 관리 ID를 사용하여 Azure Container Registry에서 초기 이미지를 가져옵니다.

아래에 표시된 서비스 다이어그램은 이 문서에서 다루는 구성 요소를 강조 표시합니다.

A screenshot of the services using in the Tutorial - Containerized Python App on Azure with deployment path highlighted.

1. 웹앱 만들기

Azure CLI 명령은 Azure Cloud Shell에서 실행하거나 Azure CLI가 설치된 워크스테이션에서 실행할 수 있습니다.

1단계. az group show 명령을 사용하여 Azure Container Registry가 포함된 그룹의 리소스 ID를 가져옵니다.

# RESOURCE_GROUP_NAME='msdocs-web-app-rg'

RESOURCE_ID=$(az group show \
  --resource-group $RESOURCE_GROUP_NAME \
  --query id \
  --output tsv)
echo $RESOURCE_ID

위의 명령에서 RESOURCE_GROUP_NAME 환경에서 3부 에서 사용한 리소스 그룹 이름으로 설정해야 합니다. 이 자습서의 Azure 에서 컨테이너를 빌드합니다. 그렇지 않은 경우 첫 번째 줄의 주석 처리를 제거하고 사용한 이름으로 설정되었는지 확인합니다.

2단계. az appservice plan create 명령을 사용하여 App Service 계획을 만듭니 다.

APP_SERVICE_PLAN_NAME='msdocs-web-app-plan'

az appservice plan create \
    --name $APP_SERVICE_PLAN_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux

3단계 az webapp create 명령을 사용하여 웹앱을 만듭니 다.

또한 다음 명령은 웹앱에 대해 시스템 할당 관리 ID를 사용하도록 설정하고 지정된 리소스(이 경우 Azure Container Registry가 포함된 리소스 그룹)에 역할을 할당 AcrPull 합니다. 이렇게 하면 리소스 그룹의 Azure Container Registry에 시스템 할당 관리 ID 끌어오기 권한이 부여됩니다.

APP_SERVICE_NAME='<website-name>'
# REGISTRY_NAME='<your Azure Container Registry name>'
CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'

az webapp create \
  --resource-group $RESOURCE_GROUP_NAME \
  --plan $APP_SERVICE_PLAN_NAME \
  --name $APP_SERVICE_NAME \
  --assign-identity '[system]' \
  --scope $RESOURCE_ID \
  --role acrpull \
  --deployment-container-image-name $CONTAINER_NAME 

위의 명령에서 다음을 수행합니다.

  • APP_SERVICE_NAME URL https://<website-name>.azurewebsites.net의 웹 사이트 이름이 되므로 전역적으로 고유해야 합니다.
  • CONTAINER_NAME "yourregistryname.azurecr.io/repo_name:tag" 형식입니다.
  • REGISTRY_NAME 환경에서 3부 에서 사용한 레지스트리 이름으로 설정해야 합니다. 이 자습서의 Azure 에서 컨테이너를 빌드합니다. 그렇지 않은 경우 위에 설정된 줄의 주석 처리를 제거하고 사용한 이름으로 설정되었는지 확인합니다.

참고

명령을 실행할 때 다음과 유사한 오류가 표시 될 수 있습니다.

No credential was provided to access Azure Container Registry. Trying to look up...
Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'

이 오류는 웹앱이 기본적으로 Azure Container Registry의 관리자 자격 증명을 사용하여 레지스트리를 인증하고 관리자 자격 증명이 레지스트리에서 사용하도록 설정되지 않았기 때문에 발생합니다. 다음 명령에서 인증에 시스템 할당 관리 ID를 사용하도록 웹앱을 설정하므로 이 오류를 무시해도 됩니다.

2. 관리 ID 및 웹후크 구성

1단계. az webapp config set 명령을 사용하여 관리 ID를 사용하여 Azure Container Registry에서 끌어오도록 웹앱을 구성합니다.

az webapp config set \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --generic-configurations '{"acrUseManagedIdentityCreds": true}'

웹앱을 만들 때 시스템 할당 관리 ID를 사용하도록 설정했기 때문에 Azure Container Registry에서 가져오는 데 사용되는 관리 ID가 됩니다.

2단계. az webapp deployment list-publishing-credentials 명령을 사용하여 애플리케이션 범위 자격 증명 을 가져옵니다.

CREDENTIAL=$(az webapp deployment list-publishing-credentials \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --query publishingPassword \
  --output tsv)
echo $CREDENTIAL 

3단계 애플리케이션 범위 자격 증명을 사용하여 az acr webhook create 명령을 사용하여 웹후크를 만듭니 다.

SERVICE_URI='https://$'$APP_SERVICE_NAME':'$CREDENTIAL'@'$APP_SERVICE_NAME'.scm.azurewebsites.net/api/registry/webhook'

az acr webhook create \
  --name webhookforwebapp \
  --registry $REGISTRY_NAME \
  --scope msdocspythoncontainerwebapp:* \
  --uri $SERVICE_URI \
  --actions push 

기본적으로 이 명령은 지정된 Azure Container Registry와 동일한 리소스 그룹 및 위치에 웹후크를 만듭니다. 원하는 경우 매개 변수와 --location 매개 변수를 --resource-group 사용하여 이 동작을 재정의할 수 있습니다.

3. MongoDB에 대한 연결 구성

이 단계에서는 MongoDB에 연결하는 데 필요한 환경 변수를 지정합니다.

MongoDB용 Azure Cosmos DB를 만들어야 하는 경우 2부에서 Cosmos DB for MangoDB를 설정하는 단계를 수행하는 것이 좋습니다. 이 자습서의 컨테이너를 로컬로 빌드하고 테스트합니다. 완료되면 양식mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>의 Azure Cosmos DB for MongoDB 연결 문자열 있어야 합니다.

아래 단계를 수행하려면 MongoDB 연결 문자열 정보가 필요합니다.

App Service에서 환경 변수를 설정하려면 다음 az webapp config appsettings set 명령을 사용하여 앱 설정을 만듭니다.

MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews

az webapp config appsettings set \
   --resource-group $RESOURCE_GROUP_NAME \
   --name $APP_SERVICE_NAME \
   --settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
              DB_NAME=$MONGO_DB_NAME  \
              COLLECTION_NAME=$MONGO_COLLECTION_NAME 
  • CONNECTION_STRING: "mongodb://"로 시작하는 연결 문자열.
  • DB_NAME: "restaurants_reviews"를 사용합니다.
  • COLLECTION_NAME: "restaurants_reviews"을 사용합니다.

4. 사이트 찾아보기

사이트가 실행 중인지 확인하려면 웹 사이트 이름이 앱 서비스 이름인 위치로 이동합니다 https://<website-name>.azurewebsites.net. 성공하면 레스토랑 리뷰 샘플 앱이 표시됩니다. 사이트가 처음으로 시작하는 데 몇 분 정도 걸릴 수 있습니다. 사이트가 나타나면 식당을 추가하고 해당 식당에 대한 검토를 추가하여 샘플 앱이 작동하는지 확인합니다.

Azure CLI를 로컬로 실행하는 경우 az webapp browse 명령을 사용하여 웹 사이트로 이동할 수 있습니다. Cloud Shell을 사용하는 경우 브라우저 창을 열고 웹 사이트 URL로 이동합니다.

az webapp browse  --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME 

참고

Cloud Shell에서는 이 az webapp browse 명령이 지원되지 않습니다. 브라우저 창을 열고 대신 웹 사이트 URL로 이동합니다.

5. 배포 문제 해결

샘플 앱이 표시되지 않으면 다음 단계를 시도합니다.

  • 컨테이너 배포 및 App Service를 사용하면 항상 Azure Portal에서 배포 센터 / 로그 페이지를 검사. 컨테이너가 당겨지고 실행 중인지 확인합니다. 컨테이너의 초기 끌어오기 및 실행은 몇 분 정도 걸릴 수 있습니다.
  • App Service를 다시 시작하고 문제가 해결되는지 확인합니다.
  • 프로그래밍 오류가 있는 경우 해당 오류가 애플리케이션 로그에 표시됩니다. App Service에 대한 Azure Portal 페이지에서 진단 및 문제 해결 애플리케이션 로그를/ 선택합니다.
  • 샘플 앱은 MongoDB에 대한 연결을 사용합니다. App Service에 올바른 연결 정보가 있는 애플리케이션 설정이 있는지 확인합니다.
  • 관리 ID가 App Service에 대해 사용하도록 설정되어 있고 배포 센터에서 사용되는지 확인합니다. App Service에 대한 Azure Portal 페이지에서 App Service 배포 센터 리소스로 이동하여 인증이 관리 ID로 설정되어 있는지 확인합니다.
  • 웹후크가 Azure Container Registry에 정의되어 있는지 확인합니다. 웹후크를 사용하면 App Service에서 컨테이너 이미지를 끌어올 수 있습니다. 특히 서비스 URI가 "/api/registry/webhook"로 끝나는 검사.
  • 다양한 Azure Container Registry sku 에는 웹후크 수를 포함하여 다양한 기능이 있습니다. 기존 레지스트리를 다시 사용하는 경우 다음과 같은 메시지가 표시될 수 있습니다. "레지스트리 SKU Basic의 리소스 종류 웹후크에 대한 할당량이 초과되었습니다. 다양한 SKU 할당량 및 업그레이드 프로세스 https://aka.ms/acr/tiers"에 대해 자세히 알아보세요. ;. 이 메시지가 표시되면 새 레지스트리를 사용하거나 사용 중인 레지스트리 웹후크 수를 줄입니다 .

다음 단계