
Project Detail
AWS 인프라 재분석 · 옵저버빌리티 구축 · FinOps 비용 최적화
실서비스 AWS 아키텍처를 처음부터 재분석해 문서상 다이어그램과 실제 리소스의 불일치를 드러내고, 옵저버빌리티·보안·가용성·비용을 단계적으로 개선한 DevOps/SRE 작업. 관측 부재로 무경보로 쌓이던 누적 ERROR 226,012건(약 64시간, 단일 근본원인 65%)을 CloudWatch 관측 스택으로 표면화하고, 유휴 NAT·중복 Redis·NAT 경유 불필요 LLM 호출로 새던 비용을 차단해 월 고정비 −$78을 무중단으로 절감했다.
Headline Result
누적 ERROR 226, 표면화 (단일 근본원인 65%)
- 기간
- 2026.06 - 재직중
- 역할
- DevOps/SRE · 인프라 재분석 · 옵저버빌리티 · FinOps · 부하테스트
- 참여 멤버
- 김남해
결과 지표
- 012건누적 ERROR 226, 표면화 (단일 근본원인 65%)
- 월 고정비 −$78 절감 (NAT −$45 + Redis −$33, apply 완료)
- CloudWatch 관측 IaC — tf 19파일·알람 20+·메트릭필터 16
- 9분배포 death-loop ~ outage → 0 (preflight 5가드)
- 90msk6 — 20VU p95·실패율 0.18%
Problem → Solution → Outcome
문서상 다이어그램과 실제 운영 구조가 달랐고, 옵저버빌리티가 없어 장애·에러가 표면화되지 않았다. release용 EC2가 퍼블릭 서브넷에 공인 IP로 직접 노출돼 공격 표면이 컸고, AZ 1a의 NAT Gateway는 아무도 쓰지 않으면서 과금되고 있었다. main Redis는 트래픽 대비 과한 다중 노드였고, NAT를 통한 불필요한 외부 LLM 호출로 데이터 처리 비용이 새고 있었다.
- 1
재분석
문서상 다이어그램과 실제 리소스를 1:1 대조해 운영 구조를 다시 도식화. main/release 환경 분리, 서브넷·NAT·RDS(Multi-AZ vs Single-AZ)·Redis 노드 구성·egress 경로를 라이브 검증
- 2
옵저버빌리티 IaC 전면화
Terraform 19개 파일로 CloudWatch 대시보드 1개 + 알람 20+개 + 로그 메트릭필터 16개를 코드화하고 SNS 이메일로 라우팅. 복합(composite) 알람 2개가 하위 18개를 롤업해 알람 피로를 억제
- 3
침묵 장애(silent failure) 발굴
관측 부재로 무경보로 쌓이던 누적 ERROR 226,012건을 표면화하고, 무경보였던 자율 세션 크래시 스톰 76건을 전용 알람으로 계량화. 단일 근본원인(DB 연결 타임아웃→세션 크래시)이 65%임을 규명
- 4
서버리스 리포트
EventBridge→Lambda→CloudWatch Logs Insights→SNS로 일별·시간별 에러 리포트를 자동 발송하고, 매시간 알람 피로를 일 1회 다이제스트로 튜닝
- 5
관측 자가치유
SSM State Manager로 CloudWatch Agent 상태를 주기적으로 교정해 관측 공백(최대 1일→1시간)을 제거
- 6
FinOps 무중단 절감
유휴 NAT(−$45/월) 삭제 + main Redis 2노드→단일 노드(−$33/월, 온라인 변경)로 월 −$78 절감. 프로덕션 파괴적 변경은 terraform import → 2게이트 sign-off 후에만 apply
- 7
LLM 비용 관측
LLM 호출 성공률·지연·토큰 비용을 커스텀 메트릭으로 계량하고, NAT를 경유하던 불필요한 외부 LLM 호출을 제거해 데이터 처리 비용 누수 차단
- 8
무중단 CD
SSM 온-인스턴스 빌드 → ECR 이미지 배포로 전환하고, /v1/ready 딥 헬스체크 + 무중단 instance refresh(MinHealthy 100·AutoRollback) + preflight 5가드로 이미지 부재발 배포 death-loop(~9분 outage)를 차단
- 9
보안·가용성
release EC2 공인 IP 노출 제거(사설화), ALB origin을 엣지(CDN) 대역만 허용해 우회 직타 차단, ALB 2AZ·RDS Multi-AZ 자동 failover 유지
- 10
부하 테스트
k6로 동시성 한계를 실측(20VU p95 90ms·실패율 0.18% / 50VU 붕괴점)해 인스턴스 사이징·오토스케일 근거 확보
- ✓
관측 부재로 묻혀 있던 누적 ERROR 226,012건 표면화 + 단일 근본원인 65% 규명 → 추적·해소 기반 마련
- ✓
월 고정비 −$78 무중단 절감(NAT −$45 + Redis −$33, import→gated apply 완료)
- ✓
배포 death-loop(~9분 outage) 재발 방지
preflight 5가드 + 무중단 instance refresh + /v1/ready 딥 헬스체크
- ✓
관측 공백 제거(SSM 자가치유) + 알람 피로 튜닝(매시간→일 1회 다이제스트)으로 운영 신호 대비 잡음 개선
- ✓
release EC2 공인 IP 제거·엣지 대역 화이트리스트로 공격 표면 축소
- ✓
k6로 동시성 한계 실측 → 과/저 프로비저닝 방지, ALB 2AZ·RDS Multi-AZ failover로 단일 AZ 장애 대비 가용성 유지
기술 스택
DB / Infra
Etc
아키텍처 다이어그램
Mermaid로 작성 · 아래에서 직접 편집해 미리볼 수 있어요① 재분석 — 실제 운영 구조
다이어그램과 실제 리소스를 대조해 다시 그린 운영 구조. main/release 환경, AZ 1a·1c, NAT·RDS·Redis 구성과 egress 경로를 실측.
② 발견한 문제점
환경 분리 후 드러난 문제: release EC2의 공인 IP 직접 노출, 아무도 쓰지 않는 idle NAT-a, 트래픽 대비 과한 main Redis 2노드.
③ 응급처치 + 옵저버빌리티 + FinOps
idle NAT·중복 Redis 제거(월 −$78), release egress를 NAT-c로 통합. CloudWatch 대시보드+알람 20+·메트릭필터 16을 Terraform 19파일로 IaC화하고 복합알람 롤업·SSM 자가치유·EventBridge→Lambda→Logs Insights 서버리스 리포트 구성. ALB 2AZ·RDS Multi-AZ failover는 유지.