사이드 프로젝트로 제작한 앱의 백엔드 부분을 배포했는데
간단하게 정리해 본다.
server {
listen 80;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
[기본 이미지 설정]
FROM python:3.11.4[Nginx 설치]
RUN apt-get update && apt-get install -y nginx[작업 디렉토리 설정]
WORKDIR /usr/src/app[필요한 패키지 설치]
COPY requirements.txt .
RUN pip install -r requirements.txt
RUN pip install gunicorn[Flask 애플리케이션 복사]
COPY . .[Nginx 설정 파일 복사]
COPY nginx.conf /etc/nginx/sites-available/default[Flask 애플리케이션 실행]
CMD service nginx start && gunicorn -b localhost:8080 run:app
도커 로그인(로컬 터미널 환경) 및 도커 허브에 레파지토리 생성(프라이빗)
sudo docker login >> id 입력 >> 비번 입력
docker 데스크탑 띄우고 터미널에서 빌드
- 윈도우 혹은 ec2 기본 환경은 amd64 아키텍처
- m1 맥북은 arm64 아키텍처
- 내 컴퓨터는 m1 맥북이지만 ec2가 amd64라서 아래 명령어로 빌드
docker buildx build --platform linux/amd64 -t [도커계정명]/[프로젝트 이름]:[tag] . --push
맨끝에 --push 옵션은 빌드 후 도커 허브로 자동 push까지 진행됨.
--load 옵션을 넣으면 이미지 만들어서 로컬에서 돌려보기 위한 용도.
💡amd64로 빌드했기 때문에 m1에서 빌드 후 이미지 구동 시 오류남.
도커 허브 사이트 가서 아까 생성한 레파지토리에 빌드한 이미지가 잘 푸시되었는지 확인
aws 부분은 인터넷 검색을 통해 단계별로 진행함. (프리티어 계정 생성 후 진행)
모든 인스턴스 및 설정은 프리티어가 지원되는 범위로 진행.
ec2 인스턴스 생성
- AMI는 우분투로 선택
- 인스턴스 유형은 프리티어 지원되는 t2.micro로 선택
t3.micro도 지원된다고 하는데 과금 우려가 있다고 본 듯해서 t2로 선택- 단일 인스턴스를 사용할 것이므로 프리티어 최대 용량인 30g로 설정
- 보안그룹 설정: ssh 접속을 위해 집 ip 등록
- 새로운 키 페어 생성: pem 파일 다운로드 후 보관
로컬에서 ec2에 쉽게 접속하기 위해 ssh config 설정
- cd ~/.ssh로 이동
- vi config
- ec2 접속 정보 등록
Host [접속명 지정] HostName ec2-[퍼블릭 ip주소].ap-northeast-2.compute.amazonaws.com User ubuntu IdentityFile [aws 키페어 파일 경로 및 이름].pem
ec2에 필요한 것들 설치(도커, git 등)
- ssh [접속명]으로 접속 가능
- git 등 필요한 것들 설치.
- 도커 허브에서 이미지 pull 받아오기 위해 아래처럼 도커 설치 진행
sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
도커 허브에서 도커 이미지 pull
sudo docker pull [도커 계정명]/[프로젝트 이름]:[tag]
설정파일 생성 및 저장
도커 컨테이너를 띄우기 전에, db 접속 정보 등 민감 사항들이 들어 있는 파일은
github이나 docker 이미지로 빌드 시 제외했었기 때문에
서버에 직접 생성해 줌.
(환경변수에 등록하거나 여러 방법이 있지만 나는 해당 파일을 별도 생성하는 방식으로 함)
rds 인스턴스 생성
- mysql, 프리티어로 생성
- 마스터 사용자 이름과 암호는 별도로 적어두기
추후 접속 시 필요하다.- db 인스턴스 클래스는 db.t2.micro로 선택(버스터블 클래스)
- 스토리지는 범용 ssd(gp2), 할당은 20g(최대)로 설정
- 💡 스토리지 자동 조정 항목은 체크 해제해야 함(과금 우려 있음)
- 퍼블릭 액세스는 '예'
- VPC 보안 그룹은 기존 항목 선택도 되지만 난 새로 생성을 했음
아마 자동으로 생성해 준 ec2와 연동을 다 해 주는 기능이었던 걸로 기억한다.- 자동 백업, 모니터링, 로그 등 기록은 과금 우려 때문에 일단 꺼뒀던 걸로 기억한다.
- 파라미터 그룹 생성 및 DB에 연결
이 부분은 위에 VPC 보안 그룹 새로 생성을 사용하면서 자동 생성되었던 거 같은데
정확히 기억이 나지 않는다.
파라미터 그룹 항목에 들어 갔을 때 등록된 게 없다면 등록해야 한다.
rds 로컬 접속 및 환경설정 파일에 등록
rds 인스턴스에 들어가면 엔드포인트 정보가 나오는데
이 정보를 host에 넣고 마스터 사용자 이름과 비밀번호를 사용해 접속한다.
로컬 db관리툴로 접속 테스트 진행하고, ec2의 환경설정 파일에도
db 접속 정보 부분을 이 정보로 변경해 준다.
로컬 db 내용 덤프 후 rds로 보내기
- mysqldump -u root -p test_db > test_db.sql
- mysql -h [rds 엔드포인트] -u root -p test_db < test_db.sql
SSL 인증서 발급 및 적용
현재 단계까지 했다면 http로 호출은 가능하지만 https 호출이 안 된다.
AWS의 certification manager를 통해 인증서를 발급받고 적용해야 한다.
https://woojin.tistory.com/94 이 블로그 내용을 참고했다.
- 가비아 도메인 발급(네임서버는 aws 걸로 등록)
- route53에 가비아 도메인 등록
- ACM 인증서 발급
- Target Group 생성
- Load Balancer 생성
- 규칙 수정
- Health check
health check의 경우 200 값이 반환되는 엔드포인트를 하나 새로 만들어서
새로 이미지 빌드 후 배포하면 된다.
로드밸런서를 추가하고 설정해야지 SSL 인증서를 사용할 수 있다.
모두 마무리된 후 AWS에서 router 항목 설정을 꼭 해 줘야만 https로 호출이 가능해진다.
이 부분을 몰라서 좀 헤맸었다.
도커 컨테이너 실행
sudo docker run -d -v /home/ubuntu/앱 폴더/logs/log_files:/usr/src/app/logs/log_files -v /home/ubuntu/앱 폴더/환경설정 파일.py:/usr/src/app/환경설정 파일.py -p 8080:80 [도커 계정명]/[프로젝트명(레파지토리):[tag]
-d 옵션은 컨테이너의 백그라운드 실행을 의미한다.
-v 옵션은 ':' 콜론을 기준으로 앞뒤 경로에 대한 파일 마운트를 진행한다.
파이썬 애플리케이션 로직에 오류가 발생 시 log 파일을 남기도록 했는데
도커 컨테이너 내부로 들어가지 않고 ec2 쉘에서 해당 로그 파일에 접근 가능하도록 하기 위함이다.
또 환경설정 파일 부분도 파이썬 애플리케이션 로직이 ec2에 생성한 해당 파일에 접근하게 하기 위해 사용했다.
':'를 기준으로 마운트 대상에 따른 변화는 없다.
로그는 ec2에서 도커 이미지 내부의 경로를 마운트 한 것이고,
환경설정 파일은 도커 이미지 내부에서 ec2의 경로를 마운트한 것이다.
굳이 상호간 위치를 변경할 필요는 없다.
참고로 -v 옵션 뒤 경로 지정하는 부분에 대소문자 구분을 정확히 해야 한다.
그리고 -v 옵션으로 외부 파일 마운트를 하려면 ec2에서는 상관없는데
로컬에서 진행 시 도커 데스크탑 설정에서 file share 관련 경로 설정을 해 줘야 한다.
대략적으로 배포까지의 과정을 정리해 보았다.
중간에 빠진 내용이 있을 수 있으나
이 플로우를 따라가다가 누락되거나 틀린 부분이 있으면
하나씩 수정해 나가면 될 듯하다.