현재 프로젝트 배포는 변경사항이 생기면 EC2 ssh에 접속하여 git pull origin main -> npm run build -> pm2 reload <application_name>의 단계를 거쳐서 변경사항을 반영한다.
하지만 프로젝트 갯수가 늘어나고 관리해야 할 프로젝트가 많아진다면 변경사항을 매번 이렇게 반영해줘야 되는 번거로움이 발생한다.
이러한 번거로움을 해결하기 위해 CI/CD를 적용해보자.
CI/CD 란?
애플리케이션 개발부터 배포까지 과정을 자동화하여 효율적인 서비스 환경을 만드는 것이다.
CI(Continous Integration, 지속적 통합): 주기적으로 새로 생성되고 수정되는 코드들이 자동으로 Merge되고 빌드되고 테스트되는 과정
CD(Continous Delivery, 지속적 제공): CI를 포함하여 배포가 가능한 환경 구성까지 자동화로 이루어지고, 배포 가능 여부를 판단하여 담당자가 직접 수동으로 배포를 하는 방식
CD(Continous Deploy, 지속적 배포): CI를 포함하여 배포가 가능한 환경 구성까지 자동화로 이루어지고, 배포까지 자동화하는 방식
NestJS 프로젝트에 CI/CD를 적용해보자
NestJS + Github Action + EC2 + Code Deploy
Github Action에서 EC2에 배포할 파일을 압축하여 S3에 저장하고 Code Deploy는 S3에 저장된 배포파일을 EC2로 배포한다.
배포 파일을 저장할 S3 버킷을 생성해야 한다.
EC2 SSH 환경에 접속해서 아래와 같은 명령어를 입력해서 설치해주자
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install # ap-northeast-2 기준
chmod +x ./install
sudo ./install auto > /tmp/logfile
# codedeploy-agent가 실행중인지 확인
sudo service codedeploy-agent status
❗️에러발생
발생이유 : 내 EC2에 설치된 Ubuntu 버전은 22.04인데 현재 Code Deploy에서는 20.04버전 까지만 지원을 한다. 22.04 버전은 Ruby를 설치했을 때 3버전으로 설치되는데 현재 3버전은 안정적으로 지원을 하지 않는 것 같다.
Ruby 버전을 다운그레이드해서 해결해보자!
$ rbenv install 2.6.3
$ rbenv global 2.6.3
$ ruby -v
이 과정에서 또 다시 에러가 발생했다.
검색해보니 비슷한 에러를 겪고 있는 사람이 rvm repository에 issue를 등록해놓은 것을 보고 해결법을 따라해보기로 했다.
이 글을 보고 다시 해결해보자!
rvm pkg install openssl
rvm install 2.7.6 --with-openssl-dir=$HOME/.rvm/usr
또 다시 에러가 발생 이번엔 rvm이 설치되지 않아서 발생하는 에러였다.
스택오버플로우에 같은 에러가 있어서 해결법을 따라해보기로 했다.
sudo apt-get install curl
curl -L https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm requirements
역시나 해결은 되지 않았고 rvm 공식문서에 들어가서 찾아보고 드디어 설치를 할 수 있었다.
\curl -sSL https://get.rvm.io | bash
다시 위로 돌아가서
rvm pkg install openssl
rvm install 2.7.6 --with-openssl-dir=$HOME/.rvm/usr
이제 Ruby 버전이 정상적으로 다운그레이드 되었는지 확인해보자
다시 처음으로 돌아가서
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install # ap-northeast-2 기준
chmod +x ./install
sudo ./install auto > /tmp/logfile
# codedeploy-agent가 실행중인지 확인
sudo service codedeploy-agent status
이래도 에러가 발생한다고? 뭘 잘못했을까 오랜 고민을 했다. 역시나 답은 검색이었고 드디어 해결할 수 있는 방법을 찾았다.
좀 더 직관적으로 검색을 하고 이 글에서 해결방법을 찾을 수 있었다.
sudo apt-get install ruby-full ruby-webrick wget -y
cd /tmp
wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb
mkdir codedeploy-agent_1.3.2-1902_ubuntu22
dpkg-deb -R codedeploy-agent_1.3.2-1902_all.deb codedeploy-agent_1.3.2-1902_ubuntu22
sed 's/Depends:.*/Depends:ruby3.0/' -i ./codedeploy-agent_1.3.2-1902_ubuntu22/DEBIAN/control
dpkg-deb -b codedeploy-agent_1.3.2-1902_ubuntu22/
sudo dpkg -i codedeploy-agent_1.3.2-1902_ubuntu22.deb
sudo systemctl list-units --type=service | grep codedeploy
sudo service codedeploy-agent status
드디어 정상적으로 codedeploy-agent가 설치되어 동작중인것을 확인할 수 있다.
Code Deploy 적용을 위해선 EC2에서 S3와 Codedeploy를 이용할 수 있는 권한이 필요하다.
AWSCodeDeployFullAccess / AmazonS3FullAccess 두가지 정책을 가지는 역할을 만들어 주자.
EC2 인스턴스에 접속해서 보안 역할을 수정해주자.
IAM User를 생성해주자.
Code Deploy 애플리케이션을 생성해주자.
배포를 진행하기 위해서는 배포 그룹을 생성해줘야 한다. 만약 환경별로 다르게 배포를 진행하고 싶다면 dev/production 등을 나누어 생성하면 된다.
역할에 아까 만들었던 Role을 추가하면 된다. 정상적으로 만들었다면 값에 뜨는 것을 확인할 수 있다.
Amazon EC2 인스턴스 선택 - 키에 Name을 입력하고 값에 배포할 EC2 인스턴스의 이름을 적어준다. (EC2 콘솔에서 확인가능)일치하는 인스턴스가 1개 이상 표시되면 배포할 EC2가 선택된것이다.
로드 밸런서는 비활성화로 진행한다.
Github action이 S3에 파일을 업로드하고, Codedeploy를 이용하여 배포할 수 있도록 권한을 주어야한다.
이전에 EC2, Codedeploy에 연결한 것은 역할이고, 이번에는 사용자를 생성해줄것이다.
아까 생성해준 ec2의 역할과 마찬가지로 AWSCodeDeployFullAccess / AmazonS3FullAccess 2가지 정책을 연결해준다.
이후 Workflow에서 AWS 연동을 위해 방금 생성한 Access Key ID, Secret Access Key를 변수로 추가해준다.
EC2 SSH 환경에 접속 후
# 설치
$ sudo apt update
$ sudo apt install awscli
# 설치 확인
$ aws help
# 사용자 설정
$ aws configure
AWS Access Key ID [None]: 액세스 키 입력
AWS Secret Access Key [None]: 시크릿 액세스 키 입력
Default region name [None]: 본인 region 입력
Default output format [None]: Enter 입력
여기 까지 EC2, S3, Code Deploy, Github Action을 사용하여 CI/CD를 구축하기 위해 필요한 설정들은 끝이고, 다음엔 Workflow작성과 배포 과정을 진행해보자.
참고링크 : https://suyeoniii.tistory.com/103
https://stackoverflow.com/questions/73301858/aws-codedeploy-agent-not-installing-on-ubuntu-22-04
https://github.com/rvm/rvm/issues/5263
https://blog.francium.tech/setting-up-ruby-2-7-6-on-ubuntu-22-04-fdb9560715f7
https://stackoverflow.com/questions/39643791/no-command-rvm-found-but-there-are-20-similar-ones