Azure 앱 Service에서 컨테이너화된 Flask 또는 FastAPI 웹앱 배포
이 자습서에서는 Web App for Containers 기능을 사용하여 Azure 앱 Service에 Python Flask 또는 FastAPI 웹앱을 배포하는 방법을 보여 줍니다. Web App for Containers는 개발자가 완전히 관리되는 Azure 앱 Service 플랫폼을 활용할 수 있는 간편한 온-램프를 제공하지만 앱 및 모든 종속성을 포함하는 배포 가능한 단일 아티팩트를 원합니다. Azure에서 컨테이너를 사용하는 방법에 대한 자세한 내용은 Azure 컨테이너 옵션 비교를 참조 하세요.
이 자습서에서는 Docker CLI 및 Docker를 사용하여 필요에 따라 Docker 이미지를 만들고 로컬로 테스트합니다. Azure CLI를 사용하여 Azure Container Registry에서 Docker 이미지를 만들고 Azure 앱 Service에 배포합니다. 웹앱은 배포 중에 Azure Container Registry에서 Docker 이미지를 끌어오기 위해 시스템 할당 관리 ID(암호 없는 연결) 및 Azure 역할 기반 액세스로 구성됩니다. Azure 도구 확장이 설치된 Visual Studio Code를 사용하여 배포할 수도 있습니다.
Azure Container Apps에서 실행할 Docker 이미지를 빌드하고 만드는 예제는 Azure Container Apps에서 Flask 또는 FastPI 웹앱 배포를 참조 하세요.
참고 항목
이 자습서에서는 App Service에서 실행할 수 있는 Docker 이미지를 만드는 방법을 보여줍니다. App Service를 사용할 필요는 없습니다. Docker 이미지를 만들지 않고 로컬 작업 영역에서 App Service로 직접 코드를 배포할 수 있습니다. 예를 들어 빠른 시작을 참조하세요. Python(Django 또는 Flask) 웹앱을 Azure 앱 Service에 배포합니다.
필수 조건
이 자습서를 완전히 학습하려면 다음이 필요합니다.
Azure 앱 Service 및 Azure Container Registry에 웹앱을 배포할 수 있는 Azure 계정입니다. Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Azure CLI 를 사용하여 Docker 이미지를 만들고 App Service에 배포합니다. 필요에 따라 Docker및 Docker CLI를 사용하여 Docker를 만들고 로컬 환경에서 테스트합니다.
샘플 코드 가져오기
로컬 환경에서 코드를 가져옵니다.
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart
Dockerfile 및 .dockerignore 파일 추가
Dockerfile을 추가하여 Docker에 이미지를 빌드하는 방법을 지시합니다. Dockerfile은 Flask 및 FastAPI 프레임워크에 웹 요청을 전달하는 프로덕션 수준 웹 서버인 Gunicorn의 사용을 지정합니다. ENTRYPOINT 및 CMD 명령은 Gunicorn에게 앱 개체에 대한 요청을 처리하도록 지시합니다.
# syntax=docker/dockerfile:1
FROM python:3.11
WORKDIR /code
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
50505
는 이 예제에서 컨테이너 포트(내부)에 사용되지만 사용 가능 포트를 사용할 수 있습니다.
requirements.txt 파일이 포함되어 있는지 확인합니다gunicorn
.
Flask==2.2.2
gunicorn
Werkzeug==2.2.2
.dockerignore 파일을 추가하여 이미지에서 불필요한 파일을 제외합니다.
.git*
**/*.pyc
.venv/
gunicorn 구성
Gunicorn은 gunicorn.conf.py 파일로 구성할 수 있습니다. gunicorn.conf.py 파일이 gunicorn이 실행되는 동일한 디렉터리에 있는 경우 Dockerfile에서 해당 위치를 지정할 필요가 없습니다. 구성 파일을 지정하는 방법에 대한 자세한 내용은 Gunicorn 설정을 참조 하세요.
이 자습서에서 제안된 구성 파일은 사용 가능한 CPU 코어 수에 따라 작업자 수를 늘리도록 gunicorn을 구성합니다. gunicorn.conf.py 파일 설정에 대한 자세한 내용은 Gunicorn 구성을 참조하세요.
# Gunicorn configuration file
import multiprocessing
max_requests = 1000
max_requests_jitter = 50
log_file = "-"
bind = "0.0.0.0:50505"
workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers
timeout = 120
이미지를 로컬로 빌드 및 실행
이미지를 로컬로 빌드합니다.
참고 항목
명령이 docker build
오류를 반환하는 경우 docker deamon이 실행 중인지 확인합니다. Windows에서 Docker Desktop이 실행 중인지 확인합니다.
Docker 컨테이너에서 이미지를 로컬로 실행합니다.
docker run --detach --publish 5000:50505 flask-demo
브라우저에서 URL을 http://localhost:5000
열어 로컬로 실행되는 웹앱을 확인합니다.
이 --detach
옵션은 백그라운드에서 컨테이너를 실행합니다. 이 --publish
옵션은 컨테이너 포트를 호스트의 포트에 매핑합니다. 호스트 포트(외부)는 쌍에서 첫 번째이고 컨테이너 포트(내부)는 두 번째입니다. 자세한 내용은 Docker 실행 참조를 참조하세요.
리소스 그룹 및 Azure Container Registry 만들기
az login 명령을 실행하여 Azure에 로그인합니다.
az login
az upgrade 명령을 실행하여 Azure CLI 버전이 최신인지 확인합니다.
az upgrade
az group create 명령을 사용하여 그룹을 만듭니 다.
az group create --name web-app-simple-rg --location eastus
Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다. 리소스 그룹을 만들 때 eastus와 같은 위치를 지정합니다.
az acr create 명령을 사용하여 Azure Container Registry를 만듭니 다.
az acr create --resource-group web-app-simple-rg \ --name webappacr123 --sku Basic
참고 항목
레지스트리 이름은 Azure에서 고유해야 합니다. 오류가 발생하면 다른 이름을 사용해 보세요. 레지스트리 이름은 5-50자의 영숫자로 구성됩니다. 하이픈과 밑줄은 허용되지 않습니다. 자세한 내용은 Azure Container Registry 이름 규칙을 참조하세요. 다른 이름을 사용하는 경우 다음 섹션의 레지스트리 및 레지스트리 아티팩트를 참조하는 명령 대신
webappacr123
이름을 사용해야 합니다.Azure Container Registry는 Azure Container Instances, Azure 앱 Service, Azure Kubernetes Service 및 기타 서비스에서 사용할 이미지를 저장하는 프라이빗 Docker 레지스트리입니다. 레지스트리를 만들 때 이름, SKU 및 리소스 그룹을 지정합니다.
Azure Container Registry에서 이미지 빌드
az acr build 명령을 사용하여 Azure에서 Docker 이미지를 빌드 합니다. 이 명령은 현재 디렉터리의 Dockerfile을 사용하고 이미지를 레지스트리에 푸시합니다.
az acr build \
--resource-group web-app-simple-rg \
--registry webappacr123 \
--image webappsimple:latest .
이 --registry
옵션은 레지스트리 이름을 지정하고 --image
옵션은 이미지 이름을 지정합니다. 이미지 이름은 형식 registry.azurecr.io/repository:tag
입니다.
Azure에 웹앱 배포
az appservice plan 명령을 사용하여 App Service 계획을 만듭니다.
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
환경 변수를 구독 ID로 설정합니다. 다음 명령의 매개 변수에 사용됩니다
--scope
.SUBSCRIPTION_ID=$(az account show --query id --output tsv)
Bash 셸에 대해 환경 변수를 만드는 명령이 표시됩니다. 다른 환경에 맞게 구문을 변경합니다.
az webapp create 명령을 사용하여 웹앱을 만듭니 다.
az webapp create \ --resource-group web-app-simple-rg \ --plan webplan --name webappsimple123 \ --assign-identity [system] \ --role AcrPull \ --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/web-app-simple-rg \ --acr-use-identity --acr-identity [system] \ --container-image-name webappacr123.azurecr.io/webappsimple:latest
참고:
웹앱 이름은 Azure에서 고유해야 합니다. 오류가 발생하면 다른 이름을 사용해 보세요. 이름은 영숫자 문자와 하이픈으로 구성되지만 하이픈으로 시작하거나 끝낼 수는 없습니다. 자세한 내용은 Microsoft.Web 이름 규칙을 참조하세요.
Azure Container Registry와 다른
webappacr123
이름을 사용하는 경우 매개 변수를--container-image-name
적절하게 업데이트해야 합니다.,
--role
및--scope
매개 변수는--assign-identity
웹앱에서 시스템 할당 관리 ID를 사용하도록 설정하고 리소스 그룹에서 역할을 할당AcrPull
합니다. 이렇게 하면 리소스 그룹의 Azure Container Registry에서 이미지를 끌어올 수 있는 관리 ID 권한이 부여됩니다.및
--acr-identity
매개 변수는--acr-use-identity
시스템 할당 관리 ID를 사용하여 Azure Container Registry에서 이미지를 끌어오도록 웹앱을 구성합니다.웹앱을 만드는 데 몇 분 정도 걸릴 수 있습니다. az webapp log tail 명령을 사용하여 배포 로그를 확인할 수 있습니다. 예들 들어
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123
입니다. "준비"가 포함된 항목이 표시되면 컨테이너가 배포됩니다.웹앱의 URL은
<web-app-name>.azurewebsites.net
다음과 같습니다https://webappsimple123.azurewebsites.net
.
업데이트 및 다시 배포
코드를 변경한 후 az acr build 및 az webapp update 명령을 사용하여 App Service에 다시 배포할 수 있습니다.
정리
이 자습서에서 만든 모든 Azure 리소스는 동일한 리소스 그룹에 있습니다. 리소스 그룹을 제거하면 리소스 그룹의 모든 리소스가 제거되며 앱에 사용되는 모든 Azure 리소스를 제거하는 가장 빠른 방법입니다.
리소스를 제거하려면 az group delete 명령을 사용합니다.
az group delete --name web-app-simple-rg
Azure Portal 또는 Visual Studio Code 및 Azure Tools 확장에서 그룹을 제거할 수도 있습니다.
다음 단계
자세한 내용은 다음 리소스를 참조하세요.