서버 배포 자동화하기

tre2man
roubit.me
Published in
4 min readApr 16, 2022

프로덕션 서비스에서 가장 중요한 것은, 지속적이고 안정적인 서비스를 제공하는 것입니다. 이것을 실현하기 위해서는 지속적인 인프라 관리가 필요합니다.

하지만 개발자 입장에선 생산성 향상을 위해 인프라 관리보다는 코드 작성에 집중하고 싶을 것입니다.

이러한 상반되는 의견을 모두 수렴하기 위해서 애플리케이션 자동 배포 시스템을 제작해 보았습니다.🚀

현재 상황

  1. NodeJS 기반의 모놀리식 아키텍쳐 서비스
  2. github에 저장하는 코드
  3. AWS에서 구동되는 서비스

배포 환경 구상

저희는 쿠버네티스를 사용할 만한 복잡한 서비스도 아니고 단지 사용자의 서비스 경험에 불편함을 주지 않으면서, 개발자가 인프라에 할애하는 시간을 줄이고 싶은 것이 목적입니다. 그래서 AWS에서 제공하는 Elastic Beanstalk이라는 서비스를 사용하기로 했습니다! 🤗

배포 플로우 작성하기

구상한 배포 플로우는 다음과 같습니다.

  1. github에 코드를 저장한다.
  2. github hook을 이용해서 jenkins에서 인식을 하게 한다.
  3. docker image를 제작한다.
  4. AWS ECR에 업로드한다.
  5. jenkins에서 elastic beanstalk에 배포 트리거를 보낸다.
  6. ECR에서 이미지를 불러와서 배포를 진행한다.

저희는 CI/CD Tool로 Jenkins를 이용했는데요, 이유는 인스턴스를 직접 생성해서 설정을 할 수 있기 때문에 자유도가 높다고 생각되어서 Jenkins를 사용했습니다.

전체 플로우에 대한 정보가 꽤 많은 편이라서, 주요 기능에 대해서만 작성하겠습니다.

젠킨스 인스턴스 설정

EC2 인스턴스에 Jenkins를 설치하는 법은 아래 링크를 참조했습니다.

젠킨스를 설정하면서 알아두셔야 할 것은, 젠킨스는 master user가 아닌 jenkins user에서 실행된다는 것입니다! 😱 이것때문에 삽질을 조금 했던 기억이 납니다. shell에서 jenkins 유저로 작업을 실행하는 법은 다음과 같습니다.

sudo -u jenkins bash

도커이미지 ECR에 업로드

이것또한 ECR에서 Repo를 새로 하나 만들면, 업로드 코드가 상세하게 나와 있습니다.

파이프라인 만들기

위에서 설명한 모든 작업의 순서를 나타내는 파일 (Jenkinsfile)을 작성해야 합니다. 저는 배포 완료 후 slack메시지를 보내는 작업을 제외한 모든 작업은 shell 명령을 통해서 작성했습니다.

이 파이프라인을 github repo에 저장하거나 jenkins 프로젝트 제작 시에 pipeline을 적용하는 설정에 입력하시면 됩니다!

정리

자동 배포 설정을 마치고, 팀원들의 생산성이 증가했습니다. 백앤드 개발자는 서버 배포를 위해서 따로 시간을 낼 필요가 없고, 자동으로 배포가 되었는지만 확인하면 됩니다. 나중에 서비스가 확장된다면, 쿠버네티스를 통한 배포도 고려해 보면 좋을 것 같습니다.

이 포스트는 개인 블로그의 글을 정리했습니다. 원본은 아래 링크에 있습니다.

--

--