왜 풀 페일오버 안 갔나
홈서버에서 운영 중이던 서비스에 두 번의 사고가 있었다. Flyway 마이그레이션 충돌로 30분 다운타임, 그 며칠 뒤 CI/CD 환경변수 누락으로 또 한 번 부팅 실패. 두 사고 모두 잘 복구했지만 단일 환경 운영의 한계를 직접 체감했다.
문제는 진짜 페일오버는 비쌌다는 거다. ALB가 월 $20, ElastiCache가 월 $12, RDS Multi-AZ가 단일보다 2배. 다 합치면 매월 $80~100. 매출이 없는 MVP 단계에 정당화하기 어려운 비용이었다.
그래서 다른 길을 찾았다. 풀 페일오버의 핵심 가치(쓰기까지 가능한 진짜 페일오버)는 유지하되, 부차적인 자원은 다 빼고 최소한으로 가는 구성. 이걸 "미니 C"라 부르기로 했다.
첫 번째 결정 — VPC 범위와 서브넷
VPC는 10.0.0.0/16로 잡았다. 65,536개 IP가 들어가는 큰 공간인데, 미니 C에선 거의 안 쓴다. 그래도 크게 잡은 이유는 나중에 확장할 여지를 두기 위해서다. VPC CIDR은 한 번 정하면 바꾸기 어렵다.
서브넷은 세 개로 나눴다.
Public Subnet 10.0.1.0/24 (ap-northeast-2a) — EC2가 들어갈 곳
Private Subnet A 10.0.10.0/24 (ap-northeast-2a) — RDS용
Private Subnet C 10.0.11.0/24 (ap-northeast-2c) — RDS subnet group 요구사항
Public 1개 + Private 2개. Private을 2개 만든 이유는 RDS subnet group이 최소 두 AZ를 요구하기 때문이다. 미니 C는 Single-AZ RDS로 가니까 실제로 두 번째 Private은 거의 비어있다. 그래도 만들어야 한다. AWS 요구사항.
서브넷 이름에 AZ 코드(a, c)를 박은 건 가독성 때문이다. 콘솔에서 자원 목록 볼 때 어떤 AZ에 있는지 한눈에 보인다.
두 번째 결정 — NAT Gateway 제외
이게 미니 C의 핵심 비용 절감 포인트다.
NAT Gateway는 Private Subnet에 있는 자원이 인터넷에 나가야 할 때 필요하다. 시간당 $0.045 + 데이터 처리 비용. 한 달 720시간 돌리면 순수 운영비만 월 $33이다. 데이터 전송 비용은 별도.
웹 검색 결과를 봐도 신규 AWS 사용자가 가장 흔하게 당하는 청구서 폭탄이 NAT Gateway다. "Private에 두는 게 안전하니까"라는 일반 권장을 그대로 따르면 작은 프로젝트에서도 매월 $33이 청구된다.
미니 C에선 EC2를 Public Subnet에 직접 배치하기로 했다. EC2 자체가 외부 트래픽을 받아야 하니까(Spring Boot가 HTTPS 서빙) 어차피 Public IP가 필요하다. 그러면 NAT Gateway 없이 EC2가 직접 인터넷과 통신할 수 있다.
문제는 보안이다. Public Subnet에 EC2를 두면 외부 노출 면적이 커진다. 이걸 어떻게 막느냐가 다음 결정이다.
세 번째 결정 — Security Group 참조 방식
Security Group은 두 개를 만들었다.
refit-app-sg는 EC2를 보호한다.
Inbound:
HTTPS (443) ← 0.0.0.0/0 사용자 트래픽
HTTP (80) ← 0.0.0.0/0 HTTPS 리다이렉트용
SSH (22) ← 내 집 IP만 관리용
refit-db-sg는 RDS를 보호한다.
Inbound:
PostgreSQL (5432) ← refit-app-sg
여기서 핵심은 RDS Security Group의 인바운드 소스가 EC2의 IP가 아니라 EC2의 Security Group이라는 점이다.
IP 기반으로 했으면 이런 문제가 생긴다. EC2를 재시작하거나 인스턴스를 교체하면 Private IP가 바뀐다. 그러면 RDS Security Group의 인바운드 규칙도 수동으로 업데이트해야 한다. 운영 사고의 흔한 원인이다.
Security Group 참조 방식은 다르다. "어떤 IP든 refit-app-sg에 속한 자원이면 통과"라는 규칙이라, EC2 IP가 어떻게 바뀌어도 자동으로 권한이 유지된다. EC2를 새로 만들 때도 SG만 같이 붙이면 끝.
SSH 인바운드는 집 IP로 제한했다. 어디서든 SSH 접근하고 싶은 유혹이 있지만, 22번 포트가 전세계에 열려있으면 봇이 매 초 단위로 brute-force를 시도한다. 집 IP가 바뀌면 그때 콘솔에서 바꾸면 된다.
무엇을 잃었나
미니 C의 트레이드오프를 솔직하게 정리해두자.
EC2가 Public Subnet에 있어서 보안 표면이 넓다. 일반 권장은 EC2도 Private Subnet에 두고 ALB만 Public에 두는 구성이다. 미니 C는 ALB를 뺐으니 EC2가 노출된다. Security Group으로 포트를 최소화하고 SSH는 집 IP로 묶어서 보완하지만, 완벽하지 않다.
RDS Single-AZ라 AZ 장애에 취약하다. Multi-AZ로 가면 비용이 2배다. 미니 C 자체가 페일오버 Standby라 또 이중화하는 건 과하다고 판단했다. AZ 전체가 죽으면 RPO 1초 안에 복구가 안 되지만, 그 확률이 충분히 낮다.
ALB를 빼서 SSL 인증서 갱신을 직접 해야 한다. Nginx + Let's Encrypt 조합으로 자동화는 되지만 한 번은 셋업이 필요하다. ALB가 알아서 처리해주는 부분이다.
ElastiCache 없이 페일오버 모드에서 캐시 hit율이 떨어진다. 평상시는 홈서버에서 운영되니까 영향이 없고, 페일오버 모드는 일시적이라 응답 시간 증가는 수용 가능 손실이라고 봤다.
무엇을 얻었나
비용 측면에서는 정식 C의 월 $80~100에서 미니 C의 월 $29로 줄었다. 절감액 약 $50의 출처는 ALB $20, ElastiCache $12, NAT Gateway $33 등이다. 그 중에서도 NAT Gateway 단독으로 월 $33이 가장 크다.
신규 AWS 계정의 $200 크레딧을 6개월 분량이 아니라 약 7개월 분량으로 늘렸다.
운영 측면에서는 Security Group 참조 방식 덕분에 EC2 교체 시 추가 작업이 거의 없다. RDS 자체는 Private이라 직접 노출되지 않으니 IAM과 SG 두 겹의 방어막이 있다.
'인프라' 카테고리의 다른 글
| REST는 되는데 채팅만 안 됐다 — nginx WebSocket 문제 (0) | 2026.05.30 |
|---|---|
| 백업 시스템 완성하기 — 라이프사이클부터 복구 검증까지 (0) | 2026.05.18 |
| PostgreSQL 자동 백업 시스템 구축기: 홈서버 DB를 S3로 (0) | 2026.05.18 |