다음을 통해 공유


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

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

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

이 문서의 단계를 따르면 Docker 컨테이너 이미지를 사용하여 App Service 웹 사이트를 완성하게 됩니다. App Service는 인증을 위해 관리 ID를 사용하여 Azure Container Registry에서 초기 이미지를 가져옵니다.

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

Azure에서 컨테이너화된 Python 앱 자습서에 사용되는 서비스의 스크린샷으로, 배포 경로가 강조 표시되어 있습니다.

웹앱 만들기

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은 여전히 귀하의 환경에서 이 자습서의 Azure 컨테이너 빌드 과정인 3부에서 사용한 리소스 그룹 이름으로 설정되어 있어야 합니다. 그렇지 않은 경우 첫 번째 줄의 주석 처리를 제거하고 사용한 이름으로 설정합니다.

  2. az appservice plan create 명령을 사용하여 앱 서비스 계획을 만듭니다.

    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을 사용하도록 설정하고 해당 리소스에 대해 AcrPull 역할을(를) 지정합니다. 이 경우에는 Azure Container Registry가 포함된 리소스 그룹입니다. 이렇게 하면 리소스 그룹의 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를 사용하도록 웹앱을 설정하므로 이 오류를 무시해도 됩니다.

관리 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와 동일한 리소스 그룹 및 위치에 웹후크를 만듭니다. 원하는 경우 --resource-group--location 매개 변수를 사용하여 이 동작을 재정의할 수 있습니다.

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"를 사용하세요.

사이트 둘러보기

사이트가 실행 중인지 확인하려면 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 

메모

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

배포 문제 해결

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

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

다음 단계