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 다루는 법과 네트워크 지식이 아무 쓸데 없진 않았던 것 같다. 완벽하게 이해하진 못해도 저번 배포부터 해서 하나씩 해보고 성공하니까 재밌다😆
'엘리스 AI트랙 4기 > 프로젝트' 카테고리의 다른 글
[Typescript Express] 로그인 로직에 JWT Token Middleware 적용하기 (0) | 2022.06.09 |
---|---|
[Typescript Express] Sequelize로 MySQL 연결하기 (0) | 2022.06.08 |
Oracle Cloud 인스턴스에 MySQL 서버 구축_2탄 (0) | 2022.06.05 |
Oracle Cloud 인스턴스에 MySQL 서버 구축_1탄 (0) | 2022.06.04 |
Gitlab과 Discord Webhook 연동하기 (0) | 2022.06.02 |