AWS 인프라 재분석 · 옵저버빌리티 구축 · FinOps 비용 최적화

Project Detail

AWS 인프라 재분석 · 옵저버빌리티 구축 · FinOps 비용 최적화

실서비스 AWS 아키텍처를 처음부터 재분석해 문서상 다이어그램과 실제 리소스의 불일치를 드러내고, 옵저버빌리티·보안·가용성·비용을 단계적으로 개선한 DevOps/SRE 작업. 관측 부재로 무경보로 쌓이던 누적 ERROR 226,012건(약 64시간, 단일 근본원인 65%)을 CloudWatch 관측 스택으로 표면화하고, 유휴 NAT·중복 Redis·NAT 경유 불필요 LLM 호출로 새던 비용을 차단해 월 고정비 −$78을 무중단으로 절감했다.

2026.06 - 재직중DevOps/SRE · 인프라 재분석 · 옵저버빌리티 · FinOps · 부하테스트김남해

Headline Result

012건

누적 ERROR 226, 표면화 (단일 근본원인 65%)

INFRA COMMAND CENTERLIVE METRICS
DevOps/SRE · ap-northeast-1
TOPOLOGY
✗ NAT-a −$45✗ replica −$33✓ 사설화 · CW 20+ 감시
OBSERVABILITY · ERROR RATE226,012 누적 · ~64h
ⓘ 모든 수치는 실측 근거 기반 — Terraform 주석 · k6 로그 · 감사 리포트 · postmortem (KPI에 마우스를 올리면 출처, 클릭하면 케이스)
모든 프로덕션 변경은 import → plan → 2-gate sign-off → apply로 무중단 반영AWS 인프라·FinOps수평확장 설계준비도 감사ISMS-P 감사
기간
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

⚠ PROBLEM

문서상 다이어그램과 실제 운영 구조가 달랐고, 옵저버빌리티가 없어 장애·에러가 표면화되지 않았다. release용 EC2가 퍼블릭 서브넷에 공인 IP로 직접 노출돼 공격 표면이 컸고, AZ 1a의 NAT Gateway는 아무도 쓰지 않으면서 과금되고 있었다. main Redis는 트래픽 대비 과한 다중 노드였고, NAT를 통한 불필요한 외부 LLM 호출로 데이터 처리 비용이 새고 있었다.

⚙ SOLUTION10 steps
  1. 1

    재분석

    문서상 다이어그램과 실제 리소스를 1:1 대조해 운영 구조를 다시 도식화. main/release 환경 분리, 서브넷·NAT·RDS(Multi-AZ vs Single-AZ)·Redis 노드 구성·egress 경로를 라이브 검증

  2. 2

    옵저버빌리티 IaC 전면화

    Terraform 19개 파일로 CloudWatch 대시보드 1개 + 알람 20+개 + 로그 메트릭필터 16개를 코드화하고 SNS 이메일로 라우팅. 복합(composite) 알람 2개가 하위 18개를 롤업해 알람 피로를 억제

  3. 3

    침묵 장애(silent failure) 발굴

    관측 부재로 무경보로 쌓이던 누적 ERROR 226,012건을 표면화하고, 무경보였던 자율 세션 크래시 스톰 76건을 전용 알람으로 계량화. 단일 근본원인(DB 연결 타임아웃→세션 크래시)이 65%임을 규명

  4. 4

    서버리스 리포트

    EventBridge→Lambda→CloudWatch Logs Insights→SNS로 일별·시간별 에러 리포트를 자동 발송하고, 매시간 알람 피로를 일 1회 다이제스트로 튜닝

  5. 5

    관측 자가치유

    SSM State Manager로 CloudWatch Agent 상태를 주기적으로 교정해 관측 공백(최대 1일→1시간)을 제거

  6. 6

    FinOps 무중단 절감

    유휴 NAT(−$45/월) 삭제 + main Redis 2노드→단일 노드(−$33/월, 온라인 변경)로 월 −$78 절감. 프로덕션 파괴적 변경은 terraform import → 2게이트 sign-off 후에만 apply

  7. 7

    LLM 비용 관측

    LLM 호출 성공률·지연·토큰 비용을 커스텀 메트릭으로 계량하고, NAT를 경유하던 불필요한 외부 LLM 호출을 제거해 데이터 처리 비용 누수 차단

  8. 8

    무중단 CD

    SSM 온-인스턴스 빌드 → ECR 이미지 배포로 전환하고, /v1/ready 딥 헬스체크 + 무중단 instance refresh(MinHealthy 100·AutoRollback) + preflight 5가드로 이미지 부재발 배포 death-loop(~9분 outage)를 차단

  9. 9

    보안·가용성

    release EC2 공인 IP 노출 제거(사설화), ALB origin을 엣지(CDN) 대역만 허용해 우회 직타 차단, ALB 2AZ·RDS Multi-AZ 자동 failover 유지

  10. 10

    부하 테스트

    k6로 동시성 한계를 실측(20VU p95 90ms·실패율 0.18% / 50VU 붕괴점)해 인스턴스 사이징·오토스케일 근거 확보

✦ OUTCOME
  • 관측 부재로 묻혀 있던 누적 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

AWSRDS PostgreSQLElastiCache RedisGitHub ActionsDocker

Etc

VPCEC2 (Graviton t4g)ALBNAT GatewayAuto ScalingDynamoDBSESSSMCloudWatchLogs InsightsLambdaEventBridgeSNSECRTerraformk6

아키텍처 다이어그램

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는 유지.

다이어그램 렌더링 중…
✎ Mermaid 직접 편집해보기
미리보기
렌더러 불러오는 중…
← 홈으로 돌아가기모든 프로젝트 보기 →