TIL # 124 : [AWS] Node.js로 만든 프로젝트 배포하기(Error Solved!)

셀레스틴 허·2021년 5월 15일
0
post-thumbnail

나의 경우: Django, MySQL 프로젝트를 EC2, RDS를 구축해 배포한 경험이 있다. Express, MySQL, Prisma ORM을 활용한 배포는 처음이다. 해당 글은 EC2 및 RDS 구축이 끝났다는 가정하에 쓴 게시물입니다.

배포 서비스 환경:

  • Node.js 웹 애플리케이션
  • AWS EC2, Ubuntu
  • AWS RDS, MySQL

1. EC2 ubuntu 서버 들어가기

aws 키페어가 있는 디렉토리로 이동한다

명령어:

ssh -i "pem이름.pem" ubuntu@"퍼블릭 IPv4 주소"
ex) ssh -i celestine.pem ubuntu@00.000.000.000

정상적으로 작동할 경우 뜨는 화면:

$ ssh -i celestine.pem ubuntu@00.000.000.000
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-1045-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri May 14 15:00:35 UTC 2021

  System load:  0.0               Processes:             107
  Usage of /:   50.5% of 7.69GB   Users logged in:       0
  Memory usage: 61%               IPv4 address for eth0: 172.31.30.88
  Swap usage:   0%

 * Pure upstream Kubernetes 1.21, smallest, simplest cluster ops!

     https://microk8s.io/

13 updates can be applied immediately.
To see these additional updates run: apt list --upgradable


*** System restart required ***
Last login: Fri May 14 10:00:32 2021 from 222.106.177.9
$ 

이제 exit으로 ubuntu 접속을 나온다.

$ exit 

2. AWS RDS에 DB dump하기

RDS 확인하기

일단 rds 인스턴스 확인

$ mysql -h "DB 인스턴스 엔드포인트" -u root -p
$ Enter password: # 인스턴스 생성시 입력한 비밀번호 입력
mysql> show databases;
mysql> 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
| tmp                |
+--------------------+
mysql> eixt # 나가기

경우 #1) local db에 있는 테이블을 dump해야할 때 -> sql문으로 작성한 파일이 없을 경우

# ploggingcampaign이라는 테이블을 dump하고 싶은 상황:

$ mysqldump -u root -p ploggingcampaign > ploggingcampaign.sql
$ Enter password: # mysql 비밀번호
$ vi ploggingcampaign.sql # 파일 확인 -> 이상 없으면 q! vim으로 나가기

# DB 인스턴스에 DB create하기
$ mysql -h "DB 인스턴스 엔드포인트" -u root -p
$ Enter password: # 인스턴스 생성시 입력한 비밀번호 입력
mysql> create database ploggingcampaign character set utfmb4 collate utfmb4_general_ci;
Query OK, 1 row affected(0.01 sec)
mysql> exit

# 본격 dump:

$ mysql -h "DB 인스턴스 엔드포인트" -u root -p ploggingcampaign < ploggingcampaign.sql
$ Enter password: # 인스턴스 생성시 입력한 비밀번호 입력

# dump확인하기:

$ mysql -h "DB 인스턴스 엔드포인트" -u root -p
$ Enter password: # 인스턴스 생성시 입력한 비밀번호 입력
mysql> show tables;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| ploggingcampaign   | <----- 성공적으로 dump!
| sys                |
| tmp                |
+--------------------+
8 rows in set (0.20 sec)

mysql> exit

경우 #2) local db에 있는 테이블을 dump해야할 때 -> sql 파일이 이미 있는 경우

# sql 파일이 있는 디렉토리로 간다. 

$ mysql -h "DB 인스턴스 엔드포인트" -u root -p ploggingcampaign < "sql 파일 이름".sql
$ Enter password: # 인스턴스 생성시 입력한 비밀번호 입력

# dump확인하기:

$ mysql -h "DB 인스턴스 엔드포인트" -u root -p
$ Enter password: # 인스턴스 생성시 입력한 비밀번호 입력
mysql> show tables;
"Db 확인"
mysql> exit

조금 더 간단해진다 :) 나 같은 경우는 이번 프로젝트 때 데이터베이스 생성, 데이터 값 입력시 raw SQL문으로 진행했기 때문에 경우 #2으로 진행했다.


3. EC2 서버에 node.js 프로젝트

배포 준비

명령어:

ssh -i "pem이름.pem" ubuntu@"퍼블릭 IPv4 주소"
ex) ssh -i celestine.pem ubuntu@00.000.000.000
------ AWS EC2 ubuntu 서버 접속 완료

npm으로 node.js, npm 설치하기

# Node.js, npm 설치하기

$ sudo apt install nodejs
$ sudo apt install npm

# 설치 확인하기

$ node -v
$ npm -v

project git clone하기

# git clone으로 프로젝트 복제하기 

$ git clone "github https 코드"
$ ls # 프로젝트 생성 확인
$ cd "프로젝트 이름"

pacakge 설치하기

# npm install package.json dependency에 정의된 라이브러리 모듈이 모두 설치

$ npm install

(Error Solved!) RDS 데이터베이스 서버에 연결하기

.env 파일을 만들고 그 속에 local project에 있던 .env 파일 내용을 을 복붙해서 넣는다!

나는 .env 파일 속에 Database URL, Port number, jwt salt code가 있다.

$ vi .env 
----- .env 내용 복붙

.env 내용 복붙 완료!!

이제 RDS 데이터베이스 서버로 Database URL 수정하기

나는 DATABASE를 URL으로 설정해줬다: DATABASE_URL="mysql://root:"mysql 접속 비번"@localhost:"포트 번호"/"DB 이름"
그러나 구글링을 해도 아래와 같은 형식을 가진 자료들만 나왔다.. (출처)

MySQL database url, 등등으로 검색해도 검색 내용은 부실했다. (MySQL 공식문서...🥲)

그럼에도 저 형식을 고집해야했던 이유는??
바로 prisma가 저 형식으로 요구하기 때문이다... (아래는 Prisma ORM 공식문서)

코드 치는걸 멈추고 합리적 의심과 logical thinking을 하기 시작한다:
mysql dump 뜰 때도 그렇고 나는 "root"으로 들어가고, 인스턴스 생성시 설정했던 "비밀번호"를 입력했다. URL 앞에 root 그리고 rds 비밀번호를 삽입한다.

POSTMAN으로 ec2서버로 들어가서 데이터베이스 연결 됐는지 확인

# HTTP URL: ec2 DB_인스턴스_엔드포인트 : PORT / 설정했던 URL
ex) http://00.000.000.000:8000/programs

아래 URL은 데이터베이스 속 모든 프로그램을 가져오는 URL이다: 200 OK

마무리

에러 해결 시간 제한을 3시간으로 잡았는데 다행히 딱 맞춰서 에러를 고칠 수 있었다! 자 이제 s3를 해볼까!!!😃

Reference:
https://www.prisma.io/docs/concepts/database-connectors/mysql
https://joshua1988.github.io/webpack-guide/build/npm-module-install.html#npm-%EC%A7%80%EC%97%AD-%EC%84%A4%EC%B9%98-%EC%98%B5%EC%85%98-2%EA%B0%80%EC%A7%80

profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글