전 게시물에서 우리는 EC2 인스턴스에 Code Deploy 관련 설정을 마쳤다.
이제 우리가 우리 프로젝트를 EC2에서 실행시키기 위해 node, npm 등등을 여러 프로그램들을 설치해야 한다.
먼저 안정적이며 비교적 최신 버전의 Node.js 를 설치해야한다.
Node.js 홈페이지에 들어가서 버전을 확인하자.
현재 최신 버전은 19.6.0 버전이지만 18.14.0 버전이 안정적이므로 18.x 버전을 설치할 것이다.
sudo apt update
curl -sL https://deb.nodesource.com/setup_18.x | sudo bash -E -
sudo apt-get install -y nodejs
설치가 완료되었다면 버전을 확인해보자.
node -v
npm -v
다음과 같이 떴다면 성공적으로 설치한 것이다.
만약 패키지 매니저를 yarn으로 사용한다면 yarn을 추가로 설치해주어야 한다.
나는 yarn을 기본적으로 사용하니 yarn을 설치해주자.
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn -y
yarn -v 를 통해 아래와 같이 나온다면 성공적으로 설치된 것이다.
PM2는 Node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 Process Manager로, 어플리케이션을 24/7 동안 켜놓고 또 유지보수 할 수 있도록 도와줄 데몬 프로세스 매니저이다.
Node.js 어플리케이션을 cluster mode 로 실행시킨다거나, 메모리가 넘친다거나, 오류로 인해 프로세스가 종료되는 등의 상황에 직면했을 때 각각의 상황을 사용자가 모두 신경 써서 처리해줄 수도 있지만, 너무 복잡하고 신경 써야 할 일들이 많아진다.
PM2를 이용하면 간단한 설정만으로도 이러한 처리를 손쉽게 해결할 수 있다.
하지만 우리가 pm2를 사용하는 궁극적인 이유는 무중단 배포를 위해 사용한다.
우리 프로젝트를 실행시키고나서 터미널을 종료했을 때에도 프로젝트가 계속 실행 중이어야 한다.
인스턴스를 떠났을 때마다 프로젝트가 종료된다면 계속해서 인스턴스를 켜두어야하고, 이 말은 컴퓨터를 계속 켜두고 있어야 한다는 뜻이다.
이처럼 터미널 세션을 종료하거나 프로세스를 종료하면 같이 종료되는 경우를 포어그라운드 방식 (Foreground) 이라고 한다.
반대로 터미널 세션 종료, 프로세스 종료 여부와 상관 없이 뒷단에서 계속 돌아가는 경우를 백그라운드 방식 (Background) 이라고 한다.
Node.js는 기본적으로 포어그라운드에서 실행이 되므로 이를 백그라운드에서 실행해야 한다.
이때 사용할 수 있는 것이 PM2이다.
sudo 즉, 루트 권한으로 실행해야 Permission Denied 없이 사용할 수 있다.
sudo npm install pm2 -g
로그를 잘 살펴보면 (2023/1월 기준) 9.4.1로 업데이트 하라는 알림이 나온다. 9.4.1로 업데이트 해주자.
sudo npm install -g npm@9.4.1
설치가 완료되었다면 아래 명령어로 버전을 확인해보자.
pm2 -version
위와 같이 뜬다면 성공적으로 설치된 것이다.
pm2는 우리의 ec2에 프로젝트를 넣고 난 후에 실행시킬 예정이니 설치만 하고 넘어가겠다.
우리는 지금까지 인스턴스 설정을 모두 마쳤다.
이제는 Github Actions를 세팅하기 위해 우리 프로젝트에 명령어 파일을 생성해야 한다.
다음과 같이 최상위 디렉토리에 .github > workflows > deploy.yml 순서로 만들자.
그리고나서 deploy.yml 파일을 다음과 같이 작성한다.
main 브랜치에 push가 발생하면 Github Actions가 이를 감지하고 동작을 시작한다.
name: Deploy
on:
push:
branches:
- main #어디로 푸시했을 때 감지할 건지
jobs:
build:
runs-on: ubuntu-20.04 #우분투 버전 체크
steps:
- name: Checkout source code.
uses: actions/checkout@v2
- name: Check Node v
run: node -v
- name: Install Dependencies
run: yarn install --frozen-lockfile
- name: Build
run: yarn build
- name: zip create
run: zip -qq -r ./build.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: |
aws s3 cp --region ap-northeast-2 ./build.zip s3://mytamra-bucket/build.zip #본인 버킷 이름으로 수정
- name: Deploy
run: aws deploy create-deployment
--application-name myTamra-codeDeploy #본인 코드디플로이로 이름 변경
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name myTamra-codeDeploy-group #본인 코드디플로이그룹으로 변경
--s3-location bucket=mytamra-bucket,bundleType=zip,key=build.zip #본인 버킷이름으로 변경
모두 작성했다면 주석은 꼭 꼭 지워주자.
나는 주석을 안 지워서 에러가 계속 발생했는데 이유를 몰라 한참이나 삽질했다,,
Code Deploy가 S3에서 파일을 가져온 다음에 어떻게 할 것인지를 명시해줘야 한다.
최상위 디렉토리에 appspec.yml 파일을 생성하고 아래와 같이 작성한다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/deploy
overwrite: yes
permissions:
- object: /home/ubuntu/deploy
owner: root
group: root
mode: 755
hooks:
AfterInstall:
- location: deploy.sh
timeout: 1000
runas: root
EC2 인스턴스에 저장한 프로젝트를 실행하기 위한 파일을 작성해야한다.
최상위 디렉토리에 appspec.yml 파일을 생성하고 아래와 같이 작성한다.
REPOSITORY=/home/ubuntu/deploy
cd $REPOSITORY
sudo yarn install
sudo pm2 reload all
거의 다 됐다.
이제 프로젝트를 main 브랜치에 푸시해보자.
푸시가 끝나고 나면 Actions 탭에 다음과 같이 우리가 설정했던 작업들이 이루어지는 것을 볼 수 있다.
만약 이 단계에서 에러가 난다면 들여쓰기를 잘못한 건 아닌지, 주석을 삭제하지 않았다던지 꼭 확인해보자.
깔끔하게 완료되었다.
자 이제 AWS Code Deploy로 이동해서 마찬가지로 확인해보자.
성공적으로 배포가 완료되었다!
이제 우리 ec2에 접속해서 pm2로 무중단 실행해보자
터미널로 본인의 ec2에 접속후 아래의 명령어를 통해 파일을 확인해보자.
ls
앞의 단계들이 모두 성공적으로 진행됐다면 deploy라는 폴더가 생성된 걸 확인할 수 있다.
폴더에 접근 후 아래의 명령어를 입력해 실행시켜보자.
cd deploy
sudo pm2 start yarn --name "myTamra" --interpreter bash --watch -- start
위와 같은 사진이 떴다면 성공적으로 실행되고 있는 거다.
가비아에서 구매한 도메인을 통해 우리의 프로젝트가 실행되고 있는지 확인해보자.
잘 실행되고 있다!
마지막으로 확인할 겸 변경사항을 적용해서 main 브랜치로 푸시해보자.
성공적으로 로고가 들어간 모습을 볼 수 있다!
고생하셨습니다~~~