[node.js] express api 서버 - AWS Lightsail에 배포하기

https://quantrader.tistory.com/176

 

[Node.js] Express 프레임워크로 Rest API 서버 만들기

node.js 와 express를 통해 API 서버를 만들어 기존 레거시 서버와 연동 개발을 진행했던 부분을 기록으로 남기려 합니다. SpringFramework Server Node.js + express API 서버, 두 서버 사이에 rest api 통신을 위한

quantrader.tistory.com

https://quantrader.tistory.com/177

 

[Node.js] Express Rest API 서버 - mysql2 sequelize 연동

기존 Express 프레임워크로 API 서버 뼈대를 구축했었는데 이번에는 mysql DB 연동을 진행해보려 합니다. 이번에 추가된 모듈은 dotenv, morgan, mysql2, sequelize, sequelize-cli 총 5개인데요. dotenv 는 환경변수

quantrader.tistory.com

 

 

 

앞서 만든 nodejs + express api 서버를 아마존 AWS Lightsail에 배포하는 작업을 해보고자 합니다.

 

 

아마존 웹서비스 호스팅을 위한 서비스에는 EC2 와 Lightsail  두가지가 있는걸로 일단은 파악했는데 EC2는 지난번 프록시 서버를 띄우면서 셋업해보았고, 이번에는 Lightsail로 호스팅을 진행하려 합니다.

 

두 호스팅의 차이점은 아래 블로그 내용을 통해 확인했으며 간단히 정리하자면

 

Lightsail : 트래픽에 치중하면서 빠르게 웹호스팅을 쓰려면 월과금 방식의 Lightsail이 적당, 사용하다가 무거워진다면 EC2 로 마이그레이션 가능

EC2 : 디테일하게 인프라 옵션을 설정하면서 사용한 만큼 비용을 지불하는 방식에는 EC2가 적당

 

너무 간소화 시킨듯 하니 아래 블로그에서 내용 확인해보시면 좋을듯 합니다.

https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-Lightsail-vs-EC2-%EB%B9%84%EA%B5%90-%EC%96%B4%EB%8A%90%EA%B2%8C-%EC%A2%8B%EC%9D%84%EA%B9%8C

 

☁️ AWS Lightsail vs EC2 비교 어느게 좋을까?

EC2 vs Lightsail 비교 AWS에서는 웹서비스 호스팅을 위해 EC2와 Lightsail 가상 서버 서비스를 제공한다. 둘 다 인스턴스를 생성해서 서비스를 올려봐도 어떤게 내 상황에 맞는 서비스인지 잘 확신이 서

inpa.tistory.com

 

 

Amazon LightSail 은 3개월 무료로 써볼 수 있습니다. 3개월이 지나면 과금이 될테니 으므로 3개월 안에 해지는 알람을 구글캘린더에 설정해두었습니다.

 

 

Lightsail 인스턴스 생성작업

 

 

Create Instance 생성작업을 시작해줍니다.

 

 

 

플랫폼은 Linux/Unix, blueprint는 Node.js 를 선택해줍니다.

3달간 무료로 3.5$, 5$, 10$ 중 하나를 써볼 수 있습니다. 평균으로 5달러 옵션을 선택해 봅니다.

 

인스턴스 생성 버튼을 눌러 인스턴스를 생성해줍니다. 처음에는 Pending 상태이다가 준비가 되면 Running 로 바뀌게 됩니다. 

3달 뒤에는 케밥 메뉴를 눌러 Delete 를 통해 인스턴스 삭제를 해주어야 과금이 이루어지지 않으니 참고하세요

 

 

 

Node-js-1 을 선택해 세부사항 페이지로 들어가봅니다.

Connect 탭에 Connect using SSH를 통해 서버에 접속할 수 있는데 putty 같은 툴 없이 브라우저 방식으로 SSH 접속이 이루어집니다. 신세계네요

 

 

 

Mysql 설치

 

다음 명령어를 순차적으로 입력해줍니다.

 

// 현재 사용 가능한 패키지와 그 버전에 대해서 리스트를 업데이트

$ sudo apt-get update 

 

// GPG

sudo apt-get install -y gnupg

 

 

// 설치 가능 mysql 버전 확인

// https://dev.mysql.com/downloads/repo/apt/ 사이트에서도 .deb 확인 가능

sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb

sudo dpkg -i mysql-apt-config_0.8.26-1_all.deb

 

 

여기까지 실행시키면 설치 화면이 나타납니다

 

최상단 옵션만 선택한 뒤 OK를 누르고 빠져나옵니다.

 

// 패키지 업데이트 재실행

sudo apt update 

// mysql 설치 진행

sudo apt install -y mysql-server

 

루뜨 패스워드 설정 과정이 나옵니다.

 

비밀번호 설정없이 엔터를 누르고 넘어갔네요. 두번째 선택 항목은 Use Legacy 로 시작하는걸 선택하고 설치를 완려해주었습니다.

 

// 루뜨 계정으로 접속

sudo mysql -uroot -p

 

루뜨 비밀번호를 설정하지 않아서 새로이 비밀번호를 설정해줍니다.

alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호입력';

exit

 

이제 MYSQL DB 설정은 끝이 났습니다.

 

이제 깃허브에서 소스 내려받아서 nodejs 를 돌려보아야 겠습니다.

 

 

nodejs + express api 서버 빌드

 

github에서 소스를 내려받아서 실행해보겠습니다.

 

git 주소 https://github.com/eunipapa/quant_api 

clone 명령어로 내려 받습니다.

git clone https://github.com/eunipapa/quant_api 

 

quant_api 폴더가 생성되었습니다.

 

 

기존 아파치 서버가 띄워져 있다면 종료하여야 합니다.

 

sudo /opt/bitnami/ctlscript.sh stop apache
Stopped apache

 

// npm install 명령어와 달리 npm ci 명령어는 package-lock.json 을 참고해 의존성을 설치하고 package.json은 버전 매칭 용도로 사용합니다.

npm ci

 

// db 셋팅

npx sequelize db:create --env production

 

 

pm2 설치 및 app.js 서버 실행

 

서버 데몬을 모니터링하면서 프로세스 종료 시 재실행을 시켜주는 역할을 하며 멀티프로세싱을 지원해주는 모듈입니다.

소스 수정이 있을 경우 git pull 로 소스를 내려받은 후 sudo pm2 reload all 명령어로 서버 재시작 되면서 내용이 반영되도록 합니다.

 

// pm2 설치

npm i pm2

 

package.json 의 script를 아래와 같이 start와 dev 로 변경해서 운영환경에서 pm2로 구동시킬 수 있도록 변경하였습니다.

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "NODE_ENV=production PORT=80 pm2 start app.js -i 0",
    "dev": "nodemon app"
  }

// 서버 실행

npm start 

 

 

그런데 api call을 날려보니 접속 오류가 발생하는 것을 확인했습니다.

 

pm2 monit 명령어로 모니터링 상태를 확인해봅니다.

 

Error : bind EACCES null:80오류가 발생했습니다.

서칭해보니 sudo 명령어로 명령어로 npm start 를 해주어야 했습니다.

 

pm2 kill 명령어로 떠 있는 pm2 프로세스를 종료해줍니다.

 

sudo npm start 

정상적으로 수행되고 또 postman 으로 api 테스트 콜도 정상적으로 진행이 되는 것을 확인할 수 있었습니다.

sudo pm2 monit 명령어로 모니터링 상태를 다시 확인해보니 정상적으로 요청이 들어와 로그가 남는 것을 확인할 수 있었습니다.

 

 

사용자 조회 API 테스트는 아래 링크 통해 가능하십니다.

Get 방식이라 웹브라우저에서 바로 콜해볼수 있네요

 

API 테스트 URL

13.124.54.224/user/list