OCI MySQL HeatWave, Bastion 없이 Tailscale로 접속하기

정기창·

문제: HeatWave는 프라이빗 서브넷에만 존재한다

Oracle Cloud의 MySQL HeatWave를 사용하면서 한 가지 불편한 점이 있었습니다. HeatWave DB System은 퍼블릭 IP를 부여할 수 없고, 프라이빗 서브넷에만 배치됩니다. 로컬에서 직접 접속할 방법이 없다는 뜻입니다.

OCI에서 공식적으로 제공하는 방법은 Bastion Service입니다. Bastion을 통해 포트 포워딩 세션을 생성하고, SSH 터널로 MySQL에 접속하는 방식입니다.

Bastion Service의 불편함

Bastion을 사용해본 분이라면 공감하실 겁니다. 매번 접속할 때마다 이런 과정을 거쳐야 합니다.

  1. OCI CLI로 Bastion 세션 생성 (대기 시간 발생)
  2. 세션 ID를 받아서 SSH 터널 명령어 구성
  3. SSH 키 인증으로 터널 연결
  4. 최대 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 ServiceTailscale
세션 만료최대 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부에서 이어가겠습니다.

OCIMySQLHeatWaveTailscaleVPN클라우드