이 문서는 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에서 초기 이미지를 가져옵니다.
또한 다음 명령은 웹앱에 대해 시스템 할당 관리 ID를 사용하도록 설정하고 지정된 리소스(이 경우 Azure Container Registry가 포함된 리소스 그룹)에 역할을 할당 AcrPull 합니다. 이렇게 하면 리소스 그룹의 Azure Container Registry에 시스템 할당 관리 ID 끌어오기 권한이 부여됩니다.
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를 사용하도록 웹앱을 설정하므로 이 오류를 무시해도 됩니다.
빌드한 컨테이너가 Docker 확장의 REGISTRIES 섹션 아래에 표시되는지 확인합니다. 그렇지 않은 경우 레지스트리 이름을 마우스 오른쪽 단추로 클릭하고 새로 고침을 선택합니다.
F1 또는 Ctrl+Shift+P를 선택하여 명령 팔레트를 열고 Docker 레지스트리 작업을 시작합니다. Azure 앱 서비스에 이미지 배포...
프롬프트에 따라 이미지를 배포합니다.
레지스트리 공급자 → "Azure"를 선택합니다.
레지스트리 선택 → 이 자습서의 앞부분에서 만든 레지스트리의 이름을 입력합니다.
리포지토리 → 리포지토리 이름 "msdocspythoncontainerwebapp"을 입력합니다. 이 리포지토리가 표시되지 않으면 Docker 확장 REGISTRIES 섹션을 새로 고칩니다.
태그 → "최신"을 선택합니다.
웹앱의 전역적으로 고유한 이름을 입력합니다→ Azure 앱 Service에 전역적으로 고유한 이름을 입력합니다. 예를 들어 "msdocs-python-container-web-app"을 사용하는 경우 웹앱 URL은 다음과 같습니다 http://msdocs-python-container-web-app.azurewebsites.net.
리소스 그룹을 → 이전에 만든 Azure Container Registry가 포함된 리소스 그룹을 사용합니다.
위치를 → 리소스 그룹과 동일한 위치를 사용합니다.
Linux App Service 계획을 선택하고 → 기존 계획을 사용하거나 새 계획을 만듭니다.
배포에 대한 자세한 내용은 출력 창을 봅니다. 출력 줄 중 하나는 App Service가 관리 ID를 사용하여 레지스트리에 액세스하는 "App Service가 ACR에서 이미지를 끌어올 수 있는 권한 부여..."입니다.
MongoDB 정보를 지정해야 하므로 최종 사이트가 https://<app-name>.azurewebsites.net 아직 준비되지 않았습니다.
리소스 그룹 → Azure Container Registry와 동일한 리소스 그룹을 사용합니다.
이름 → 고유한 이름을 http://<app-name>.azurewebsites.net사용합니다.
게시 → 빌드한 레지스트리 이미지가 사용되도록 Docker 컨테이너를 사용합니다.
운영 체제 → Linux
지역 → 리소스 그룹 및 Azure Container Registry와 동일한 지역을 사용합니다.
Linux 계획 → 기존 Linux 계획을 선택하거나 새 계획을 사용합니다.
SKU 및 크기 → 기본 B1을 선택합니다. 더 많은 옵션에 액세스하려면 크기 변경 링크를 선택합니다.
영역 중복성 → 선택한 SKU에 이 옵션을 사용할 수 있는 경우 사용 안 함을 선택합니다.
다음을 선택합니다. 계속하려면 Docker를 선택합니다.
다음을 포함하여 App Service의 Docker 정보를 지정합니다.
옵션 → 단일 컨테이너를 선택합니다.
이미지 원본 → Azure Container Registry를 선택합니다.
레지스트리 → 이 자습서에 대해 만든 레지스트리입니다.
이미지 → 레지스트리의 이미지입니다.
태그 → "최신"
Azure Portal을 사용하여 컨테이너 이미지를 배포하는 경우 레지스트리 관리자 계정이 필요합니다. 관리자 계정을 사용하도록 설정하지 않으면 이미지를 지정할 때 오류가 표시됩니다. App Service를 만든 후에는 관리 ID를 사용하여 레지스트리에서 이미지를 끌어오고 관리자 계정을 사용하지 않도록 설정할 수 있습니다.
기본적으로 이 명령은 지정된 Azure Container Registry와 동일한 리소스 그룹 및 위치에 웹후크를 만듭니다. 원하는 경우 매개 변수와 --location 매개 변수를 --resource-group 사용하여 이 동작을 재정의할 수 있습니다.
지침
스크린샷
Visual Studio Code를 사용하여 배포하는 경우 App Service가 레지스트리에서 이미지를 끌어오도록 관리 ID가 이미 설정되어 있습니다. OUTPUT 창에서 로그를 보고 "App Service가 ACR에서 이미지를 끌어올 수 있는 권한 부여..."라는 메시지를 검색하여 관리 ID가 사용하도록 설정되어 있는지 확인할 수 있습니다.
VS Code를 사용하여 배포하는 동안 웹앱이 Azure Container Registry에서 새 이미지를 끌어올 수 있도록 하는 웹후크가 만들어집니다.
중요
Azure Portal에서 웹후크 구성을 검토하여 서비스 URI가 "/api/registry/webhook"로 끝나는지 확인합니다. 서비스 URI를 검토하려면 VS Code에서 Docker 확장을 열고 만든 레지스트리를 찾습니다. 레지스트리를 마우스 오른쪽 단추로 클릭하고 포털에서 열기를 선택합니다. Azure Portal에서 레지스트리의 웹후크 리소스로 이동합니다.
App Service의 ID 리소스에서 관리 ID를 사용하도록 설정한 경우 Azure 역할 할당을 선택합니다.
시스템 할당 관리 ID에 대한 "AcrPull" 역할을 추가합니다. AcrPull 역할을 사용하면 App Service가 Azure Container Registry.In "Azure 역할 할당"에서 이미지를 끌어오고+ 역할 할당 추가를 선택하고 프롬프트에 따라 다음을 추가할 수 있습니다.
범위 → "리소스 그룹"
구독 → 구독
리소스 그룹 → Azure Container Registry 및 App Service가 있는 그룹입니다.
새 이미지가 Azure Container Registry에 푸시될 때 App Service에 대한 업데이트를 트리거하는 웹후크를 만듭니다.
먼저 애플리케이션 범위 자격 증명을 가져옵니다.
App Service의 배포 센터 리소스로 이동합니다.
FTPS 자격 증명 탭의 애플리케이션 범위에서 암호 값을 가져옵니다.
그런 다음 자격 증명 값 및 App Service 이름을 사용하여 웹후크를 만듭니다.
리포지토리 및 컨테이너 이미지가 있는 Azure Container Registry로 이동하여 웹후크 리소스 페이지를 선택합니다.
웹후크 페이지에서 + 추가를 선택합니다.
매개 변수를 다음과 같이 지정합니다.
웹후크 이름 → "webhookforwebapp"을 입력합니다.
위치 → 레지스트리의 위치를 사용합니다.
서비스 URI → App Service 이름과 자격 증명의 조합인 문자열입니다. 아래 내용을 참조하세요.
푸시 선택 → 작업
상태 → 선택합니다.
범위 → "msdocspythoncontainerwebapp:*"을 입력합니다.
서비스 URI는 "https://$" + APP_SERVICE_NAME + ":" + CREDENTIAL + "@" + APP_SERVICE_NAME + ".scm.azurewebsites.net/api/registry/webhook"로 형식이 지정됩니다. 예: "https://$msdocs-python-container-web-app:credential@msdocs-python-container-web-app.scm.azurewebsites.net/api/registry/webhook".
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 연결 문자열 있어야 합니다.
새 설정을 추가할 때마다 VS Code 창의 맨 위에 대화 상자가 나타나며 각 설정 이름 뒤에 해당 값을 추가할 수 있습니다.
다음 설정을 추가합니다.
CONNECTION_STRING → "mongodb://"으로 시작하는 연결 문자열.
DB_NAME → "restaurants_reviews"을 사용합니다.
COLLECTION_NAME → "restaurants_reviews"를 사용합니다.
WEBSITES_PORT → Django에는 "8000", Flask에는 "5000"을 사용합니다. 이 환경 변수는 컨테이너가 수신 대기하는 포트를 지정합니다.
지침
스크린샷
웹앱의 App Service 페이지로 이동합니다.
왼쪽 리소스 메뉴의 설정 아래에서 구성을 선택합니다.
페이지 맨 위에서 애플리케이션 설정을 선택합니다.
애플리케이션 설정 만들기:
+ 새 애플리케이션 설정을 선택하여 다음 값 각각에 대한 설정을 만듭니다.
CONNECTION_STRING → "mongodb://"으로 시작하는 연결 문자열.
DB_NAME → "restaurants_reviews"을 사용합니다.
COLLECTION_NAME → "restaurants_reviews"를 사용합니다.
올바른 값을 가진 세 가지 설정이 있는지 확인합니다.
저장을 선택하여 설정을 적용합니다.
4. 사이트 찾아보기
사이트가 실행 중인지 확인하려면 웹 사이트 이름이 앱 서비스 이름인 위치로 이동합니다 https://<website-name>.azurewebsites.net. 성공하면 레스토랑 리뷰 샘플 앱이 표시됩니다. 사이트가 처음으로 시작하는 데 몇 분 정도 걸릴 수 있습니다. 사이트가 나타나면 식당을 추가하고 해당 식당에 대한 검토를 추가하여 샘플 앱이 작동하는지 확인합니다.