Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

(시리즈 글이 7개 있습니다.)
기타: 46. Microsoft의 응용 프로그램을 클라우드로 제공하는 서비스 - Azure RemoteApp 소개
; https://www.sysnet.pe.kr/2/0/1672

Java: 22. Azure - 자바(Java)로 만드는 Web App Service - Java SE (Embedded Web Server) 호스팅
; https://www.sysnet.pe.kr/2/0/12686

Java: 23. Azure - 자바(Java)로 만드는 Web App Service - Tomcat 호스팅
; https://www.sysnet.pe.kr/2/0/12690

.NET Framework: 1998. Azure Functions를 사용한 간단한 실습
; https://www.sysnet.pe.kr/2/0/13037

개발 환경 구성: 736. 파이썬 웹 앱을 Azure App Service에 배포하기
; https://www.sysnet.pe.kr/2/0/13830

개발 환경 구성: 749. 파이썬 - Azure App Service에 응용 프로그램 배포하기 전의 환경
; https://www.sysnet.pe.kr/2/0/13946

개발 환경 구성: 750. 파이썬 - Azure App Service에 응용 프로그램 배포 후의 환경
; https://www.sysnet.pe.kr/2/0/13947




파이썬 - Azure App Service에 응용 프로그램 배포 후의 환경

지난 글에서 Azure App Service의 초기 환경 구성을 살펴봤는데요,

파이썬 - Azure App Service에 응용 프로그램 배포하기 전의 환경
; https://www.sysnet.pe.kr/2/0/13946

그렇다면 파이썬 웹 앱을 배포한 경우에는 어떤 식으로 바뀔까요? ^^




간단하게 예제 프로젝트를 다음과 같이 배포하는 걸 가정해 보겠습니다. 우선, SCM_DO_BUILD_DURING_DEPLOYMENT 설정을 true로 변경하고,

c:\temp> az login

c:\temp> az webapp config appsettings set --resource-group pywebapp_group --name pywebapp --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true

이후 파이썬 (예제) 소스 코드를 압축해 배포합니다.

E:\git_clone> git clone https://github.com/Azure-Samples/msdocs-python-fastapi-webapp-quickstart.git

E:\git_clone> cd msdocs-python-fastapi-webapp-quickstart

E:\git_clone\msdocs-python-fastapi-webapp-quickstart> ucompressarchive test.zip .

E:\git_clone\msdocs-python-fastapi-webapp-quickstart> az webapp deploy --resource-group pywebapp_group --name pywebapp --src-path test.zip

배포가 완료된 후 웹 사이트를 방문해 보면, (기대와는 달리) Azure의 기본 웹 앱이 여전히 실행되고 있습니다. ^^; 단지, 화면의 메시지만 살짝 바뀌었는데요, application.py의 코드에서,

# cat /opt/defaultsite/application.py 
from flask import Flask
import os
app = Flask(__name__, static_folder='/opt/defaultsite')

@app.route('/')
def root():
    if os.path.isdir('/home/site/deployments') and len(next(os.walk('/home/site/deployments'))[1]) > 1:
        return app.send_static_file('hostingstart_dep.html')
    else:
        return app.send_static_file('hostingstart.html')

(배포로 인해) /home/site/deployments 디렉터리가 생성됐기 때문에 hostingstart_dep.html 페이지가 보이기 때문입니다. 이에 더해 한 가지 변화가 더 있는데요, 배포 후에 SSH 접속을 해보면 "-bash: antenv/bin/activate: No such file or directory" 오류가 발생하지 않고 오히려 파이썬 가상 환경에 진입한 상태의 프롬프트와 함께 시작 디렉터리도 다르게 나옵니다.

((antenv) ) root@pywebapp-532e70cd:/tmp/8dd91f1ff178df3#

당연하겠지만, 배포 후에는 (App Service 인스턴스 구동 후 제일 먼저 실행되는) /opt/startup/startup.sh 파일이 다음과 같이 바뀌었기 때문입니다.

# cat /opt/startup/startup.sh
#!/bin/sh

echo 'export APP_PATH="/tmp/8dd91f1ff178df3"' >> ~/.bashrc
echo 'cd $APP_PATH' >> ~/.bashrc

# Enter the source directory to make sure the script runs where the user expects
cd /tmp/8dd91f1ff178df3

export APP_PATH="/tmp/8dd91f1ff178df3"
if [ -z "$HOST" ]; then
                export HOST=0.0.0.0
fi

if [ -z "$PORT" ]; then
                export PORT=80
fi

export PATH="/opt/python/3.12.10/bin:${PATH}"
echo 'export VIRTUALENVIRONMENT_PATH="/tmp/8dd91f1ff178df3/antenv"' >> ~/.bashrc
echo '. antenv/bin/activate' >> ~/.bashrc
PYTHON_VERSION=$(python -c "import sys; print(str(sys.version_info.major) + '.' + str(sys.version_info.minor))")
echo Using packages from virtual environment 'antenv' located at '/tmp/8dd91f1ff178df3/antenv'.
export PYTHONPATH=$PYTHONPATH:"/tmp/8dd91f1ff178df3/antenv/lib/python$PYTHON_VERSION/site-packages"
echo "Updated PYTHONPATH to '$PYTHONPATH'"
. antenv/bin/activate
GUNICORN_CMD_ARGS="--timeout 600 --access-logfile '-' --error-logfile '-' -c /opt/startup/gunicorn.conf.py --chdir=/opt/defaultsite" gunicorn application:app

그러니까, Azure App Service에 파이썬 배포를 하면 가상 환경(virtualenv)을 자동으로 구성해 그 내부에, 위의 경우 ""/tmp/8dd91f1ff178df3" 디렉터리 하위에 ZIP 파일의 압축을 해제하는 것입니다.

그런데 문제는, gunicorn을 실행하는 부분에서 application:app을 찾는 디렉터리가 여전히 "--chdir=/opt/defaultsite" 옵션으로 인해 Azure의 기본 웹 앱 디렉터리로 설정돼 있다는 점입니다.
GUNICORN_CMD_ARGS="--timeout 600 --access-logfile '-' --error-logfile '-' -c /opt/startup/gunicorn.conf.py --chdir=/opt/defaultsite"

따라서, 배포 후에 우리가 원하는 웹 앱이 동작하게 만들려면 "Startup Command"를 설정해야 하는 것입니다. (문서에는 "optional"로 나오지만, 현실적으로는 필수 설정 항목입니다.)

Configure a Linux Python app for Azure App Service
; https://learn.microsoft.com/en-us/azure/app-service/configure-language-python

결국, App Service에 대해서는 (Azure Portal의 콘솔 화면에서 하거나, 또는) 다음과 같이 스크립트 설정 명령을 (자신의 환경에 맞게) 실행해 줘야 합니다.

// msdocs-python-fastapi-webapp-quickstart 예제의 경우라면!
// (지정한 sh 파일은 반드시 LF 형식으로 저장해야 합니다.)

c:\temp> az webapp config set --resource-group pywebapp_group --name pywebapp --startup-file "$APP_PATH/startup.sh"

// 또는, 어차피 현재 디렉터리가 "$APP_PATH"이므로 "./startup.sh"로 대체해도 됩니다.

Azure App Service는 "Startup Command"에 명령어가 있다면 기존의 "/opt/startup/startup.sh"에서 마지막 명령어만 다음과 같은 식으로 대체합니다.

# cat /opt/startup/startup.sh
#!/bin/sh

echo 'export APP_PATH="/tmp/8dd91f1ff178df3"' >> ~/.bashrc
echo 'cd $APP_PATH' >> ~/.bashrc

# ...[생략]...

export PATH="/opt/python/3.12.10/bin:${PATH}"
echo 'export VIRTUALENVIRONMENT_PATH="/tmp/8dd91f1ff178df3/antenv"' >> ~/.bashrc
echo '. antenv/bin/activate' >> ~/.bashrc
PYTHON_VERSION=$(python -c "import sys; print(str(sys.version_info.major) + '.' + str(sys.version_info.minor))")
echo Using packages from virtual environment 'antenv' located at '/tmp/8dd91f1ff178df3/antenv'.
export PYTHONPATH=$PYTHONPATH:"/tmp/8dd91f1ff178df3/antenv/lib/python$PYTHON_VERSION/site-packages"
echo "Updated PYTHONPATH to '$PYTHONPATH'"
. antenv/bin/activate
PATH="$PATH:/tmp/8dd91f1ff178df3" $APP_PATH/startup.sh

이제서야 대충 돌아가는 상황이 정리된 것 같습니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/9/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13372정성태6/15/202312744개발 환경 구성: 682. SQL Server TLS 통신을 위해 사용되는 키 길이 확인 방법
13371정성태6/15/202313390개발 환경 구성: 681. openssl - 인증서 버전(V1 / V3)
13370정성태6/14/202313824개발 환경 구성: 680. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 - TLS 1.2 지원
13369정성태6/13/202311883개발 환경 구성: 679. PyCharm(을 비롯해 JetBrains에 속한 여타) IDE에서 내부 Window들의 탭이 없어진 경우
13368정성태6/13/202313444개발 환경 구성: 678. openssl로 생성한 인증서를 SQL Server의 암호화 인증서로 설정하는 방법
13367정성태6/10/202315382오류 유형: 864. openssl로 만든 pfx 인증서를 Windows Server 2016 이하에서 등록 시 "The password you entered is incorrect" 오류 발생
13366정성태6/10/202314123.NET Framework: 2128. C# - 윈도우 시스템에서 지원하는 암호화 목록(Cipher Suites) 나열파일 다운로드1
13365정성태6/8/202311369오류 유형: 863. MODIFY FILE encountered operating system error 112(failed to retrieve text for this error. Reason: 15105)
13364정성태6/8/202315039.NET Framework: 2127. C# - Ubuntu + Microsoft.Data.SqlClient + SQL Server 2008 R2 연결 방법 [1]
13363정성태6/7/202314078스크립트: 49. 파이썬 - "Transformers (신경망 언어모델 라이브러리) 강좌" - 1장 2절 코드 실행 결과
13362정성태6/1/202313164.NET Framework: 2126. C# - 서버 측의 요청 제어 (Microsoft.AspNetCore.RateLimiting)파일 다운로드1
13361정성태5/31/202313833오류 유형: 862. Facebook - ASP.NET/WebClient 사용 시 graph.facebook.com/me 호출에 대해 403 Forbidden 오류
13360정성태5/31/202312790오류 유형: 861. WSL/docker - failed to start shim: start failed: io.containerd.runc.v2: create new shim socket
13359정성태5/19/202314076오류 유형: 860. Docker Desktop - k8s 초기화 무한 반복한다면?
13358정성태5/17/202314270.NET Framework: 2125. C# - Semantic Kernel의 Semantic Memory 사용 예제 [1]파일 다운로드1
13357정성태5/16/202312640.NET Framework: 2124. C# - Semantic Kernel의 Planner 사용 예제파일 다운로드1
13356정성태5/15/202315125DDK: 10. Device Driver 테스트 설치 관련 오류 (Code 37, Code 31) 및 인증서 관련 정리
13355정성태5/12/202313123.NET Framework: 2123. C# - Semantic Kernel의 ChatGPT 대화 구현 [1]파일 다운로드1
13354정성태5/12/202315504.NET Framework: 2122. C# - "Use Unicode UTF-8 for worldwide language support" 설정을 한 경우, 한글 입력이 '\0' 문자로 처리
13352정성태5/12/202314400.NET Framework: 2121. C# - Semantic Kernel의 대화 문맥 유지파일 다운로드1
13351정성태5/11/202314775VS.NET IDE: 185. Visual Studio - 원격 Docker container 내에 실행 중인 응용 프로그램에 대한 디버깅 [1]
13350정성태5/11/202314480오류 유형: 859. Windows Date and Time - Unable to continue. You do not have permission to perform this task
13349정성태5/11/202314072.NET Framework: 2120. C# - Semantic Kernel의 Skill과 Function 사용 예제 [1]파일 다운로드1
13348정성태5/10/202315672.NET Framework: 2119. C# - Semantic Kernel의 "Basic Loading of the Kernel" 예제
13347정성태5/10/202315971.NET Framework: 2118. C# - Semantic Kernel의 Prompt chaining 예제파일 다운로드1
13346정성태5/10/202315371오류 유형: 858. RDP 원격 환경과 로컬 PC 간의 Ctrl+C, Ctrl+V 복사가 안 되는 문제
... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...