V1 → V2 Staging 마이그레이션 4차 리허설 결과 보고서 - 100-hours-a-week/KTB4-4th-wiki GitHub Wiki
목차
- 개요
- 마이그레이션 구성
- 리허설 타임라인
- MySQL 마이그레이션 검증
- PostgreSQL 마이그레이션 검증
- Write Gate 및 Cutover 자동화 검증
- k6 Pre-Cutover 조회 부하 테스트
- ALB 전환 및 최종 라우팅 검증
- Post-Cutover Smoke Test
- 로그인 및 V2 쓰기 검증
- Write Freeze 지속 시간 및 개선 효과
- 모니터링 및 관측성 검증
- 발견된 문제 및 원인 분석
- 한계 및 미검증 항목
- 5차 최종 리허설 개선 계획
- 최종 결론
1. 개요
1.1 목적
3차 리허설에서 확인된 수동 Cutover 절차의 시간적 한계를 개선하기 위해 GitHub Actions 기반 자동화 워크플로우를 적용한다.
V1에서 V2 Staging 환경으로의 데이터베이스 및 트래픽 전환 과정에서 데이터 정합성, 쓰기 차단, 서비스 가용성, 전환 소요 시간 및 전환 이후 정상 동작 여부를 검증한다.
주요 검증 목표는 다음과 같다.
- MySQL DMS Full Load + CDC 기반 데이터 이전 및 최종 동기화
- PostgreSQL Dump/Restore 기반 데이터 이전 및 복원 상태 확인
- GitHub Actions Preflight 및 Cutover 자동화 검증
- Write Gate ON/OFF 동작 및 Write Freeze 120초 이내 달성
- ALB Target Group 가중치 기반 V1 → V2 전환
- 전환 전후 k6 조회 API 정상 동작 확인
- 전환 이후 로그인 및 V2 데이터베이스 쓰기 기능 검증
- 실제 전환 과정의 문제점 도출 및 5차 최종 리허설 개선사항 정리
1.2 리허설 환경
| 항목 | 내용 |
|---|---|
| 수행 일자 | 2026-10-18 |
| 대상 | V1 → V2 Staging |
| V1 | EC2 + Nginx + MySQL + PostgreSQL |
| V2 | ALB + ECS(FE/BE/AI) + RDS MySQL/PostgreSQL |
| MySQL 이전 | AWS DMS Full Load + CDC |
| PostgreSQL 이전 | pg_dump / pg_restore |
| 쓰기 차단 | Staging ALB Write Gate |
| 트래픽 전환 | ALB Target Group 가중치 변경 |
| 대상 도메인 | staging.needu.gift |
| 자동화 | GitHub Actions Staging Migration Preflight / Cutover |
| 부하 테스트 | k6, 10 RPS / 5분 |
| A 담당 | Cindy — DMS, MySQL, PostgreSQL, ECS, 데이터 정합성 |
| B 담당 | Mond — k6, Cutover 실행, ALB/Write Gate 확인, Smoke Test |
1.3 최종 검증 결과
| 검증 항목 | 결과 | 판정 |
|---|---|---|
| Staging Preflight | PASS | PASS |
| Cutover Workflow | Job Success | PASS |
| MySQL DMS | Full Reload 및 CDC 실행 확인 | PASS |
| PostgreSQL | Staging 복원 및 Preflight 통과 | PASS |
| Write Gate ON/OFF | 정상 실행 | PASS |
| Write Freeze | 59초 / 목표 120초 | PASS |
| ALB Backend | V1 0% / V2 100% | PASS |
| ALB Frontend | V1 0% / V2 100% | PASS |
| Write Gate 최종 상태 | OFF | PASS |
| Pre-Cutover k6 | 3,001건, HTTP 실패율 0% | PASS |
| Post-Cutover k6 | 4건, Checks 8/8 | PASS |
| Frontend Smoke | /login HTTP 200 | PASS |
| 로그인 | SQL 수정 이후 정상 동작 확인 | 수정 후 PASS |
| 최종 DB 데이터 정합성 | 최종 검증 상세 결과 미확보 | 확인 필요 |
| 실제 Cutover 중 읽기 서비스 중단 여부 | 지속 측정 미수행 | 미검증 |
| RPO 0 | 성공한 쓰기 요청 전수 대조 미수행 | 미검증 |
종합 판정: Cutover 자동화 및 Write Freeze 목표 달성 / 전환 전후 FE·BE 검증 PASS / DB 최종 정합성 및 Cutover 중 가용성 추가 확인 필요
2. 마이그레이션 구성
2.1 V1 환경
- 단일 EC2 기반 서비스
- Nginx HTTP 라우팅
- Frontend, Backend, AI Server 실행
- MySQL 및 PostgreSQL 직접 설치
- AWS DMS를 통한 MySQL CDC 소스
- ALB Target Group을 통한 V1 트래픽 연결
2.2 V2 Staging 환경
- 공통 ALB 기반 트래픽 수신
- ECS Frontend / Backend / AI Server
- RDS MySQL 및 PostgreSQL
- MySQL DMS Full Load + CDC
- PostgreSQL Dump/Restore
- Staging ALB Write Gate
- GitHub Actions 기반 Preflight / Cutover 자동화
2.3 3차 대비 변경 사항
| 항목 | 3차 | 4차 |
|---|---|---|
| Cutover | 수동 단계별 실행 | GitHub Actions 자동화 |
| Preflight | 수동 상태 확인 | 재사용 가능한 자동 검증 |
| Write Gate | 수동 제어 | Cutover Workflow에서 제어 |
| DMS 중지 | 수동 명령 | 자동 중지 및 상태 대기 |
| MySQL 정책 변환 | 수동 SQL 실행 | Cutover 자동화 |
| ALB 전환 | 수동 | 자동 |
| Gate OFF | 수동 | Target Health 확인 후 자동 |
| Write Freeze | 목표 초과 | 59초 |
2.4 자동화 워크플로우
관련 워크플로우는 다음과 같다.
- Staging Migration Preflight
- Staging Migration Cutover
- Staging ALB Cutover
- Staging Write Gate
- Staging Runtime Control
4차에서는 Staging Migration Cutover 워크플로우를 실행했으며, Preflight PASS를 선행 조건으로 사용했다.
3. 리허설 타임라인
모든 시각은 KST 기준이다.
| 시각 | 단계 | 작업 및 결과 |
|---|---|---|
| 사전 준비 | MySQL | DMS Full Reload 완료 및 CDC 실행 |
| 사전 준비 | PostgreSQL | Staging RDS 복원 및 데이터 구조 검증 |
| 사전 준비 | ECS | V2 서비스 Healthy 확인 |
| Cutover 이전 | k6 | 10 RPS / 5분 조회 부하 테스트 완료 |
| 15:42:23 | Preflight | PASS |
| 15:43:49 | T0 | Write Gate ON |
| 15:43:49~15:44:48 | Cutover | V1 트랜잭션 확인, DMS 중지, MySQL 정책 변환, ALB 전환 및 Target Health 확인 |
| 15:44:48 | T1 | Write Gate OFF |
| Cutover 이후 | Frontend | / → /login, 최종 HTTP 200 확인 |
| Cutover 이후 | Backend | k6 읽기 API 4건, Checks 8/8 성공 |
| 15:49경 | 로그인 | 로그인 문제 확인 및 원인 조사 |
| 15:52경 | 로그인 | SQL 수정 후 정상 동작 확인 |
| Cutover 이후 | ALB | FE/BE V2 100%, Write Gate OFF 확인 |
3.1 주요 소요 시간
| 측정 구간 | 소요 시간 |
|---|---|
| Preflight 완료 → Gate ON | 1분 26초 |
| Gate ON → Gate OFF | 59초 |
| 목표 Write Freeze | 120초 |
| 목표 대비 여유 | 61초 |
Gate ON/OFF 시각은 GitHub Actions Job Summary 기준이다. 각 Cutover 내부 단계별 정확한 소요 시간은 별도 Step 로그가 필요하다.
4. MySQL 마이그레이션 검증
4.1 DMS Full Load 및 CDC
4차 리허설에서는 Staging MySQL 데이터를 초기화한 뒤 DMS Full Reload를 수행하고 CDC 복제를 유지했다.
Cutover 실행 이전에 DMS 상태 및 데이터 이전 조건을 점검했으며, Preflight가 PASS했다.
| 항목 | 결과 |
|---|---|
| 대상 DB | V1 MySQL → V2 Staging RDS MySQL |
| 마이그레이션 | AWS DMS Full Load + CDC |
| 대상 테이블 | 7개 |
| Full Reload | 완료 보고 |
| CDC | Cutover 이전 실행 확인 |
| Preflight | PASS |
| Cutover Job | SUCCESS |
| DMS 최종 Validation 상세 값 | 별도 로그 확인 필요 |
4.2 Cutover 중 DMS 처리
Cutover 자동화에서는 다음 절차를 수행하도록 구성했다.
- Write Gate ON
- V1 MySQL 활성 트랜잭션 확인
- DMS 최종 CDC 및 Validation 상태 확인
- DMS 복제 작업 중지
- DMS Stopped 상태 대기
- V2 MySQL 정책 변환
- ALB 전환
전체 Cutover Job은 성공했다.
단, 개별 DMS Validation 수치 및 최종 소스·타깃 데이터 비교 결과는 Job 상세 로그와 DB 검증 결과를 통해 보완한다.
4.3 V2 MySQL 정책 변환
정책 변환은 Cutover 자동화 단계에서 실행하도록 구성했다.
- 일반 사용자 ACTIVE → ONBOARDING
- 일반 사용자 onboarding_completed / taste_analysis_completed 초기화
- 테스트 사용자 ID 59~78은 ACTIVE 유지
- 사용자 추천 및 분석 관련 데이터 초기화
- 진행 중 AI 대화 상태 정리
Cutover Job은 성공했으나, 로그인 문제 발생 이후 MySQL 초기화 후 필수 SQL 실행 누락이 확인됐다.
따라서 Cutover 성공 여부와 별도로 최종 사용자 상태 및 로그인 관련 데이터가 기대값을 만족하는지 검증해야 한다.
4.4 검증 판정
DMS 및 Cutover 자동 실행: PASS
MySQL 최종 데이터 정합성: 별도 검증 결과 확인 필요
4.5 모니터링 증빙
[Grafana/CloudWatch 캡처 ① — DMS CDC Latency]
- 조회 구간: 2026-10-18 15:35~15:50 KST
- 지표: CDCLatencySource, CDCLatencyTarget
- 확인 목적: Cutover 이전 CDC 지연 상태 및 DMS 중지 전후 변화 확인
5. PostgreSQL 마이그레이션 검증
5.1 Dump 및 Restore
V1 PostgreSQL 데이터를 Staging RDS PostgreSQL로 복원했다.
기존 Catalog 및 Embedding 데이터를 대상으로 pgvector 확장과 주요 DB 구조를 검증했다.
| 항목 | 결과 |
|---|---|
| 이전 방식 | pg_dump / pg_restore |
| 대상 | V2 Staging RDS PostgreSQL |
| 복원 파일 | needu-vector-v3.dump |
| 복원 | 완료 보고 |
| Preflight | PASS |
| pgvector 차원 | 1024 |
| HNSW 인덱스 | Preflight 검증 대상 |
5.2 데이터 행 수
복원 및 사전 검증에서 확인한 테이블 행 수는 다음과 같다.
| 테이블 | 확인된 행 수 |
|---|---|
| catalog_embedding_models | 1 |
| catalog_product_documents | 20,289 |
| catalog_products | 7,969 |
| catalog_sync_runs | 0 |
4개 테이블의 복원 상태를 확인했으며, Preflight도 PASS했다.
다만 이 수치는 사전 복원 검증 기준이다. Cutover 이후 최종 데이터 변경 여부와 V1/V2 값 단위 정합성은 별도 검증 결과가 필요하다.
5.3 검증 판정
PostgreSQL 복원 및 사전 구조 검증: PASS
Cutover 이후 최종 데이터 정합성: 확인 필요
6. Write Gate 및 Cutover 자동화 검증
6.1 적용 방식
4차에서는 Staging ALB Listener Rule을 사용해 쓰기 요청을 차단했다.
Cutover Workflow에서 Write Gate를 활성화한 후 데이터베이스 최종 동기화 및 트래픽 전환을 진행하고, Target Health 확인 후 Gate를 해제했다.
6.2 자동화 실행 순서
- Preflight PASS 확인
- Cutover 사전 조건 확인
- MySQL 연결 및 SSM 터널 준비
- Write Gate ON
- V1 MySQL / PostgreSQL 트랜잭션 확인
- DMS CDC 최종 검증
- DMS 중지 및 Stopped 확인
- MySQL 정책 변환
- ALB Backend V2 전환
- ALB Frontend V2 전환
- Target Health 확인
- Write Gate OFF
- 실행 결과 Summary 기록
6.3 Write Gate ON/OFF 결과
| 이벤트 | UTC | KST |
|---|---|---|
| Gate ON | 06:43:49 | 15:43:49 |
| Gate OFF | 06:44:48 | 15:44:48 |
| 지속 시간 | 59초 | 59초 |
판정: PASS
6.4 실패 시 안전 정책
Cutover Workflow는 Gate ON 이후 오류가 발생하면 무조건 이전 상태로 되돌리는 대신, ALB Gate, DMS, DB 및 Target Group 상태를 확인하도록 설계했다.
V2에서 신규 쓰기가 발생한 이후에는 단순 V1 롤백 시 데이터 불일치가 발생할 수 있기 때문이다.
이번 실행에서는 Cutover Job이 성공했으며 Gate OFF까지 완료했다.
6.5 자동화 증빙
[GitHub Actions 캡처 ② — Staging Migration Cutover]
- Workflow: Staging Migration Cutover
- Preflight: PASS
- Cutover Job: SUCCESS
- Write Gate ON: 15:43:49 KST
- Write Gate OFF: 15:44:48 KST
- Write Freeze: 59초
7. k6 Pre-Cutover 조회 부하 테스트
7.1 테스트 구성
| 항목 | 설정 |
|---|---|
| 도구 | Grafana k6 |
| 대상 | https://staging.needu.gift |
| 테스트 시점 | Cutover 이전 |
| 목표 RPS | 10 |
| 지속 시간 | 5분 |
| API | 친구 목록, 친구 상세, 개인 추천, 선물 추천 |
| 테스트 유형 | 인증된 조회 API |
| 결과 파일 | results/20261018T063203Z/summary-export.json |
7.2 테스트 결과
| 지표 | 결과 |
|---|---|
| 총 HTTP 요청 | 3,001건 |
| HTTP 실패율 | 0% |
| Checks | 6,002 / 6,002 성공 |
| API 성공률 | 100% |
| Dropped iterations | 0건 |
| p95 | 27.798ms |
| p99 | 56.956ms |
| k6 종료 코드 | 0 |
판정: PASS
7.3 결과 분석
Cutover 이전 Staging 조회 API에서 3,001건의 요청이 정상 처리됐으며, HTTP 실패와 Dropped iterations는 발생하지 않았다.
p95는 27.798ms, p99는 56.956ms로 측정됐다.
따라서 Cutover 이전 서비스의 조회 기능이 정상적으로 동작하는 것을 확인했다.
단, 해당 테스트는 Cutover 이전에 종료됐으므로 실제 Gate ON~OFF 구간의 서비스 가용성을 입증하지는 않는다.
7.4 모니터링 증빙
[Grafana 캡처 ③ — Pre-Cutover k6 HTTP RPS]
- 조회 구간: Cutover 이전 5분
- 지표: HTTP RPS
- 목적: 10 RPS 부하 유지 여부 확인
[Grafana 캡처 ④ — k6 HTTP p95/p99 및 실패율]
- 조회 구간: Cutover 이전 5분
- 지표: p95, p99, HTTP 실패율
- 목적: 전환 이전 조회 성능 및 오류 여부 확인
8. ALB 전환 및 최종 라우팅 검증
8.1 전환 방식
4차에서는 DNS 변경 대신 Staging ALB Listener Rule의 Target Group 가중치를 변경하는 방식을 적용했다.
8.2 Backend 라우팅
| 항목 | 값 |
|---|---|
| Listener | HTTPS 443 |
| Priority | 5 |
| Host | staging.needu.gift |
| Path | /api/v1/* |
| V1 Target Group | needu-staging-v1 |
| V1 Weight | 0 |
| V2 Target Group | needu-staging-be |
| V2 Weight | 100 |
8.3 Frontend 라우팅
| 항목 | 값 |
|---|---|
| Listener | HTTPS 443 |
| Priority | 20 |
| Path | /* |
| V1 Target Group | needu-staging-v1 |
| V1 Weight | 0 |
| V2 Target Group | needu-staging-fe |
| V2 Weight | 100 |
추가로 Backend Priority 10 규칙과 Default 규칙 역시 V2 Target Group으로 전달하도록 설정돼 있었다.
8.4 Write Gate 최종 상태
ALB HTTPS Listener Rule 조회 결과, 쓰기 API를 차단하는 fixed-response HTTP 503 규칙이 확인되지 않았다.
- Backend V2 100%
- Frontend V2 100%
- Write Gate OFF
판정: PASS
8.5 모니터링 증빙
[Grafana 캡처 ⑤ — V2 ALB RequestCount]
- 조회 구간: 2026-10-18 15:35~16:00 KST
- 지표: RequestCount
- 대상: V2 ALB 및 Target Group
- 목적: Cutover 이후 V2로 요청이 유입됐는지 확인
[Grafana 캡처 추가]
[Grafana 캡처 ⑥ — ALB/Target 5xx]
- 조회 구간: 2026-10-18 15:35~16:00 KST
- 지표: HTTPCode_ELB_5XX_Count, HTTPCode_Target_5XX_Count
- 목적: Cutover 전후 ALB 및 애플리케이션 오류 확인
9. Post-Cutover Smoke Test
9.1 Frontend Smoke Test
Cutover 이후 staging.needu.gift에 요청을 전송했다.
| 요청 | 결과 |
|---|---|
| GET / | HTTP 307 |
| Redirect Location | /login |
| GET /login | HTTP 200 |
| 최종 URL | https://staging.needu.gift/login |
로그인 페이지까지 정상적으로 접근되는 것을 확인했다.
판정: PASS
9.2 Backend Smoke Test
Cutover 이후 k6로 인증된 조회 API를 검증했다.
| 항목 | 결과 |
|---|---|
| Iterations | 4 / 4 |
| HTTP 요청 | 4건 |
| HTTP 실패율 | 0% |
| Checks 성공 | 8 |
| Checks 실패 | 0 |
| API 성공률 | 100% |
| Dropped iterations | 0 |
| k6 종료 코드 | 0 |
| 결과 파일 | results/20261018T064717Z/summary-export.json |
판정: PASS
9.3 결과 분석
전환 이후 Frontend 로그인 페이지가 정상적으로 응답했고, Backend 조회 API 4건도 모두 성공했다.
따라서 전환 후 FE/BE 기본 접근 및 조회 기능은 정상적으로 동작했다.
다만 Smoke Test는 제한된 요청 수의 기능 검증이므로 전체 API 및 서비스 가용성을 보장하지 않는다.
10. 로그인 및 V2 쓰기 검증
10.1 로그인 문제 발생
Cutover 이후 로그인 기능에서 문제가 보고됐다.
15:49 KST경 Cindy가 로그인 실패 현상을 확인하고 원인을 조사했다.
10.2 원인 및 조치
Cindy 확인 결과, MySQL 초기화 이후 필요한 SQL 실행이 누락된 것으로 파악됐다.
해당 SQL을 적용한 이후 로그인 기능이 정상 동작한다고 보고됐으며, Mond도 로그인 정상 동작을 확인했다.
| 항목 | 결과 |
|---|---|
| 로그인 초기 상태 | 실패 현상 보고 |
| 추정 원인 | MySQL 초기화 후 필수 SQL 실행 누락 |
| 조치 | 누락된 SQL 적용 |
| 수정 이후 | 로그인 정상 확인 |
| 5차 반영 | 필수 SQL 실행 및 검증 절차 추가 |
10.3 쓰기 검증 범위
로그인 성공은 인증 흐름이 동작한다는 근거다.
그러나 V2 RDS MySQL의 auth_sessions 신규 INSERT나 다른 테이블의 실제 쓰기 결과를 확인한 SQL 증빙은 아직 확보되지 않았다.
PostgreSQL에 대한 신규 쓰기 검증 결과도 별도 확인이 필요하다.
판정: 로그인 수정 후 PASS / DB 직접 쓰기 검증은 확인 필요
11. Write Freeze 지속 시간 및 개선 효과
11.1 4차 측정 결과
| 항목 | 결과 |
|---|---|
| Write Gate ON | 15:43:49 KST |
| Write Gate OFF | 15:44:48 KST |
| Write Freeze | 59초 |
| 목표 | 120초 이내 |
| 목표 대비 여유 | 61초 |
| 목표 시간 사용률 | 약 49.2% |
판정: PASS
11.2 3차 대비 개선
3차에서는 수동 Cutover 절차로 인해 Write Freeze 목표를 초과했다.
4차에서는 Preflight와 Cutover를 자동화해 Gate ON 이후 수행해야 하는 작업을 순차적으로 처리했다.
그 결과 Write Freeze를 59초로 단축했다.
단, 3차의 정확한 Gate ON 시각이 확인되지 않아 단축률을 정밀하게 계산하지 않는다.
11.3 개선 원인
주요 개선 요소는 다음과 같다.
- Preflight를 Gate ON 이전에 수행
- V2 ECS 및 PostgreSQL 사전 준비
- DMS 최종 확인 및 중지 자동화
- MySQL 정책 변환 자동화
- ALB Target Group 전환 자동화
- Target Health 확인 후 Gate OFF 자동화
11.4 실제 서비스 중단 시간과의 차이
Write Freeze 59초는 ALB Write Gate ON~OFF 사이의 시간이다.
이는 쓰기 차단 구간을 의미하며, Frontend 또는 읽기 API 전체가 중단된 시간과 동일하지 않다.
Cutover 중 지속적으로 실행된 k6 조회 테스트 결과가 없으므로 실제 읽기 서비스 중단 여부는 별도 검증이 필요하다.
12. 모니터링 및 관측성 검증
12.1 모니터링 목적
4차 리허설에서는 Cutover 자동화 실행 시점과 인프라 상태를 비교하기 위해 Grafana 및 CloudWatch 지표를 활용한다.
주요 확인 대상은 다음과 같다.
- DMS CDC 지연 및 중지 상태
- ALB RequestCount 및 5xx
- ALB Target Group Healthy 상태
- ECS Running/Pending Task
- V1 Nginx HTTP 요청량 및 상태 코드
조회 기준 구간은 2026-10-18 15:35~16:00 KST로 설정한다.
기준 이벤트는 다음과 같다.
| 이벤트 | 시각(KST) |
|---|---|
| Preflight PASS | 15:42:23 |
| Write Gate ON | 15:43:49 |
| Write Gate OFF | 15:44:48 |
12.2 DMS CDC Latency
12.2.1 확인 지표
- CDCLatencySource
- CDCLatencyTarget
- DMS Replication Task 상태
조회 구간: 2026-10-18 15:35~15:50 KST
12.2.2 확인 목적
Write Gate 적용 이전 MySQL CDC 지연이 안정적으로 유지됐는지 확인한다.
또한 Gate ON 이후 최종 CDC 동기화 및 DMS 중지 시점의 변화를 확인한다.
12.2.3 관측 결과
| 항목 | 결과 |
|---|---|
| CDC Source Latency | Grafana 확인 필요 |
| CDC Target Latency | Grafana 확인 필요 |
| Cutover 직전 지연 상태 | 확인 필요 |
| DMS 중지 시점 | Workflow 로그와 대조 필요 |
| Cutover Job | SUCCESS |
[Grafana/CloudWatch 캡처 ⑦ — DMS CDC Latency]
판정: Cutover 자동화 성공 확인 / 세부 지표 확인 필요
12.3 ALB RequestCount 및 5xx
12.3.1 확인 지표
- RequestCount
- HTTPCode_ELB_5XX_Count
- HTTPCode_Target_5XX_Count
조회 구간: 2026-10-18 15:35~16:00 KST
12.3.2 확인 목적
Cutover 전후 ALB로 유입된 요청량과 오류 발생 여부를 확인한다.
특히 ALB 자체에서 발생한 5xx와 Backend Target에서 발생한 5xx를 구분한다.
12.3.3 관측 결과
| 항목 | 결과 |
|---|---|
| Cutover 이전 RequestCount | 확인 필요 |
| Cutover 이후 RequestCount | 확인 필요 |
| ALB 5xx | 확인 필요 |
| Target 5xx | 확인 필요 |
| ALB 최종 라우팅 | V2 100% 확인 |
[Grafana 캡처 ⑧ — ALB RequestCount]
[Grafana 캡처 ⑨ — ALB/Target 5xx]
ALB가 Write Gate로 직접 반환한 fixed-response 503은 Target 5xx로 집계되지 않는다. 따라서 ALB/Target 5xx 그래프만으로 쓰기 차단 요청 수를 정확히 확인할 수는 없다.
판정: ALB 라우팅 전환 PASS / 요청량 및 오류 지표 확인 필요
12.4 ALB Target Health
12.4.1 확인 지표
- HealthyHostCount
- UnHealthyHostCount
대상 Target Group:
- needu-staging-fe
- needu-staging-be
조회 구간: 2026-10-18 15:35~16:00 KST
12.4.2 확인 목적
Cutover 이전 V2 Target Group이 Healthy 상태였는지 확인한다.
또한 트래픽 전환 과정에서 Healthy Target이 유지됐는지 검증한다.
12.4.3 관측 결과
| 항목 | 결과 |
|---|---|
| FE HealthyHostCount | 확인 필요 |
| BE HealthyHostCount | 확인 필요 |
| FE UnHealthyHostCount | 확인 필요 |
| BE UnHealthyHostCount | 확인 필요 |
| Cutover Workflow | Target Health 검증 후 SUCCESS |
[Grafana 캡처 ⑩ — ALB Target Group Health]
판정: Workflow 검증 PASS / 시계열 지표 확인 필요
12.5 ECS Running/Pending Task
12.5.1 확인 지표
- RunningTaskCount
- PendingTaskCount
- CPUUtilization
- MemoryUtilization
대상:
- Staging Frontend ECS Service
- Staging Backend ECS Service
- Staging AI ECS Service
조회 구간: 2026-10-18 15:35~16:00 KST
12.5.2 확인 목적
Cutover 과정에서 ECS Task가 정상적으로 유지됐는지 확인한다.
또한 트래픽 전환으로 인한 Task 재시작, Pending 증가 및 리소스 사용량 변화를 관측한다.
12.5.3 관측 결과
| 항목 | 결과 |
|---|---|
| FE RunningTaskCount | 확인 필요 |
| BE RunningTaskCount | 확인 필요 |
| AI RunningTaskCount | 확인 필요 |
| PendingTaskCount | 확인 필요 |
| CPUUtilization | 확인 필요 |
| MemoryUtilization | 확인 필요 |
[Grafana 캡처 ⑪ — ECS Running/Pending Task]
[Grafana 캡처 추가]
판정: 시계열 지표 확인 필요
12.6 V1 Nginx RPS 및 HTTP 상태 코드
12.6.1 확인 지표
- HTTP RPS
- HTTP 2xx
- HTTP 4xx
- HTTP 5xx
조회 구간: 2026-10-18 15:35~16:00 KST
12.6.2 확인 목적
ALB V1 → V2 전환 전후 V1 Nginx에 유입되는 요청량 변화를 확인한다.
또한 Cutover 중 HTTP 503 발생 여부를 확인해 쓰기 차단과 실제 서비스 오류를 구분한다.
12.6.3 관측 결과
| 항목 | 결과 |
|---|---|
| Cutover 이전 V1 RPS | 확인 필요 |
| Cutover 이후 V1 RPS | 확인 필요 |
| HTTP 5xx | 확인 필요 |
| Write Gate 관련 503 | ALB 및 Nginx 로그 구분 필요 |
[Grafana 캡처 ⑫ — V1 Nginx RPS 및 HTTP 상태 코드]
ALB에서 직접 반환한 503은 V1 Nginx까지 전달되지 않으므로 Nginx Access Log에 기록되지 않을 수 있다.
판정: Grafana 및 로그 확인 필요
12.7 관측성 검증 요약
| 모니터링 항목 | 검증 목적 | 현재 상태 |
|---|---|---|
| DMS CDC Latency | 최종 동기화 상태 | 세부 지표 확인 필요 |
| ALB RequestCount | V2 트래픽 유입 | 최종 라우팅 확인, 지표 확인 필요 |
| ALB/Target 5xx | 전환 중 오류 여부 | 확인 필요 |
| ALB Target Health | Healthy Target 유지 | Workflow PASS, 지표 확인 필요 |
| ECS Running/Pending | Task 정상 유지 | 확인 필요 |
| Nginx RPS/HTTP Code | V1 트래픽 변화 | 확인 필요 |
| Write Gate ON/OFF | 쓰기 차단 지속 시간 | 59초, PASS |
13. 발견된 문제 및 원인 분석
13.1 MySQL 초기화 후 SQL 실행 누락
13.1.1 현상
Cutover Workflow는 성공했지만, 전환 이후 로그인 실패 현상이 발생했다.
13.1.2 원인
MySQL 초기화 이후 필요한 SQL 실행이 누락된 것으로 확인됐다.
현재 확인된 내용만으로는 누락된 SQL이 리허설 사전 준비용인지, 실제 Cutover 과정에서 필수적으로 실행해야 하는 SQL인지 구분되지 않는다.
13.1.3 조치
누락된 SQL을 적용한 뒤 로그인 정상 동작을 확인했다.
13.1.4 개선 방향
- MySQL 초기화 및 필수 SQL 실행 순서 명문화
- 리허설 사전 준비용 SQL과 Cutover 정책 변환 SQL 구분
- Preflight에서 필수 데이터 및 사용자 상태 검증
- SQL 실행 누락 시 Cutover 진행 차단
- Cutover 이후 별도 수동 수정 없이 로그인 정상 동작 확인
13.2 k6 Threshold 판정 문제
13.2.1 현상
k6 Summary에서 Threshold 판정이 false로 출력됐다.
그러나 실제 측정값은 다음과 같았다.
| 항목 | 결과 |
|---|---|
| Pre-Cutover HTTP 실패율 | 0% |
| Pre-Cutover Checks | 6,002/6,002 |
| Post-Cutover HTTP 실패율 | 0% |
| Post-Cutover Checks | 8/8 |
| Dropped iterations | 0 |
| k6 종료 코드 | 0 |
13.2.2 분석
실제 측정 지표와 Threshold 판정 결과가 일치하지 않았다.
현재 결과만으로 Threshold false의 정확한 원인을 확정할 수 없다.
13.2.3 개선 방향
- k6 Threshold 정의 확인
- k6 실행 버전 및 Summary JSON 구조 확인
- Threshold 판정 로직 검증
- 원본 측정값과 자동 PASS/FAIL 결과 비교
13.3 Cutover 중 서비스 가용성 측정 부족
13.3.1 현상
Cutover 이전과 이후의 k6 테스트는 정상적으로 완료됐다.
하지만 Gate ON~OFF 구간에서 지속적으로 조회 요청을 발생시킨 테스트 결과가 없다.
13.3.2 영향
Write Freeze 59초는 확인됐지만, 실제 읽기 서비스가 중단됐는지 여부는 판단할 수 없다.
13.3.3 개선 방향
5차에서는 Cutover 시작 이전부터 완료 이후까지 k6 조회 부하를 지속 실행한다.
다음 지표를 수집한다.
- HTTP 요청 성공률
- HTTP 5xx 발생 건수
- p95/p99 응답시간
- 실패 발생 시각
- 연속 실패 지속 시간
- 의도적인 쓰기 차단 503과 실제 읽기 장애 구분
13.4 관측성 증빙 부족
13.4.1 현상
GitHub Actions Job Summary와 k6 Summary는 확보했지만, Cutover 시점의 Grafana 지표는 추가 확인이 필요하다.
13.4.2 개선 방향
- Grafana에 Gate ON/OFF 시각 표시
- DMS CDC Latency 및 ALB 5xx 그래프 확보
- ALB Target Group별 HealthyHostCount 확인
- ECS Task 수 및 리소스 사용량 비교
- k6 Summary와 Grafana 지표 대조
14. 한계 및 미검증 항목
14.1 RPO 0 미확정
DMS 및 PostgreSQL 복원 검증을 수행했지만, V1에서 성공 응답을 받은 모든 쓰기 요청과 V2 저장 결과를 전수 대조하지 않았다.
따라서 RPO 0은 확정할 수 없다.
14.2 Cutover 중 읽기 서비스 가용성
Pre-Cutover 및 Post-Cutover k6 결과는 정상이다.
그러나 Gate ON~OFF 동안 지속적으로 읽기 요청을 발생시킨 테스트가 없어 실제 서비스 전체 중단 여부를 확정할 수 없다.
14.3 Write Gate 차단 완전성
ALB Write Gate ON/OFF 자동화와 최종 OFF 상태는 확인했다.
다만 대표 POST/PUT/PATCH/DELETE 요청에 대해 차단 중 HTTP 503을 반환했는지에 대한 개별 증빙은 확보되지 않았다.
14.4 DB 최종 데이터 정합성
MySQL DMS 및 PostgreSQL 복원은 사전 검증을 통과했다.
그러나 Cutover 이후 최종 데이터 정합성 및 실제 신규 쓰기 반영 결과는 별도 확인이 필요하다.
14.5 롤백 제한
V2에서 신규 쓰기가 발생한 이후에는 단순히 ALB 가중치를 V1로 되돌리면 데이터 불일치가 발생할 수 있다.
롤백 여부는 DMS 상태, V1/V2 데이터 차이 및 신규 쓰기 발생 여부를 확인한 후 결정해야 한다.
15. 5차 최종 리허설 개선 계획
15.1 개선 항목
| 개선 항목 | 적용 방향 | 검증 기준 |
|---|---|---|
| Prod 인프라 | Prod 환경 설정 및 사전 검증 | ECS/RDS/ALB Healthy |
| Prod Workflow | Preflight/Cutover 자동화 | 각 단계 PASS |
| MySQL 초기화 | 필수 SQL 실행 및 검증 자동화 | 누락 없이 로그인 성공 |
| PostgreSQL | 최종 데이터 및 구조 검증 | 테이블·구조 정합성 |
| Write Freeze | Gate ON/OFF 자동 계측 | 120초 이내 |
| ALB 전환 | V1 0% / V2 100% | FE/BE 전환 확인 |
| Cutover 중 조회 부하 | k6 지속 실행 | 실제 5xx 및 중단 구간 측정 |
| 쓰기 차단 | 대표 쓰기 API별 검증 | Gate ON 차단 확인 |
| 쓰기 재개 | 실제 API 및 DB 반영 검증 | Gate OFF 이후 INSERT/UPDATE 성공 |
| 로그인 | 별도 수동 수정 없는 인증 성공 | 로그인 정상 |
| k6 Threshold | 판정 로직 수정 | Summary와 판정 일치 |
| 모니터링 | Grafana/CloudWatch 지표 확보 | Cutover 시점별 증빙 |
| 롤백 | V2 쓰기 전후 정책 분리 | 데이터 유실 방지 |
15.2 Prod 환경 및 워크플로우 구성
4차 Staging Cutover 자동화 검증 결과를 바탕으로 Prod 환경을 구성한다.
Prod 환경에 적용할 주요 항목은 다음과 같다.
- Prod ECS/RDS/ALB 설정 검증
- Prod Preflight Workflow 구성
- Prod Cutover Workflow 구성
- Prod Write Gate 및 ALB 전환 절차 검증
- Prod DMS 및 DB 접근 권한 검증
- 최종 리허설 후 운영 전환 승인
Prod 전환을 위한 최종 리허설에서는 운영 DB와 운영 도메인에 영향을 주지 않는 격리된 환경에서 동일한 절차를 검증해야 한다.
15.3 5차 최종 리허설 종료 기준
다음 조건을 모두 만족해야 최종 PASS로 판정한다.
- Preflight PASS
- DMS CDC 최종 동기화 확인
- PostgreSQL 복원 및 데이터 정합성 확인
- Write Freeze 120초 이내
- ALB FE/BE V2 100% 전환
- Write Gate OFF 확인
- Cutover 중 읽기 API 가용성 측정 완료
- 로그인 및 핵심 기능 정상 동작
- V2 DB 신규 쓰기 반영 확인
- 별도 수동 수정 없이 Cutover 완료
- 최종 데이터 정합성 검증 완료
16. 최종 결론
2026년 10월 18일 진행한 V1 → V2 Staging 마이그레이션 4차 리허설에서는 GitHub Actions 기반 Preflight 및 Cutover 자동화의 정상 실행을 확인했다.
Preflight는 15:42:23 KST에 완료됐으며, Write Gate는 15:43:49 KST에 활성화되고 15:44:48 KST에 해제됐다.
이에 따라 Write Freeze는 59초로 측정돼 목표인 120초 이내를 달성했다.
ALB Listener Rule 조회 결과 Backend와 Frontend 모두 V1 0%, V2 100%로 전환됐으며, Write Gate OFF 상태를 확인했다.
Pre-Cutover k6 테스트에서는 총 3,001건의 요청이 모두 성공했고 p95 27.798ms, HTTP 실패율 0%를 기록했다.
Post-Cutover Backend Smoke Test에서는 4건의 요청과 Checks 8건이 모두 성공했으며, Frontend는 /login 페이지의 HTTP 200 응답을 확인했다.
Cutover 이후 MySQL 초기화 후 SQL 실행 누락에 따른 로그인 문제가 발생했으나, SQL 적용 후 정상 동작을 확인했다.
다만 Cutover 중 읽기 서비스 가용성, MySQL·PostgreSQL 최종 정합성, RPO 0 및 대표 쓰기 API의 차단·재개 여부는 추가 검증이 필요하다.
최종 판정: Cutover 자동화 PASS / Write Freeze 59초로 목표 달성 / FE·BE Smoke Test PASS / 로그인 문제 수정 완료 / DB 최종 정합성 및 서비스 중단 여부 추가 검증 필요
5차 최종 리허설에서는 Prod 환경과 워크플로우를 준비하고, 이번에 발견된 SQL 실행 누락 및 Cutover 중 가용성 측정 문제를 개선한 후 실제 운영 전환을 검토한다.