ALB 없이 구현하는 무중단 서비스: NAT 인스턴스와 Route 53 Private DNS 조합

2026. 4. 6. 07:16·Projects/Side Project

이전에 RDS로 띄우고 5일만에 7만원정도 비용이 나온적이 있었다. 그땐 급하기도 했고, 내가 뭔가 잘못 설정했었겠지 란 생각에 이번 프로젝트에서 최소 비용으로 도전하고 싶었다. 연결 자체는 AWS는 참 쉬운 듯 보였으나 보안을 위해 RDS를 프라이빗 서브넷(Private Subnet)에 넣었더니, 로컬 IntelliJ에서 DB 연결하는 과정이 거의 첩보 작전 수준이었다. SSH 터널링 설정하랴, 보안 그룹(Security Group) 열어주랴 그 외 2일 정도를 이것저것 도전하는 사이 비용이 누가봐도 이대로라면 10만원 넘겠더라. 

"이럴 거면 차라리 가성비로 가자." RDS를 과감히 정리하고, 기존에 이용하던 외부 DB 서비스인 Aiven을 이용하는 걸로 변경했다.

1.가성비 아키텍처: ALB 없이 NAT 인스턴스로 버티기

ALB(Application Load Balancer)는 사용하면 기본적으로 나가는 요금이 있다. 때문에 NAT 인스턴스에 Nginx를 올려서 리버스 프록시로 활용하는 전략을 택했다.

항목 Before (RDS + ALB) After (Aiven + NAT Proxy)
DB AWS RDS (프라이빗) Aiven (외부 매니지드)
로드밸런서 ALB (~$20/월+) Nginx 리버스 프록시
로컬 DB 접근 SSH 터널링 지옥 직접 연결 가능
운영 비용 High Low 

 

2. 주요 장애 포인트와 해결 과정

장애 1: "왜 DB 연결이 안 돼?" (The Config Trap)

현상: 앱은 정상적으로 기동됐으나, The connection attempt failed 에러를 뱉으며 바로 종료됐다.
원인: GitHub Actions에서 TF_VAR로 넘겨준 변수가 EC2의 .service 파일까지 전달되지 않았다.

  • 오타의 저주: 변수 일부를 넣는 과정에서 소문자 l(엘)이 i(아이)로 바뀌어 들어갔다. 폰트 차이 때문에 눈으로는 절대 구분이 안 됐다. 절대 작은 것이라도 복붙 활용을 해야한다..
  • 쌍따옴표 함정: systemd 환경변수 값에 ""가 함께 들어가면서 스프링 부트가 문자열을 그대로 인식해 버렸다.

해결: Terraform 템플릿(.tftpl)을 수정해 변수를 직접 주입하고, 특수문자 이스케이프 처리를 추가해 자동화했다.

장애 2: "죽은 서버의 IP를 붙잡고 있는 Nginx" (The Ghost IP)

현상: 외부 도메인 접속 시 504 Gateway Time-out 발생.

원인: ASG(Auto Scaling Group) 특성상 인스턴스가 교체되면 Private IP가 바뀌는데, Nginx는 옛날 IP(10.0.4.119)를 고집스럽게 찾아가고 있었다.

해결: 처음엔 sed로 IP를 직접 갈아끼우고 reload를 시도했으나, Nginx가 기존 커넥션을 끊지 못하는 문제가 발생했다.

restart를 해야만 IP를 인식했는데 이럴 경우 무중단 서비스를 고려할 경우 비적합한거 같아, cron으로 IP를 가져오려 했으나 어찌된 일인지 먹히지 않았다. 그래서 Route 53 Private Hosted Zone을 구축했다.

 

  1. 내부 전용 도메인 생성: app.internal.moa라는 내부용 주소를 할당한다.
  2. Nginx Resolver 설정: Nginx가 10초마다(valid=10s) 이 도메인의 IP를 새로 조회하게 만든다.
  3. 무중단 갱신: 스크립트가 앱 서버 IP를 감지하면 Route 53의 A 레코드만 업데이트(UPSERT)한다. Nginx는 재시작 없이 자연스럽게 새 IP를 바라본다.

3. 최종 아키텍처 흐름

  1. 배포 단계: GitHub Actions → Terraform → App Instance에 tftpl로 정확한 환경변수 주입.
  2. 추적 단계: NAT 인스턴스의 Cron Job(1분 주기)이 ASG에서 InService인 앱 서버 IP를 탈취.
  3. 등기 단계: 탈취한 IP를 Route 53 Private DNS 레코드에 등기(UPSERT).
  4. 라우팅 단계: 외부 사용자가 접속하면 Nginx가 DNS를 통해 최신 앱 서버로 안내.

이번 프로젝트를 통해 처음 해보는 기술적 도전이 많았다. AI의 도움을 많이 받았지만, 결국 무한 반복되는 에러의 실타래를 푸는 것은 로그를 직접 확인하고 원인을 분석하는 '나의 눈'이었다.

비용을 아끼기 위해 시작한 '가성비' 전략이었지만, 결과적으로는 AWS 인프라의 깊은 곳(Private DNS, Resolver, ASG 스크립트 등)을 직접 만져보며 성장할 수 있었던 소중한 시간이었다.

 

'Projects > Side Project' 카테고리의 다른 글

[TroubleShooting]공연 등록 API 타임아웃과 비동기 처리 도입  (1) 2026.04.12
[V2]카프카(Kafka) 비동기 예매 도입기: 0.05%의 에러율을 0%로 만들다  (1) 2026.03.01
[V2]동시에 예매를 눌렀을 때, 서버는 살아남을 수 있을까? — 부하 테스트와 트랜잭션 최적화 기록  (0) 2026.02.28
[Project] 공연 예매 시스템 대용량 트래픽 대응기: 해결 방안 설계 (V1 → V2)  (0) 2026.02.03
대규모 트래픽 좌석 예매 시스템 설계②_대기열, Redis  (0) 2025.12.27
'Projects/Side Project' 카테고리의 다른 글
  • [TroubleShooting]공연 등록 API 타임아웃과 비동기 처리 도입
  • [V2]카프카(Kafka) 비동기 예매 도입기: 0.05%의 에러율을 0%로 만들다
  • [V2]동시에 예매를 눌렀을 때, 서버는 살아남을 수 있을까? — 부하 테스트와 트랜잭션 최적화 기록
  • [Project] 공연 예매 시스템 대용량 트래픽 대응기: 해결 방안 설계 (V1 → V2)
Dev히다
Dev히다
Java 백엔드 개발자입니다. 안정적인 서비스 운영과 효율적인 인프라 구축에 몰입합니다. 코드가 돌아가는 환경까지 이해하는 엔지니어를 지향합니다. Architecture, TroubleShooting, Tech Log.
  • Dev히다
    Java to Cloud : Dev Note
    Dev히다
  • 전체
    오늘
    어제
    • 분류 전체보기 (186)
      • AI & Future Tech (2)
        • AI Workspace (0)
        • AI Weekly News (0)
        • AI Agent & Automation (0)
        • LLM & RAG (2)
      • Backend Engineering (20)
        • Java & Spring (15)
        • JPA & QueryDSL (5)
      • Data Engineering (4)
        • DBMS & Tuning (3)
        • Redis & Cache (1)
      • Cloud & DevOps (5)
        • AWS Infrastructure (3)
        • Docker & CI CD (2)
      • Algorithm & CS (6)
        • CodingTest (5)
        • Computer Science (1)
      • Projects (12)
        • Side Project (10)
        • Work Experience (2)
      • Troubleshooting (9)
        • Error Log (0)
        • Review (9)
      • Log (0)
        • 내 맘대로 (0)
        • 여행 (0)
        • 요즘 (0)
      • Archive (125)
        • 기술면접 (33)
        • Project (9)
        • Spring (29)
        • Spring_Boot (2)
        • JAVA (5)
        • Servlet_JSP (12)
        • SQL (6)
        • JavaScript (1)
        • HTML_CSS (6)
        • Jquery (3)
        • Mybatis (1)
        • Vue.js (3)
        • 기타 (3)
        • 기타2 (2)
        • 코테대비 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    기술 대비
    CORS
    MVC2
    docker
    스프링
    @Controller
    코테
    Terraform
    인프런
    토이프로젝트
    프레임워크
    redis
    대용량 트래픽
    자바
    MVC
    thread
    인텔리제이
    폐쇄망
    SQL
    aws
    JSP
    Join
    AOP
    @RestController
    공부기록
    프로그래머스
    select
    김영한
    뉴렉처
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Dev히다
ALB 없이 구현하는 무중단 서비스: NAT 인스턴스와 Route 53 Private DNS 조합
상단으로

티스토리툴바