본문 바로가기

나만무

[EC2 + RDS] EC2 터미널에서 node.js 서버 실행하기

728x90

 

EC2 서버와 RDS DB 연결하기

 

OutGameServer에 DB를 연결해 로그인 등을 구현하려고 한다.

 RDS 인스턴스는 생성했는데 로컬에서 개발할 수가 없었다.

  1. EC2는 public / RDS는 private 인스턴스로 생성했다. -> 보안 상의 이유
  2. 단순히 EC2 터미널에 접속해서 mysql 서버를 여는 건 성공했다.
    • mysql -u [계정] -p -h [DB엔드포인트] → 이 명령어 쓰면 연결됨

인스턴스에 문제가 있는 것은 아니니...방법을 찾아야 했다.

 

  문제 발생

우리는 로컬에서 작업을 해야함. <로컬 작성 → 깃허브 업로드 → EC2 실행> 이런 과정을 거침.

  • 1차 해결 : vs code에서 ssh 연결로 vs code에서 제공하는 UI로 테이블 작성 등이 가능해짐.

 

 

  문제 발생

const connection = mysql.createConnection({
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME
});

 

결국 node.js 코드에서 CRUD를 하려면 mysql.connection에 성공해야함. 그러나 로컬에서 코드로 private 인스턴스에 접근할 수는 없었다. 되어서도 안 되긴 함...

  • 2차 해결 : 결국 RDS가 private에 있기 때문에 로컬 서버에서 연결하기는 불가능.
    gitHub Action이 다른 서버와 연결되어 있기 때문에 하나의 repo를 사용하는 지금은 함부로 건들 수가 없어서 EC2 터미널에서 git clone을 받아 서버를 실행함. 이 단계에서 DB 연결 성공 로그 확인.

    EC2 설치한 모듈 
    • → sudo apt nodejs, npm, mysql-server 등
    • → npm i express, socket.io, mysql 등

 

  과정

! 주의할 점
EC2는 public / RDS가 private이지만, 이 두 인스턴스는 같은 vpc안에 있어야한다.
같은 vpc에 있다면 보안 그룹의 인바운드 규칙만 3306 포트를 열어주도록 설정하면 된다.
vpc를 다르게 열어 삽질한 사람이 알려드립니다...

 

 

원하는 인스턴스를 선택하고 연결 버튼을 누르면 

 

연결할 수 있는 페이지가 나온다. 연결 버튼을 한 번 더 눌러주면 cmd처럼 ubuntu 터미널이 등장한다.

sudo apt install git

 

sudo 명령어로 git을 설치해주고 원하는 repo에서 clone을 받으면 된다.
node 서버를 실행할 때는 위에 적은 명령어들을 다 설치해주고, 오류가 발생하면 또 필요하다는 모듈을 설치해주면 된다.

 

 

  문제 발생

보안 상의 이유로 git에 올라가는 코드에 우리 endpoint나 pw 등을 직접 작성하면 안 된다.

 

! 1차 도전

EC2 터미널에서 nano 명령어를 사용해 .sh 파일을 생성했다.

nano auth.sh

// 내용
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=myuser
MYSQL_PASSWORD=mypassword
MYSQL_DATABASE=mydatabase

 

환경변수로 endpoint, user, pw 등의 정보를 작성하고,

서버 코드에서 host: process.env.MYSQL_HOST 로 접근, 사용했다.

const connection = mysql.createConnection({
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME
});

 

하지만 변수에 접근이 안 되는지, 서버가 계속 localhost로 DB에 접근을 했다. 변수를 읽어오지 못 하는 듯한 상황.

위치가 문제인가 싶어 .sh가 있는 bin 폴더를 여기저기 옮겨봤지만 해결되지 않았다.

 

 

! 2차 도전

EC2 터미널에서 touch .env 라는 명령어를 통해 .env 파일을 생성했다.

 

nano .env 를 통해 중요한 정보를 파일에 작성해 주었다.

아래의 서버 코드와 같이 작성하여 dotenv 패키지를 불러오고, .env 파일을 로드해서 .env에 작성한 정보를 사용해서 서버를 실행했다.

const dotenv = require('dotenv'); dotenv.config();
  • 설치한 모듈 → npm install dotenv

 

 

! 문제발생

서버가 시작되고, DB연결이 성공했지만, 곧바로 연결을 닫는 문제가 생겼다.

  • 해결 : 현재 코드에서 모듈 로딩 시점에 데이터베이스 연결을 생성하고, 모듈 내보내기 직전에 연결을 종료하고 있는 코드를 수정했다. 연결이 종료되면 호출되는 함수가 아니었다...
connection.end((err) => {
    if (err) {
      console.error('Error closing database connection:', err);
      process.exit(1); // 에러 발생 시 프로세스 종료
    }
    console.log('Database connection closed');
  });

 

 

 

 

이렇게 하면 EC2에 적재된 서버에서 RDS에 연결할 수 있다~