빠른 시작: Azure App Service에 Python(Django, Flask 또는 FastAPI) 웹앱 배포
참고 항목
2024년 6월 1일부터, 새로 만들어진 모든 App Service 앱에는 명명 규칙 <app-name>-<random-hash>.<region>.azurewebsites.net
을 사용하여 고유한 기본 호스트 이름을 생성할 수 있는 옵션이 제공됩니다. 기존 앱 이름은 변경되지 않은 상태로 유지됩니다.
예: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
자세한 내용은 App Service 리소스의 고유 기본 호스트 이름을 참조하세요.
이 빠른 시작에서는 Python 웹앱(Django, Flask 또는 FastAPI)을 Azure App Service에 배포합니다. Azure App Service는 Linux 서버 환경에 호스트되는 Python 앱을 지원하는 완전 관리형 웹 호스팅 서비스입니다.
이 빠른 시작을 완료하려면 다음이 필요합니다.
- 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
- Python 3.9 이상이 로컬로 설치되었습니다.
참고 항목
이 문서에는 Azure App Service를 사용하여 Python 웹앱을 배포하는 방법에 대한 현재 지침이 포함되어 있습니다. Windows의 Python은 더 이상 지원되지 않습니다.
샘플 응용 프로그램
이 빠른 시작은 Flask, Django 또는 FastAPI를 사용하여 완료할 수 있습니다. 이 빠른 시작을 따라갈 수 있도록 각 프레임워크의 샘플 애플리케이션이 제공됩니다. 샘플 애플리케이션을 로컬 워크스테이션에 다운로드하거나 복제합니다.
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart
로컬에서 애플리케이션을 실행하려면 다음을 수행합니다.
다음과 같이 애플리케이션 폴더로 이동합니다.
cd msdocs-python-flask-webapp-quickstart
앱에 대한 가상 환경을 만듭니다.
py -m venv .venv .venv\scripts\activate
종속성을 설치합니다.
pip install -r requirements.txt
앱을 실행합니다.
flask run
웹 브라우저에서
http://localhost:5000
에 있는 샘플 애플리케이션을 찾습니다.
문제가 있나요? 알려주세요.
Azure에서 웹앱 만들기
Azure에서 애플리케이션을 호스트하려면 Azure에서 Azure App Service 웹앱을 만들어야 합니다. Azure CLI, VS Code, Azure Tools 확장 팩 또는 Azure Portal을 사용하여 웹앱을 만들 수 있습니다.
Azure CLI 명령은 Azure CLI가 설치된 컴퓨터에서 실행할 수 있습니다.
Azure CLI에는 필요한 리소스를 만들고 한 단계로 애플리케이션을 배포하는 az webapp up
명령이 있습니다.
필요한 경우 az login을 사용하여 Azure에 로그인합니다.
az login
웹앱 및 기타 리소스를 만든 다음, az webapp up을 사용하여 Azure에 코드를 배포합니다.
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
--runtime
매개 변수는 앱이 실행 중인 Python 버전을 지정합니다. 이 예제에서는 Python 3.9를 사용합니다. 사용 가능한 모든 런타임을 나열하려면 명령az webapp list-runtimes --os linux --output table
을 사용합니다.--sku
매개 변수는 App Service 요금제의 크기(CPU, 메모리) 및 비용을 정의합니다. 이 예제에서는 Azure 구독에 약간의 비용이 발생하는 B1(기본) 서비스 요금제를 사용합니다. App Service 요금제의 전체 목록은 App Service 가격 책정 페이지를 참조하세요.--logs
플래그는 웹앱을 시작한 직후 로그 스트림을 볼 수 있도록 하는 데 필요한 기본 로깅을 구성합니다.- 필요에 따라 인수
--name <app-name>
을 사용하여 이름을 지정할 수 있습니다. 이름을 제공하지 않으면 이름이 자동으로 생성됩니다. - 선택적으로 인수
--location <location-name>
을 포함할 수 있습니다. 여기서<location_name>
은 사용 가능한 Azure 지역입니다. Azure 계정에 허용되는 지역 목록은az appservice list-locations
명령을 실행하여 검색할 수 있습니다.
이 명령을 완료하는 데 몇 분 정도 걸릴 수 있습니다. 명령이 실행되는 동안 리소스 그룹, App Service 요금제 및 앱 리소스 만들기, 로깅 구성, ZIP 배포 수행에 대한 메시지가 제공됩니다. 그런 다음, "http://<app-name>.azurewebsites.net에서 앱을 시작할 수 있습니다."라는 메시지를 제공합니다. 이 메시지는 Azure에서 앱의 URL입니다.
The webapp '<app-name>' doesn't exist Creating Resource group '<group-name>' ... Resource group creation complete Creating AppServicePlan '<app-service-plan-name>' ... Creating webapp '<app-name>' ... Configuring default logging for the app, if not already enabled Creating zip with contents of dir /home/cephas/myExpressApp ... Getting scm site credentials for zip deployment Starting zip deployment. This operation can take a while to complete ... Deployment endpoint responded with status code 202 You can launch the app at http://<app-name>.azurewebsites.net { "URL": "http://<app-name>.azurewebsites.net", "appserviceplan": "<app-service-plan-name>", "location": "centralus", "name": "<app-name>", "os": "<os-type>", "resourcegroup": "<group-name>", "runtime_version": "python|3.9", "runtime_version_detected": "0.0", "sku": "FREE", "src_path": "<your-folder-location>" }
참고 항목
az webapp up
명령에는 다음 작업이 포함됩니다.
기본 리소스 그룹을 만듭니다.
기본 App Service 계획을 만듭니다.
지정된 이름으로 앱을 만듭니다.
Zip은 빌드 자동화가 활성화된 현재 작업 디렉터리의 모든 파일을 배포합니다.
az webapp up
또는 프로젝트 폴더의 다른az webapp
명령을 사용하여 나중에 배포할 때 다시 지정할 필요가 없도록 azure/config 파일에서 매개 변수를 로컬로 캐시합니다. 캐시된 값은 기본적으로 자동으로 사용됩니다.
문제가 있나요? 알려주세요.
Azure에 애플리케이션 코드 배포
Azure App Service는 GitHub Actions 및 모든 주요 CI/CD 도구를 포함하여 애플리케이션 코드를 Azure에 배포하는 여러 메서드를 지원합니다. 이 문서에서는 로컬 워크스테이션에서 Azure로 코드를 배포하는 방법에 중점을 둡니다.
한 단계로 az webapp up
명령을 사용해서 필요한 리소스를 만들고 애플리케이션을 배포했기 때문에 다음 단계로 넘어갈 수 있습니다.
문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 도움이 되지 않으면 알려주세요.
시작 스크립트 구성
배포에 특정 파일이 있는지에 따라, App Service는 앱이 Django 앱인지 또는 Flask 앱인지를 자동으로 감지하고 기본 단계를 수행하여 앱을 실행합니다. FastAPI 등의 다른 웹 프레임워크를 기준으로 하는 앱의 경우 App Service에서 앱을 실행하도록 시작 스크립트를 구성해야 합니다. 그렇지 않으면 App Service는 opt/defaultsite 폴더에 있는 기본 읽기 전용 앱을 실행합니다.
App Service에서 Python 앱을 실행하는 방법과 앱에서 해당 동작을 구성하고 사용자 지정하는 방법에 대한 자세한 내용은 Azure App Service용 Linux Python 앱 구성을 참조하세요.
App Service는 Flask 앱의 존재를 자동으로 감지합니다. 이 빠른 시작을 위해 추가 구성이 필요하지 않습니다.
앱으로 이동
URL http://<app-name>.azurewebsites.net
을(를) 사용하여 웹 브라우저에서 배포된 애플리케이션으로 이동합니다. 기본 앱 페이지가 보이면 1분을 기다렸다가 브라우저를 새로 고칩니다.
Python 샘플 코드가 기본 제공 이미지를 사용하여 App Service에서 Linux 컨테이너를 실행 중입니다.
축하합니다! Python 앱을 App Service에 배포했습니다.
문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 도움이 되지 않으면 알려주세요.
로그 스트리밍
Azure App Service는 애플리케이션 문제를 진단하는 데 도움이 되도록 콘솔에 모든 메시지 출력을 캡처합니다. 샘플 앱에는 이 기능을 보여주는 print()
문이 포함되어 있습니다.
@app.route('/')
def index():
print('Request for index page received')
return render_template('index.html')
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route('/hello', methods=['POST'])
def hello():
name = request.form.get('name')
if name:
print('Request for hello page received with name=%s' % name)
return render_template('hello.html', name = name)
else:
print('Request for hello page received with no name or blank name -- redirecting')
return redirect(url_for('index'))
Azure CLI, VS Code 또는 Azure Portal을 사용하여 App Service 진단 로그의 내용을 검토할 수 있습니다.
먼저 az webapp log config 명령을 사용하여 App Service 파일 시스템에 로그를 출력하도록 Azure App Service를 구성해야 합니다.
az webapp log config \
--web-server-logging filesystem \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME
로그를 스트리밍하려면 az webapp log tail 명령을 사용합니다.
az webapp log tail \
--name $APP_SERVICE_NAME \
--resource-group $RESOURCE_GROUP_NAME
앱에서 홈페이지를 새로 고치거나 다른 요청을 시도하여 일부 로그 메시지를 생성합니다. 출력은 다음과 같이 표시됩니다.
Starting Live Log Stream ---
2021-12-23T02:15:52.740703322Z Request for index page received
2021-12-23T02:15:52.740740222Z 169.254.130.1 - - [23/Dec/2021:02:15:52 +0000] "GET / HTTP/1.1" 200 1360 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/hello" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:15:52.841043070Z 169.254.130.1 - - [23/Dec/2021:02:15:52 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 200 0 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:15:52.884541951Z 169.254.130.1 - - [23/Dec/2021:02:15:52 +0000] "GET /static/images/azure-icon.svg HTTP/1.1" 200 0 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:15:53.043211176Z 169.254.130.1 - - [23/Dec/2021:02:15:53 +0000] "GET /favicon.ico HTTP/1.1" 404 232 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:16:01.304306845Z Request for hello page received with name=David
2021-12-23T02:16:01.304335945Z 169.254.130.1 - - [23/Dec/2021:02:16:01 +0000] "POST /hello HTTP/1.1" 200 695 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:16:01.398399251Z 169.254.130.1 - - [23/Dec/2021:02:16:01 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 304 0 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/hello" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
2021-12-23T02:16:01.430740060Z 169.254.130.1 - - [23/Dec/2021:02:16:01 +0000] "GET /static/images/azure-icon.svg HTTP/1.1" 304 0 "https://msdocs-python-webapp-quickstart-123.azurewebsites.net/hello" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 도움이 되지 않으면 알려주세요.
리소스 정리
샘플 앱을 마쳤으면 Azure에서 앱에 대한 모든 리소스를 제거해도 됩니다. 리소스 그룹을 제거하면 추가 요금이 발생하지 않으며 Azure 구독을 깔끔하게 유지하는 데 도움이 됩니다. 리소스 그룹을 제거하면 리소스 그룹의 모든 리소스도 제거되며 이것이 앱에 대한 모든 Azure 리소스를 제거하는 가장 빠른 방법입니다.
az group delete 명령을 사용하여 리소스 그룹을 삭제합니다.
az group delete \
--name msdocs-python-webapp-quickstart \
--no-wait
--no-wait
인수를 사용하면 작업이 완료되기 전에 명령을 반환할 수 있습니다.
문제가 있나요? 알려주세요.