배포 과정 간단 정리

solarrrrr·2023년 11월 18일
0

Today I Learned

목록 보기
70/74

사이드 프로젝트로 제작한 앱의 백엔드 부분을 배포했는데
간단하게 정리해 본다.


코드 작성 및 깃헙, 도커 연동

  1. github 프라이빗 레파지토리 생성
  2. 로컬에 작업 폴더 만들고 git 초기화
  3. 생성한 레파지토리를 git remote add로 origin에 연결
  4. 로컬에 mysql 설치 및 db 생성
  5. 코드 작업(db 연결)
  6. requirements.txt 작성
  7. .gitignore 작성
  8. .dockerignore 작성
  9. nginx.conf 작성
    server {
       listen 80;
       location / {
           proxy_pass http://localhost:8080;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
       }
    }
  10. github 해당 레파지토리 main으로 초기 push
  1. Dockerfile 작성

    [기본 이미지 설정]
    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

  1. 도커 로그인(로컬 터미널 환경) 및 도커 허브에 레파지토리 생성(프라이빗)

    sudo docker login >> id 입력 >> 비번 입력

  2. docker 데스크탑 띄우고 터미널에서 빌드

    • 윈도우 혹은 ec2 기본 환경은 amd64 아키텍처
    • m1 맥북은 arm64 아키텍처
    • 내 컴퓨터는 m1 맥북이지만 ec2가 amd64라서 아래 명령어로 빌드
      docker buildx build --platform linux/amd64 -t [도커계정명]/[프로젝트 이름]:[tag] . --push
      맨끝에 --push 옵션은 빌드 후 도커 허브로 자동 push까지 진행됨.
      --load 옵션을 넣으면 이미지 만들어서 로컬에서 돌려보기 위한 용도.
      💡amd64로 빌드했기 때문에 m1에서 빌드 후 이미지 구동 시 오류남.
  3. 도커 허브 사이트 가서 아까 생성한 레파지토리에 빌드한 이미지가 잘 푸시되었는지 확인

AWS 세팅

aws 부분은 인터넷 검색을 통해 단계별로 진행함. (프리티어 계정 생성 후 진행)
모든 인스턴스 및 설정은 프리티어가 지원되는 범위로 진행.

  1. ec2 인스턴스 생성

    • AMI는 우분투로 선택
    • 인스턴스 유형은 프리티어 지원되는 t2.micro로 선택
      t3.micro도 지원된다고 하는데 과금 우려가 있다고 본 듯해서 t2로 선택
    • 단일 인스턴스를 사용할 것이므로 프리티어 최대 용량인 30g로 설정
    • 보안그룹 설정: ssh 접속을 위해 집 ip 등록
    • 새로운 키 페어 생성: pem 파일 다운로드 후 보관
  2. 로컬에서 ec2에 쉽게 접속하기 위해 ssh config 설정

    • cd ~/.ssh로 이동
    • vi config
    • ec2 접속 정보 등록
    Host [접속명 지정]
        HostName ec2-[퍼블릭 ip주소].ap-northeast-2.compute.amazonaws.com
        User ubuntu
        IdentityFile [aws 키페어 파일 경로 및 이름].pem
  3. 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
  4. 도커 허브에서 도커 이미지 pull

    sudo docker pull [도커 계정명]/[프로젝트 이름]:[tag]

  5. 설정파일 생성 및 저장

    도커 컨테이너를 띄우기 전에, db 접속 정보 등 민감 사항들이 들어 있는 파일은
    github이나 docker 이미지로 빌드 시 제외했었기 때문에
    서버에 직접 생성해 줌.
    (환경변수에 등록하거나 여러 방법이 있지만 나는 해당 파일을 별도 생성하는 방식으로 함)

  6. rds 인스턴스 생성

    • mysql, 프리티어로 생성
    • 마스터 사용자 이름과 암호는 별도로 적어두기
      추후 접속 시 필요하다.
    • db 인스턴스 클래스는 db.t2.micro로 선택(버스터블 클래스)
    • 스토리지는 범용 ssd(gp2), 할당은 20g(최대)로 설정
    • 💡 스토리지 자동 조정 항목은 체크 해제해야 함(과금 우려 있음)
    • 퍼블릭 액세스는 '예'
    • VPC 보안 그룹은 기존 항목 선택도 되지만 난 새로 생성을 했음
      아마 자동으로 생성해 준 ec2와 연동을 다 해 주는 기능이었던 걸로 기억한다.
    • 자동 백업, 모니터링, 로그 등 기록은 과금 우려 때문에 일단 꺼뒀던 걸로 기억한다.
    • 파라미터 그룹 생성 및 DB에 연결
      이 부분은 위에 VPC 보안 그룹 새로 생성을 사용하면서 자동 생성되었던 거 같은데
      정확히 기억이 나지 않는다.
      파라미터 그룹 항목에 들어 갔을 때 등록된 게 없다면 등록해야 한다.
  7. rds 로컬 접속 및 환경설정 파일에 등록
    rds 인스턴스에 들어가면 엔드포인트 정보가 나오는데
    이 정보를 host에 넣고 마스터 사용자 이름과 비밀번호를 사용해 접속한다.
    로컬 db관리툴로 접속 테스트 진행하고, ec2의 환경설정 파일에도
    db 접속 정보 부분을 이 정보로 변경해 준다.

  8. 로컬 db 내용 덤프 후 rds로 보내기

    • mysqldump -u root -p test_db > test_db.sql
    • mysql -h [rds 엔드포인트] -u root -p test_db < test_db.sql

HTTPS 적용

  1. 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로 호출이 가능해진다.
    이 부분을 몰라서 좀 헤맸었다.

서버 구동

  1. 도커 컨테이너 실행

    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 관련 경로 설정을 해 줘야 한다.


대략적으로 배포까지의 과정을 정리해 보았다.
중간에 빠진 내용이 있을 수 있으나
이 플로우를 따라가다가 누락되거나 틀린 부분이 있으면
하나씩 수정해 나가면 될 듯하다.

profile
몰입

0개의 댓글