🔥 취지
지난 프로젝트에서 서버와 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:포트 로 접속해야 한다.
'기억 저장소' 카테고리의 다른 글
Docker + nCloud 환경 구성 (2) | 2022.10.28 |
---|---|
[TypeORM] Cannot add or update a child row: a foreign key constraint fails 오류 해결 (0) | 2022.10.09 |
TypeScript + Express 초간단 세팅 (0) | 2022.10.05 |
JS로 JWT 로그인 구현 (Passport.js 미사용) (0) | 2022.10.02 |
[Node.js] 초간단 Github OAuth 인증 구현 (0) | 2022.10.02 |
댓글