AWS ECS(with Fargate), GitHub, DockerHub, CircleCI를 활용해 서비스 자동 배포 하기(1)
Published in
3 min readDec 2, 2019
기존 서비스 배포 시 프로세스의 불편함 점을 파악하고 개선하기 위해 도입한 과정을 총 3편에 걸쳐서 소개하려고 한다.
- 문제점 파악 및 개선방안
- AWS ECS 설정
- Circle CI 설정 및 자동 배포 적용
기존 서비스 배포 시 프로세스
Local 개발
- 기능 개발/수정
- Docker 서버를 띄워서 개발/수정 한 부분 확인
- Github에 Push
Code Review
- Develop branch에 merge 하기 위한 PR 생성
- Reviewer가 Code Review 진행
- Reviewer의 Local에서 Docker 서버를 띄움
- 패키지 업데이트, 환경 변수 수정, DB 마이그레이션 등 반영 된 부분 실행
- 개발/수정 한 부분 확인
- 이상이 없는 경우 merge 승인
Dev 배포
- Dev 서버에 ssh로 접속
- Github에서 Develop branch 소스 Pull
- 패키지 업데이트, 환경 변수 수정, DB 마이그레이션 등 반영 된 부분 실행
- 개발/수정 한 부분 확인 (읽기/쓰기 모두 테스트)
- 이상이 없는 경우 Master branch에 merge 하기 위한 PR 생성 후 merge
Prod 배포
- Prod-temp 서버에 ssh로 접속
- Github에서 Master branch 소스 Pull
- 패키지 업데이트, 환경 변수 수정, DB 마이그레이션 등 반영 된 부분 실행
- 개발/수정 한 부분 확인 (읽기만 테스트 가능, 실 DB 연결 됨)
- 이상이 없는 경우 AMI 이미지 생성
- 생성 된 AMI 이미지를 기반으로 AutoScaling 시작 구성 생성
- 새롭게 만든 시작 구성을 반영하여 AutoScaling 설정 변경 및 인스턴스 개수 2개로 증가 시킴
- 새로운 버전이 반영 된 인스턴스가 Healthy 한 상태가 될 때 까지 기다림
- 새로운 버전의 인스턴스가 모두 연결 되면, 예전 버전의 인스턴스를 모두 제거
불편 했던 점
- 시간이 오래 걸린다.
- 과정이 복잡하다.
- 복잡한 과정 때문에 실수의 여지가 많다.
- 동일하게 반복되는 과정이 많다.
- 일시적으로 만 사용하는 인스턴스가 있다.
- 직접 Dev, Prod 서버에 접속해서 작업해야 한다.
개선 방안
- 동일하게 반복되는 과정을 줄인다. -> Docker 이미지 저장소 사용 (AWS ECR vs Docker Hub) -> Docker Hub 사용
- 컨테이너 자원을 자동으로 관리한다. -> Container Orchestration 사용 (AWS ECS, EKS, Kubernetes 등) -> AWS ECS 사용
- 자원 낭비를 줄인다. -> AWS ECS에서 Fargate 사용
- 자동 통합 테스트 및 자동 배포를 한다. -> CI / CD 툴 사용 (CI / CD Tool 비교) -> CircleCI 사용