OCI MySQL HeatWave, Bastion 없이 Tailscale로 접속하기
문제: HeatWave는 프라이빗 서브넷에만 존재한다
Oracle Cloud의 MySQL HeatWave를 사용하면서 한 가지 불편한 점이 있었습니다. HeatWave DB System은 퍼블릭 IP를 부여할 수 없고, 프라이빗 서브넷에만 배치됩니다. 로컬에서 직접 접속할 방법이 없다는 뜻입니다.
OCI에서 공식적으로 제공하는 방법은 Bastion Service입니다. Bastion을 통해 포트 포워딩 세션을 생성하고, SSH 터널로 MySQL에 접속하는 방식입니다.
Bastion Service의 불편함
Bastion을 사용해본 분이라면 공감하실 겁니다. 매번 접속할 때마다 이런 과정을 거쳐야 합니다.
- OCI CLI로 Bastion 세션 생성 (대기 시간 발생)
- 세션 ID를 받아서 SSH 터널 명령어 구성
- SSH 키 인증으로 터널 연결
- 최대 3시간 후 세션 만료 → 다시 1번부터
스크립트로 자동화해두긴 했지만, 근본적인 문제가 있었습니다. 세션이 최대 3시간이면 만료된다는 점, 그리고 SSH 키 형식 문제로 Permission denied (publickey) 에러가 종종 발생한다는 점입니다.
# Bastion 접속 시 자주 보게 되는 에러
Permission denied (publickey).
# 원인: OpenSSH 형식 키 vs PEM 형식 키 불일치
# macOS 최신 버전은 기본적으로 ed25519 키를 생성하는데,
# OCI Bastion은 RSA PEM 형식을 요구
더 간편한 방법이 없을까 고민하다가 Tailscale을 떠올렸습니다.
Tailscale이란
Tailscale은 WireGuard 기반의 메시 VPN입니다. 설치만 하면 각 기기에 100.x.x.x 형태의 고정 IP가 할당되고, 별도 설정 없이 기기 간 직접 통신이 가능합니다. 개인 사용은 100대까지 무료입니다.
핵심 아이디어는 간단합니다. OCI Compute Instance에 Tailscale을 설치하면, 로컬 맥북에서 Compute를 거쳐 HeatWave에 접근할 수 있습니다.
로컬 Mac (Tailscale) ──tailnet──▶ OCI Compute (Tailscale) ──private──▶ HeatWave MySQL
100.x.x.x 100.x.x.x 10.0.1.x:3306
설정 방법
1. OCI Compute Instance에 Tailscale 설치
이미 Coolify 등을 위해 Compute Instance를 운영하고 있다면, 거기에 Tailscale만 추가하면 됩니다.
# Ubuntu 기준
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
설치 후 인증 URL이 나오면 브라우저에서 로그인하면 됩니다. 이제 Compute Instance에 100.x.x.x IP가 할당됩니다.
2. 로컬에서 SSH 터널 연결
Tailscale IP로 Compute에 접속한 뒤, HeatWave 프라이빗 IP로 포트 포워딩합니다.
# Tailscale IP(100.x.x.x)로 SSH 터널
ssh -i ~/.ssh/your-key -L 3307:10.0.1.210:3306 -N ubuntu@100.111.182.8
# 다른 터미널에서 MySQL 접속
mysql -h 127.0.0.1 -P 3307 -u kichang -p
로컬 3306 포트가 이미 사용 중이라면 (Docker MySQL 등) 3307처럼 다른 포트를 사용하면 됩니다.
Bastion vs Tailscale 비교
| 항목 | Bastion Service | Tailscale |
|---|---|---|
| 세션 만료 | 최대 3시간 | 없음 (상시 연결) |
| 매번 세션 생성 | 필요 (OCI CLI) | 불필요 |
| SSH 키 형식 문제 | 자주 발생 | 없음 |
| 비용 | 무료 | 무료 (개인 100대) |
| 전제 조건 | OCI CLI 설치 + 설정 | Compute Instance 필요 |
| 접속 명령어 | 스크립트 필요 (세션 생성 + SSH) | SSH 한 줄 |
Always Free 티어 주의사항
HeatWave를 Always Free 티어로 사용하고 있다면 한 가지 알아둘 것이 있습니다. 7일간 비활동 시 DB가 자동으로 Inactive(중지) 상태로 전환됩니다. 중지 상태에서 14일 이상 방치하면 삭제될 수도 있습니다.
OCI 콘솔에서 수동으로 Start 할 수 있지만, Compute Instance에 cron job을 걸어 하루 한 번 MySQL ping을 보내면 자동으로 활성 상태를 유지할 수 있습니다.
# crontab -e (Compute Instance에서)
0 9 * * * mysqladmin -h 10.0.1.210 -u kichang -p'password' ping
마무리
Bastion Service가 나쁜 것은 아닙니다. OCI 네이티브 도구이고 별도 인프라 없이 사용할 수 있다는 장점이 있습니다. 다만 매번 세션을 생성하고, SSH 키 형식을 맞추고, 3시간마다 재연결하는 과정이 반복되면 점점 피로해집니다.
이미 Compute Instance를 운영하고 있다면 Tailscale을 설치하는 것만으로 훨씬 편한 접속 환경을 만들 수 있습니다. 다만 이 과정에서 예상치 못한 네트워크 충돌 문제를 겪었는데, 그 이야기는 2부에서 이어가겠습니다.
관련 글
macOS에서 OCI HeatWave MySQL 접속하기: Bastion SSH 터널 설정 가이드
Oracle Cloud HeatWave MySQL에 로컬에서 접속하기 위한 OCI CLI 설정과 Bastion SSH 터널 구성 과정을 정리했습니다. API 키 등록부터 터널 스크립트 작성, 트러블슈팅까지 전체 흐름을 다룹니다.
Tailscale로 Coolify 대시보드 보안 강화하기: 오라클 클라우드에서의 설정 경험
Coolify 대시보드가 공인 IP로 열려 있는 보안 문제를 Tailscale 메시 VPN으로 해결한 경험. 오라클 클라우드에서의 설정 과정과 IP 제한의 한계를 넘는 방법을 정리했습니다.
OCI HeatWave MySQL + NestJS 연동: Bastion을 통한 보안 연결 가이드
Oracle Cloud HeatWave MySQL을 로컬 개발 환경에서 안전하게 연결하고, NestJS + TypeORM으로 연동하는 전체 과정. Bastion SSH 터널 설정부터 Security List 트러블슈팅까지 실제 경험을 바탕으로 정리했습니다.