본문 바로가기
기억 저장소

[nCloud] 서버와 DB 따로 배포 후 연동

by halls99 2022. 10. 14.

🔥 취지

 

지난 프로젝트에서 서버DB를 하나의 nCloud 인스턴스에 배포하였다.

 

그 결과 서버에서 예기치 않은 오류가 발생하자 DB까지 같이 죽으며 데이터가 의도대로 저장되지 않는 사고가 났고,

 

개선의 필요성을 느껴 이번 프로젝트는 서버와 DB를 각각 배포하여 연결하는 식으로 nCloud를 사용하려고 한다.

 

하여 두 서버를 설정하는 과정을 기록하고자 한다.

 

 

 

⚡ 방법

 

 

🔶 서버 생성

 

우분투 서버를 선택했다.

 

 

 

 

 

🔶 서버 설정

 

미리 만들어둔 VPC, Subnet을 사용하여 설정했다.

 

 

 

 

 

🔶 인증키 생성

 

미리 만들어둔 인증키로 설정했다.

 

 

 

 

🔶  ACG 설정

 

미리 만들어둔 ACG로 설정했다.

 

자세한 ACG 설정은 아래에 나와있다.

 

 

 

 

🔶 서버 생성

 

 

 

 

🔶 서버 생성 완료

 

 

 

 

 

🔶 공인 IP 할당

 

 

 

 

 

 

🔶 내가 접속할 포트를 서버 만들 때 사용했던 ACG에 설정

 

localhost:4000으로 Express를 열기 때문에 허용 포트에 4000번을 설정했다.

 

접근 소스는 0.0.0.0/0 으로 하여 모든 IP로 접속 가능하도록 했다.

 

 

 

 

🔶 MySQL 서버 생성 시작

 

 

 

 

 

🔶 DB 서버 설정

 

DB 엔진 버전은 사용하던 MySQL 버전과 최대한 가까운 버전으로 선택했다.

 

VPC와 Subnet은 위에서 서버 설정할 때 사용했던 VPC, Subnet과 동일하게 설정해야 한다.

 

 

 

 

 

 

🔶 DB 설정

 

HOST에 %를 넣으면 모든 IP에서 접근을 허용한다는 뜻이다.

 

 

 

 

 

🔶 DB 서버 생성

 

 

 

 

 

 

🔶 DB 서버 생성 완료 & Public 도메인 설정

 

로컬에서도 사용하기 위해 Public 도메인을 할당하여 사용한다.

 

Public 도메인은 SSH 접속 시 계속 사용되므로 메모장에 적어두었다.

 

 

 

 

 

🔶 DB 서버의 ACG 설정

 

새로운 ACG가 자동으로 생성되는데, 로컬 환경에서도 DB를 사용하기 위해

 

0.0.0.0/0 3306 으로 ACG의 인바운드를 하나 추가했다.

 

 

 

 

🔶 실험용 Repository 생성

 

 

 

생성 후 로컬에 clone하여 아래 명령어로 모듈을 설치했다.

 

npm init -y

 

npm install express mysql2

 

 

 

 

🔶 실험용 프로젝트 세팅

 

Express 설정과 mysql의 옵션으로 nCloud 서버 안에서 실행될 코드를 작성한다.

 

 

 

데이터베이스는 자동으로 생성되기 때문에 CREATE DATABASE 명령어는 필요 없다.

 

 

// app.js

const express = require("express");
const { pool } = require("./db");
const app = express();

// 4000 포트에서 실행되면 db를 지정하고 test_table 이라는 테이블을 생성
app.get("/", async (req, res) => {
  await pool.query("USE test-db;");
  await pool.query("CREATE TABLE test_table(id INT);");
  res.send("🟢");
});

app.listen(4000, () => console.log("🟢"));

 

// db.js

const mysql = require("mysql2/promise");

// host: DB 서버의 Private 도메인
// user, password, database 모두 이전에 설정한 값으로 세팅
const option = {
  host: "db-cgduk-kr.vpc-pub-cdb.ntruss.com",
  port: 3306,
  user: "halls",
  password: "halls99!",
  database: "test-db",
};

const pool = mysql.createPool(option);

module.exports = { pool };

 

 

 

🔶 서버 접속을 위해 비밀번호 확인

 

이전에 생성한 서버에서 관리자 비밀번호를 확인해 메모장에 저장해둔다.

 

 

 

 

 

🔶 터미널로 SSH 접속

 

아까 할당 받은 공인 IP와 관리자 비밀번호SSH 접속

 

우리는 지금까지 서버 인스턴스, DB 인스턴스 총 2개를 배포했는데,

 

DB 인스턴스로 직접 접속하는 경우는 없고,

 

서버 인스턴스를 항상 경유하여 접속하는 양상임을 알아두자.

 

 

 

 

🔶 서버에 여러가지 설치

 

터미널로 서버 환경 구축은 구글링해도 잘 나오지만 일단 아래 일련의 커맨드대로 해도 작동할 것이다.

 

apt-get update

apt-get install git

// 버전 확인
git --version 

sudo apt-get install curl

// node 설치
curl -sL https://deb.nodesource.com/setup_14.x — Node.js 14 LTS "Fermium" | sudo -E bash -
apt-get install nodejs

// 버전 확인
node -v
npm -v

// mysql 연동 위함
npm install mysql mysql-server

apt install mysql-client-core-5.7

 

 

 

 

🔶 DB 인스턴스 접속

 

mysql -h {Private_도메인} -u {USER_ID} -p --port {PORT}

 

 

 

 

우리가 생성했던 DB가 정상적으로 생성됨을 볼 수 있다.

 

 

 

 

🔶 실험 프로젝트 clone

 

아까 생성했던 실험용 프로젝트를 clone 해온다.

 

이때 비밀번호를 입력하는 경우가 있는데, 이때는 토큰을 입력해야 한다.

 

토큰이 없거나 만료되었다면 다시 생성하자.

 

ghp_KqRNr1eEBIMDi4b뭐시기뭐시기

 

이렇게 생겼다.

 

 

 

 

 

 

🔶 서버 접속

 

clone 한 프로젝트에서 npm install로 모듈을 설치 후 node 명령어로 app.js를 실행한 모습이다.

 

이때 주소 창에 공인IP:포트 로 접속해야 한다.

 

절대 localhost가 아니다.

 

app.js에는 test_table 이라는 이름의 테이블을 생성하는 명령어가 포함되어 있었는데,

 

정말로 테이블이 생겼다면 로컬 - 서버 - DB 모두 연결된 것이다.

 

 

 

 

 

아래를 보면 테이블이 잘 생성된 것을 알 수 있다.

 

 

 

 

 

 

🌞 핵심 요약

 

nCloud에서 서버는 Server로 배포, DB 서버는 Cloud DB for MySQL 로 각각 배포한다.

 

두 인스턴스의 VPC, Subnet은 같아야 한다.

 

DB 서버를 로컬에서도 사용하기 위해 Public 도메인을 설정해 주어야 한다.

 

또한 DB 서버에서 사용되는 ACG(cloud 로 시작하는)의 인바운드 설정에 0.0.0.0/0 으로 모든 IP를 받도록 설정하고,

로컬에서 Express를 여는 포트 번호도 설정해 주어야 한다.

 

마지막으로 주소 창에 localhost가 아니라 할당받은 공인IP:포트 로 접속해야 한다.

 

 

 

 

 

 

 

 

 

 

 

댓글