nestJS 프로젝트 aws ec2에 직접 배포하기
저번달에 api서버를 nestJS프레임워크로 개발해서 heroku로 배포를 했다.
당시에는 ec2에 대한 개념도 없었고, 인터넷강의에서 lightsail을 사용해서 배포하는데
나는 잘 안되고 해서 aws에 직접 배포하는 것은 포기하고 헤로쿠를 통해 배포를 했다.
아무래도 헤로쿠서버를 통하다 보니 속도가 느려서 불편하기도 했고
이번에 회사에 on-premise방식으로 sentry를 적용하면서 ec2를 다루는데 어느 정도 자신감이 생겨서
다시 한번 ec2에 직접 배포해보고자 한다.
개념은 ec2 인스턴스를 하나 빌려서 ssh로 접속한 뒤에 내 nestJS프로젝트 실행을 위해
자바스크립트 런타임인 node를 설치하고 git으로 내 프로젝트를 클론 받아서 실행시켜 주면 된다.
공부를 하면서 몇 개의 블로그를 봤는데 t2.micro를 사용할 경우 용량문제로 빌드가 실패할 수 있다고 한다.
그래서 로컬에서 빌드를 실행한 후에 git에 deploy용 레포를 만들어서 dist파일을 올려놓고
deploy용 레포를 클론 받아서 설치하기로 했다. 그러면 빌드는 안 해도 된다.
실제로 이렇게 해도 실행이 될지 일단 로컬에서 시뮬레이션을 해보자
deploy용 레포로 이동한 후, npm build는 생략! npm install -> npm run start:prod를 했더니 pm2로 실행된다.
pm2로 실행하기 위해 start:prod 스크립트를 위처럼 수정했다.
deploy용 레포에는 dist, .env, .gitignore, package.json, package-lock.json만 있으면 된다.
이제 준비가 되었으니 실제로 ec2인스턴스를 만들어보자
나는 로컬에서 빌드할거니까 무료로 쓸 수 있는 t2.micro를 당당하게 선택한다.
pem파일을 다운받는다.
인스턴스를 시작했으면 터미널을 켜고 pem파일이 있는 폴더로 이동해서
ssh로 인스턴스에 접속한다.
ssh -i <pem 키 파일 이름> ubuntu@<내 인스턴스 주소>.ap-northeast-2.compute.amazonaws.com
이런 식으로 팝업창에 나오는 그대로 복붙 해서 붙여 넣는다.
그러면 인스턴스에 원격접속된다. 그리고 아래 명령을 통해 crul설치 후 git 도 설치해 주고 node도 설치한다.
sudo apt install curl
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
source ~/.bashrc
nvm install node
여기까지 하고 node -v , npm -v으로 확인 한번 해주고
git clone <아까 만든 deploy 레포 주소> 입력해 주면 깃헙에 로그인하라고 나온다.
비밀번호는 깃헙토큰을 입력해 준다.
그리고 ls를 해보면 나의 deploy용 레포 이름과 같은 폴더가 생겼다.
이제 다했다. 아까 로컬에서 했던 것처럼 의존성을 설치해 주고 start:prod만 해주면 된다.
cd deploy
npm i
npm run start:prod
pm2가 없다고 나온다.
npm i -g pm2
해주고 다시 npm run start:prod 하면 잘 실행된다.
하지만 접속이 안돼서 pm2 log를 보니 데이터베이스 연결 에러가 나고 있었다. 맞다 환경변수를 줘야 한다.
로컬에서는 .env파일을 가지고 있었지만 deploy레포에는 .env파일을 올릴 수가 없다.
우분투 루트에서 ls -al을 찍어보면 .bashrc라는 파일이 있다.
vi ~/.bashrc
를 입력해서 해당 파일을 편집해야 한다. i를 누르면 편집모드로 넘어간다.
그리고 맨 아래로 내려가서 export KEY="value"의 모양으로 환경변수들을 입력해 준다.
다 입력한 뒤에 esc를 1번 눌러서 편집모드를 종료하고 : 누른 뒤에 wq를 입력해서 저장 후 종료 한다.
: 누르고 q만 입력해 주면 저장 안 하고 나가니까 꼭 :wq를 한다.
$ source .bashrc
그리고 변경된 파일을 적용해 준다. 이제 다시 pm2로 node프로그램을 실행해 주면 제대로 실행된다.