배포를 자동화하고, 무중단 배포를 구현해보자 (1)
배포를 자동화하고, 무중단 배포를 구현해보자 (3)
배포를 자동화하고, 무중단 배포를 구현해보자 (4)
1편에서 하나의 서버에서 빌드와 배포를 함께 진행해서 겪은 실패를 바탕으로 빌드와 배포를 분리하게 된 과정에 대해 이야기 하려고 한다.
우선 서버를 하나 더 만들고 그곳에서 빌드를 돌려서 나온 결과물을 배포중인 ec2에 전달하는 구조를 설계하였다.
ec2 서버를 하나 더 만드는 방법과, 빌드 서버를 대신 운영해 주는 서비스 (Travis CI) 등을 이용하는 방법이 있는데 두번째 방법인 빌드 서버를 대신 운영해 주는 서비스를 이용하려고 하였다.
하지만 조건이 있었는데, private 레포에 대해서도 과금이 발생하지 않는 서비스인지가 가장 중요했다. 보통 서비스 중인 레포들은 private로 관리되기도 하고, 리소스를 감당 할 수 있는 상태에서 비용을 최대한으로 줄여, 서비스 해 보자는 것이 프로젝트 목표였기 때문이다.
그래서 찾아 본 결과 빌드 서버를 대신 운영해 주는 서비스들중 private 레포에 대해 무료인 서비스는 존재하지 않았고, 빌드 시간에 따라 과금이 되는 구조라 프로젝트 목표에 어긋나기 때문에 다른 방법을 찾기로 하였다.
다른 방법 중 하나는 ec2 인스턴스를 하나 더 생성하여 빌드 서버로 운영하는 방법이다. 하지만 이 방법도 프리티어 요금제를 사용하고 있는 지금, ec2 서버를 하나 더 만들면 배포 서버에도 영향을 미칠 수 있기 때문에 지금 상태에서는 사용할 수 없었다... 실제 회사였다면 인스턴스 2개 정도 만들 수 있는 여력은 있었을 텐데ㅠㅠ
그래서 그냥 가상환경에 리눅스를 띄우고, 직접 서버를 운영하기로 하였다. ec2도 아마존 리눅스를 사용할 테니 환경 세팅이 비슷하므로 추후에 인스턴스를 늘리더라도 빠르게 다시 세팅 할 수 있도록 하기 위해서였다.
프로그램은 Vmware를 사용하였고 ubuntu 22.04 lts 버전을 사용하였다. 그리고 공유기를 사용중이라면 외부에서 접속 가능하게 하기 위해 포트포워딩 해야한다.
포트포워딩까지 완료 했다면 이런식으로 외부에서 공인 IP로 접근이 가능해진다. 현재 3000번 포트로 get 요청을 받으면 응답하도록 프로그램을 작성해 놓았다.
이제 설치형 CI/CD 도구인 Jenkins를 이용해서 빌드를 자동화 해보자 Jenkins를 선택한 이유는 커뮤니티 풀이 가장 넓고, 많은 플러그인들이 존재해서 쉽게 빌드 자동화 서버를 구축할 수 있기 때문이다.
또한 Jenkins를 도커를 이용해서 이미지를 만들고 컨테이너화 해서 사용했다. 이렇게 하면 Jenkins를 사용하기 위한 많은 설정들을 건너뛰고 컨테이너에서 필요한 의존성 (jenkins, yarn 등등)만 골라 설치하여 환경 설정에 필요한 리소스를 줄일 수 있다는 장점이 있다.
Install Docker Engine on Ubuntu를 참고하여 도커를 설치하고 아래 DockerFile을 통해 젠킨스 컨테이너 이미지를 만들었다.
FROM jenkins/jenkins:lts
# root 사용자로 전환하여 필요한 패키지를 설치
USER root
# AWS CLI와 관련된 의존성 설치
RUN apt-get update && \
apt-get install -y python3-pip python3-venv && \
python3 -m venv /opt/awscli_venv && \
/opt/awscli_venv/bin/pip install awscli
# 환경변수 설정
ENV PATH="/opt/awscli_venv/bin:$PATH"
# Yarn 설치
RUN apt-get update && apt-get install -y curl apt-transport-https --no-install-recommends && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn --no-install-recommends && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 다시 jenkins 사용자로 전환
USER jenkins
해당 파일로 만든 이미지를 실행하고 포트에 접속하면 젠킨스 빌드 설정 페이지에 접근 할 수 있다.
그리고 나서 프로젝트를 빌드 할 때 필요한 플러그인들을 다운로드 해 주었다. Nodejs 환경을 위한 플러그인, AWS 권한을 부여하기 위한 AWS Credentials을 설치해야 한다.
젠킨스를 사용하기 위한 대략적인 설정은 끝났고, 이제 젠킨스 스크립트와 AWS Codedeploy와 연동, 서버 스크립트 작성에 대해 이야기 해 보려 한다.