FastAPI를 아마존 리눅스에 배포하는 기본적인 단계는 다음과 같습니다:
AWS EC2 인스턴스 생성
인스턴스에 접속
FastAPI 애플리케이션 준비
패키지 설치
sudo yum update
sudo yum install python3
sudo yum install python3-pip
sudo pip3 install fastapi
sudo pip3 install uvicorn
FastAPI 애플리케이션 업로드
애플리케이션 실행
uvicorn main:app --host 0.0.0.0 --port 80
이렇게 하면 외부에서 애플리케이션에 접속할 수 있습니다.위의 단계는 기본적인 FastAPI 애플리케이션을 AWS EC2 인스턴스에 배포하는 방법을 설명한 것입니다. 실제 프로덕션 환경에서는 Nginx나 Apache와 같은 웹 서버를 통해 FastAPI를 실행하고, Gunicorn 등의 WSGI HTTP 서버를 사용하는 것이 일반적입니다. 또한, 서비스가 중단되지 않도록 systemd를 이용하여 서비스를 등록하는 것이 좋습니다.
마지막으로, FastAPI 애플리케이션에 따라 추가적인 설정(데이터베이스 연결, 환경 변수 설정 등)이 필요할 수도 있습니다. 이 부분은 FastAPI 애플리케이션의 특징에 따라 달라집니다.
위처럼 배포하게 되면 터미널 나가게 됐을경우 꺼지게 된다.
도커파일
# 도커 허브에서 이미지를 가져와서 이미지를 작업한다
FROM python:3.10.7
#컨테이너 실행 전 작동할 명령
# RUN (명령)
# 타임존 설정 (설정을 하지 않으면 시간 저장시 다른 시간대로 저장됨)
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone
# 컨테이너 내 작업 경로
# WORKDIR (경로)
WORKDIR /app
# 파일 복사
COPY . .
# 파이썬 라이브러리 설치
RUN pip install -r requirements.txt
# 서버 실행
CMD python src/main.py
빌드할땐 os 에 따라서 빌드 방법이 다르다 platform 옵션을 붙여줘야한다.
일반 빌드
docker build -t 이미지이름 도커파일경로
M1 맥북 빌드
docker build —platform linux/amd64 -t 이미지이름 도커파일경로 -t 옵션 : 이미지 태그
배포
docker run -it --restart=always -d -p 8000:8000 --name 컨테이너이름 이미지이름
-it : 컨테이너 접속용
--restart=always : 도커 재구동시 자동 실행
-d : 백그라운드 실행
-p : 포트설정 ex) 80:8080 80으로 접속시 8080으로 인바운드
--name : 컨테이너 이름 설정
인바운드 설정
프론트엔드의 주소만 받는 것이 좋다.
uvicorn main:app --host 0.0.0.0 --port 80
에서 간단히 &
옵션만 붙여주면 된다.
FastAPI 애플리케이션을 백그라운드에서 돌리려면, 명령어에 &
를 추가하면 됩니다. &
는 리눅스에서 현재 명령어를 백그라운드에서 실행하게 만드는 특수 문자입니다.
uvicorn main:app --host 0.0.0.0 --port 80 &
그러나 이 방법은 세션이 종료될 경우 프로세스도 함께 종료될 수 있습니다. 이를 방지하려면 nohup
명령어를 사용할 수 있습니다. nohup
은 hangup 신호를 무시하게 만들어, 사용자가 로그아웃하거나 세션이 종료된 후에도 프로세스가 계속 실행되도록 합니다.
nohup uvicorn main:app --host 0.0.0.0 --port 80 &
위 명령어를 실행하면 nohup.out
이라는 파일에 표준 출력과 표준 에러가 기록됩니다. 다른 파일에 로그를 기록하려면 다음과 같이 실행하면 됩니다:
nohup uvicorn main:app --host 0.0.0.0 --port 80 > my.log 2>&1 &
이렇게 하면 my.log
파일에 표준 출력과 표준 에러가 함께 기록됩니다. 2>&1
은 표준 에러를 표준 출력으로 리다이렉션하는 것을 의미합니다.
이러한 방법들은 임시적인 해결책이며, 프로덕션 환경에서는 systemd
나 supervisor
와 같은 도구를 사용하여 서비스를 관리하는 것이 좋습니다. 이런 도구들은 서비스의 시작, 중지, 재시작 등을 쉽게 관리할 수 있게 해주며, 시스템 부팅 시에 서비스를 자동으로 시작하도록 설정할 수 있습니다. 또한 서비스가 비정상적으로 종료되었을 경우에도 자동으로 재시작하게 설정할 수 있습니다.
유익한 글 잘 봤습니다, 감사합니다.