https://quantrader.tistory.com/176
https://quantrader.tistory.com/177
앞서 만든 nodejs + express api 서버를 아마존 AWS Lightsail에 배포하는 작업을 해보고자 합니다.
아마존 웹서비스 호스팅을 위한 서비스에는 EC2 와 Lightsail 두가지가 있는걸로 일단은 파악했는데 EC2는 지난번 프록시 서버를 띄우면서 셋업해보았고, 이번에는 Lightsail로 호스팅을 진행하려 합니다.
두 호스팅의 차이점은 아래 블로그 내용을 통해 확인했으며 간단히 정리하자면
Lightsail : 트래픽에 치중하면서 빠르게 웹호스팅을 쓰려면 월과금 방식의 Lightsail이 적당, 사용하다가 무거워진다면 EC2 로 마이그레이션 가능
EC2 : 디테일하게 인프라 옵션을 설정하면서 사용한 만큼 비용을 지불하는 방식에는 EC2가 적당
너무 간소화 시킨듯 하니 아래 블로그에서 내용 확인해보시면 좋을듯 합니다.
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