엘리스 AI트랙 4기/프로젝트

Oracle Cloud 인스턴스에 MySQL 서버 구축_3탄

남쪽마을밤송이 2022. 6. 6. 21:30

2탄에서 이어지는 내용입니다.

 [04 방화벽 설정 ] 

 (1) Oracle Cloud Service 

  • 외부에서 접근시 먼저 인터넷/모뎀에서 접속을 허용해주기 위해 Oracle Cloud 인스턴스의 인바운드 규칙을 설정한다.
  • Oracle 홈페이지에 들어가서 네트워킹 - 가상 클라우드 네트워크를 클릭한다.

  • 해당하는 VCN을 클릭한다.

  • MySQL의 기본 포트번호는 3306이다. 그대로 사용할 것이기 때문에 3306에 대한 모든 IP(외부)의 접속을 허용한다.

 (2) ufw / iptables 

  • 위 설정만 하면 외부 접속에 실패할 것이다. 이번에는 운영체제의 방화벽에서 인바운드 규칙을 설정해줘야 한다.
  • ubuntu에는 두 가지 방화벽이 있다. 가장 많이 사용하는 것은 iptables이지만 iptables의 작업을 간편화 해 주는 소프트웨어가 UFW(Uncomplicated Fire Wall = 복잡하지 않은 방화벽) 이다.
  • ufw를 사용해 MySQL 포트 번호 3306을 허용하고 재시작해준다.
sudo ufw allow out 3306/tcp
sudo ufw allow in 3306/tcp
sudo service mysql restart
sudo ufw status verbose # 방화벽 규칙 추가 확인

  • iptables를 사용하려면 다음과 같은 명령어로 가능하다.
    • 확실히 ufw가 간단하다..!
sudo iptables -I INPUT 1 -p tcp --dport 3306 -j ACCEPT # 3306 포트 허용
sudo iptables -L # 방화벽 규칙 추가 확인

 [05 접속 확인 ] 

 (1) MySQL Workbench 

  • 코드에서 연결하기 전에 외부 접속이 가능한 상태인지부터 확인했다.
  • MySQL Workbench로 접속하는데는 TCP/IP를 이용하는 방법과 SSH을 이용하는 방법으로 두 가지가 있다.
    • 사실 처음에 TCP/IP 방법이 절대 안돼서 구글링하다가 SSH 접속도 가능하다는 것을 알게 되었다😂
  • 먼저 TCP/IP 방식

  • 다음은 SSH 방식
    • SSH Password 대신 SSH Key File에서 저장해뒀던 개인키 파일을 사용해야 한다.
    • Username과 Password는 외부 접속 가능하도록 모든 권한을 줬던 계정 정보이다.

  • 두 가지 방법 모두 위의 과정이 전부 정상적으로 설정되었다면 순식간에 접속 성공한다.
    • 나는 TCP/IP 방법으로 절대 접속이 되지 않았는데 이유는 위에서 언급했듯이 MySQL 설정 파일에서 bind-address만 0.0.0.0으로 변경해줬기 때문이었다. 반드시 mysqlx-bind-address도 변경해줘야 한다.
    • TCP/IP 방식이 불가능하면 코드에서의 접근도 불가능하기 때문에 과정을 차근차근 밟으며 다시 확인하기!

 [06 nodejs express에서 연결 ] 

  • 참고로 나는 typescript와 ORM으로 sequelize를 사용했다.
  • 먼저 db 계층의 index.ts 파일에서 sequelize로 연결 정보를 만들어준다.
    • database 정보는 유출되면 도용의 위험이 있기 때문에 꼭 .env 파일로 관리해준다.
// ~ db/config/config.tx 파일

import dotenv from "dotenv";
dotenv.config();

const config = {
  development : {
      username : process.env.DB_USERNAME || 'root',
      password : process.env.DB_PASSWD,
      database : process.env.DB_DBNAME || 'test',
      host : process.env.DB_HOST || 'localhost',
  }
};

export default config;
// ~ db/models/index.ts 파일

import { Sequelize } from "sequelize";
import config from "../config/config";

const sequelize = new Sequelize(
  config.development.database,
  config.development.username,
  config.development.password,
  {
    host: config.development.host,
    dialect: "mysql",
  }
);

export default sequelize;
  • 그리고 나서 back 아래의 index 파일에서 서버 시작 시에 연결해준다.
// back/index.ts 파일

import app from './src/app';
import sequelize from './src/db/models/index';

import { createServer } from 'http';

const port: number = Number(process.env.PORT) || 5001;

const server = createServer(app);

server.listen(port, async () => {
  console.log(`정상적으로 서버를 시작하였습니다.  http://localhost:${port}`);

  // authenticate 메소드로 연결 확인
  await sequelize
    .authenticate()
    .then(async () => {
      console.log('connection success');
    })
    .catch((e: Error) => {
      console.log(e);
    });
});

export default server;
  • 위의 Workbench 연결 시에 TCP/IP 방식이 성공했다면 문제 없이 연결될 것이다!

 [07 느낀점 ] 

  • 프리티어 조건이 좋아서 선택했지만 Oracle이 점유율은 높지 않기 때문에 정확히 Oracle Cloud Service에 MySQL을 설치하고 사용하는 포스팅을 찾기 어려웠다.
  • 그래도 GCP에 MariaDB를 연결하는 블로그를 참고해 DB용 서버 구축에 성공했다는게 아주 뿌듯하다!!
  • 확실히 dev-ops가 어렵긴 하지만 나름 정보보호학과를 전공하며 배운 VM 다루는 법과 네트워크 지식이 아무 쓸데 없진 않았던 것 같다. 완벽하게 이해하진 못해도 저번 배포부터 해서 하나씩 해보고 성공하니까 재밌다😆