FastAPI로 만든 백엔드 어플리케이션을 만들었다. 완성 까지는 아니지만
주변 사람들에게 이용을 권유 해 보고, 사용자 경험을 토대로 더 수정해 나가고자 현재 단계에서 배포하기로 했다.
배포를 하기 위해서는 다양한 경로와 방법이 있지만
이번 프로젝트는 AWS Elastic Beanstalk 에서 Docker 를 통해 배포해 보기로 했다.
Docker를 통한 배포 방법은 이전에 한 번 경험해 본 적이 있지만 조금 오래 되었기도 했고,
프로젝트 코드를 그대로 배포하는 것과 비교했을 때 설치 버전에 의한 에러 발생 가능성이 낮아 해당 방법을 다시 한 번
사용해 보기로 했다.
1. Dockerfile 생성
/backend
.venv
requirement.txt
Dockerfile # 신규 생성
ㄴ app
ㄴ models
ㄴ routers
...
main.py
.env
프로젝트 구조는 아래와 같다.
backend 폴더 내 가상환경 파일, requirement.txt , app 디렉토리가 존재하고
app 디렉토리 내에 FastAPI 프로젝트 코드가 존재한다.
Dockerfile은 app 디렉토리가 존재하는 backend 폴더 바로 아래에 만들어 주고
빌드를 위해 아래와 같이 구성했다.
# 버전 지정
FROM python:3.9
# Time Zone 설정
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone
# 디렉토리 지정
WORKDIR /app
# 필요 소스 복사
COPY ./requirement.txt /app
COPY ./app /app
# 패키지 설치
RUN pip install -r requirement.txt
# 프로젝트 실행
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "80"]
코드에 대한 설명은 생략한다.
위의 방법 그대로 빌드를 하는 경우 한 가지 문제가 발생 할 수 있는데, .env 도 같이 빌드된 다는 것이다.
Docker 로 만들어진 image 파일을 자세하게 확인해보지는 못했지만, 같이 빌드되었다면 확인할 수 있는 방법이 존재할 것이고
.env 파일에 포함된 값들이 누군가가 볼 수 있다는 것은 일반적으로 좋지 않다.
이를 위해 빌드 과정에서 gitignore와 같이 특정 파일을 제외할 수 있는데
.dockerignore 파일을 만든 후 제외할 파일의 위치를 저장해주면 된다.
# backend/.dockerignore 파일
./app/.env
해당 방법으로 .env를 제외하고 빌드한 결과,
docker image 파일을 run 할 경우, env 내 참조된 db 주소를 받아오지 못하여 접속이 불가능한 상황인 점을 확인했다.
다음으로는 AWS EB 배포 후 .env 내 값을 연결해 주는 작업이 필요하다