woowacourse-teams / 2022-f12

개발자의 모든 도구, F12 💻
https://f12.app
81 stars 6 forks source link

[Feature/BE] Github Actions와 Elastic Beanstalk를 활용해서 CICD 무중단 배포를 구축한다. #894

Open yangdongjue5510 opened 1 year ago

yangdongjue5510 commented 1 year ago

issue: #892

작업 내용

  1. Elastic Beanstalk(EB)를 활용해서 하나의 EC2를 Scaling group으로 관리하도록 구축했다.
  2. .github/workflows/backend-eb-deploy.yml에 CD 및 무중단 배포 스크립트를 작성했다. 2-1. source code를 checkout 할 때 서브 모듈도 checkout 하도록 설정했다. 2-2. 현재 시각을 기록해둔다. 2-3. JAR 파일과, Procfile, .ebextension 폴더, .platform 폴더를 deploy 디렉토리에 모아서 zip으로 압축한다. 2-4. beanstalk-deploy 액션을 활용해서 EB에 deploy.zip을 전달한다. 2-4-1. AWS의 IAM을 활용해서 Repository secret에 AWS 리소스에 접근할 수 있는 토큰을 추가한다. 2-4-2. 2-2에서 저장했던 시간을 배포할 버전으로 명시한다. 2-4-3. 배포가 완전히 완료될 때까지 3분 동안 헬스 체크하도록한다. 2-4-3-1. Blue-Green 배포를 한다고 했을 때 EB는 구버전의 EC2를 종료할 때까지 꽤 시간이 걸린다. 2-4-3-2. 구버전 EC2를 종료하는 동안 EB의 상태가 Red, Degraded가 된다. (왜냐면 EB 입장에서는 EC2 인스턴스가 2개인데 활용할 수 있는 EC2는 하나 밖에 없으니 성능 저하 상태라고 간주한다.) 2-4-3-3. EB가 Red 상태에서 beanstalk-deploy는 30초를 기본으로 헬스 체크한다. 이때 30초 동안 Red인 상태면 Github Actions가 실패처리하므로 Green으로 전환될 때까지 최대 3분을 기다리도록 했다.
  3. .ebextension 폴더에는 배포되고 EC2에 설정해야되는 작업을 적어줄 수 있다. 3-1. JAR를 실행하는 스크립트를 EC2에 저장하도록 한다. 3-2. 앱이 생성한 로그파일을 AWS에서 조회할 수 있도록 설정파일을 저장하도록 한다. 3-3. EC2의 타임존을 한국으로 만들어주는 커맨드를 실행하도록 한다.
  4. .platform 폴더에는 nginx 설정파일을 적어줄 수 있다. 4-1. EB의 EC2는 nginx로 리버스 프록시를 설정할 수 있다. 4-2. .platform 폴더에서 설정한 Nginx 설정 파일을 통해 로컬 호스트의 8080 호스트로 포트 포워딩한다. 4-3. 그 외 설정은 EB EC2의 기본 Nginx 설정이다.
  5. Procfile은 배포된 EC2에서 계속 진행되어야 할 프로세스를 명시해준다. 5-1. web이라는 이름으로 appstart 커맨드로 프로세스를 실행한다. 이 프로세스가 계속 진행되는지 EB가 체크한다.