AWS 요금이 갑자기 늘어났을 때: 가장 흔한 원인 10가지

7 분 소요

청구서를 열었더니 지난달의 두 배입니다. 트래픽이 두 배가 된 것도 아니고, 인스턴스를 늘린 기억도 없습니다. 이 글은 그 상황에서 범인을 찾는 순서와, 실무에서 가장 자주 걸리는 원인 10가지를 정리합니다. 요금 항목의 기초(결제 알림, Cost Explorer, 무료 티어)는 AWS 기초 #3에서 다뤘으므로, 여기서는 “요금이 갑자기 튄 상황"의 시나리오에 집중합니다. 금액 예시는 us-east-1 기준이고 리전마다 다릅니다.

범인부터 찾는 순서 #

원인 목록을 훑기 전에, 어느 서비스에서 늘었는지부터 30초 만에 좁힐 수 있습니다.

  1. Cost Explorer 에서 기간을 “지난 3개월, 일 단위"로 놓고 Service 기준 그룹핑으로 봅니다. 어느 서비스가 언제부터 튀었는지 그래프로 바로 드러납니다.
  2. 서비스를 찾았으면 같은 화면에서 Usage Type 기준 그룹핑으로 바꿉니다. 같은 EC2라도 인스턴스 시간인지, EBS인지, 데이터 전송인지가 여기서 갈립니다.
  3. 리소스 단위까지 내려가려면 태그가 필요합니다. 태깅이 안 돼 있다면 이번 사건을 계기로 비용 할당 태그를 정리해 두는 것을 권합니다.

이 순서로 좁힌 뒤, 아래 10가지에서 해당 항목을 찾으면 됩니다.

1. NAT Gateway 데이터 처리 #

부동의 1위입니다. NAT Gateway는 시간당 요금(약 $0.045)에 더해 통과하는 데이터 1GB마다 처리 요금(약 $0.045/GB)을 받습니다. 프라이빗 서브넷의 워크로드가 S3, ECR 같은 AWS 서비스와 대량으로 주고받는 트래픽이 NAT를 경유하고 있으면, 컨테이너 이미지 풀이나 데이터 파이프라인이 늘어난 만큼 요금이 정직하게 따라 올라갑니다.

  • 확인: Usage Type에서 NatGateway-Bytes가 튀었는지 봅니다.
  • 처방: S3·DynamoDB는 게이트웨이 VPC 엔드포인트(무료)로, ECR 등 나머지는 인터페이스 엔드포인트로 NAT 우회 경로를 만듭니다. 게이트웨이 엔드포인트 하나로 수백 달러가 사라지는 사례가 흔합니다.

2. CloudWatch Logs 수집 #

로그는 저장보다 수집(ingestion)이 비쌉니다(약 $0.50/GB). 배포하면서 디버그 로그를 켜 둔 채 잊었거나, 에러가 반복되며 스택 트레이스를 쏟아내고 있으면 로그 수집 요금이 컴퓨팅 요금을 넘어서기도 합니다.

  • 확인: Usage Type의 DataProcessing-Bytes(로그 수집), CloudWatch의 IncomingBytes 지표를 로그 그룹별로 봅니다.
  • 처방: 로그 레벨 조정, 반복 에러 수정이 먼저입니다. 보존 기간이 “무기한"으로 된 로그 그룹도 함께 정리합니다(기본값이 무기한입니다).

3. EBS 스냅샷과 AMI 누적 #

백업 자동화가 만든 스냅샷이 삭제 정책 없이 쌓이는 경우입니다. 스냅샷은 증분이라 하나하나는 작아 보여도, 수백 개가 쌓이면 원본 볼륨보다 커집니다. AMI를 만들며 딸려 나온 스냅샷은 AMI를 등록 해제해도 자동 삭제되지 않습니다.

  • 확인: Usage Type의 EBS:SnapshotUsage 추이를 봅니다.
  • 처방: Data Lifecycle Manager나 AWS Backup으로 보존 개수·기간을 정합니다. 고아 스냅샷(원본 볼륨이 사라진 것)부터 청소합니다.

4. 멈춰 있는 리소스의 잔존 요금 #

EC2를 중지(stop)해도 붙어 있던 EBS 볼륨과 할당된 퍼블릭 IPv4 주소는 계속 과금됩니다. 특히 퍼블릭 IPv4는 2024년부터 사용 여부와 무관하게 주소당 약 $0.005/시간(월 약 $3.6)이 부과되므로, 미연결 Elastic IP가 수십 개 굴러다니면 그것만으로 월 세 자릿수 달러가 나옵니다.

  • 확인: Usage Type의 PublicIPv4:InUseAddress·IdleAddress, 미사용 볼륨(available 상태)을 봅니다.
  • 처방: 미연결 EIP 해제, 고아 볼륨 스냅샷 후 삭제, 중지 상태로 오래 갈 인스턴스는 AMI로 떠서 종료합니다.

5. 데이터 전송: 리전 간, AZ 간, 인터넷 아웃 #

인터넷으로 나가는 트래픽(약 $0.09/GB)만 기억하기 쉬운데, 리전 간 복제와 AZ 간 트래픽(양방향 각 $0.01/GB 안팎)도 쌓입니다. 멀티 AZ 구성에서 애플리케이션과 데이터베이스가 AZ를 넘나들며 대화하거나, 리전 간 리플리케이션을 켠 경우가 전형입니다.

  • 확인: Usage Type에서 DataTransfer-Regional-Bytes(AZ 간·리전 내), DataTransfer-Out-Bytes를 봅니다.
  • 처방: 같은 AZ 배치(단, 가용성과의 트레이드오프 확인), CloudFront로 아웃바운드 흡수, 리전 간 복제 범위 재검토입니다.

6. Lambda 폭주와 재귀 호출 #

Lambda가 S3 버킷에 쓰고, 그 쓰기 이벤트가 다시 같은 Lambda를 부르는 재귀 구조가 사고의 고전입니다. 스로틀 없는 재시도 폭풍(SQS 재드라이브, 이벤트 재처리)도 같은 모양의 청구서를 만듭니다.

  • 확인: Lambda Invocations 지표의 시계열, 특정 함수의 폭증 여부를 봅니다.
  • 처방: 이벤트 필터로 재귀 고리 차단(AWS가 재귀 감지로 일부는 자동 중단합니다), DLQ와 최대 재시도 설정, 동시성 상한을 둡니다.

7. S3 요청 요금과 버전 누적 #

S3는 저장 용량만이 아니라 요청 횟수에도 과금됩니다(PUT과 LIST가 GET보다 비쌉니다). 작은 파일 수백만 개를 반복 나열하는 배치, 버전닝을 켠 채 수명 주기 규칙 없이 덮어쓰기를 반복하는 버킷이 전형입니다. 이전 버전은 화면에 안 보일 뿐 전부 과금 대상입니다.

  • 확인: Usage Type의 Requests-Tier1/2, S3 Storage Lens에서 버전별 용량을 봅니다.
  • 처방: 수명 주기 규칙으로 이전 버전 만료, 작은 객체 묶기, LIST 호출 최소화입니다.

8. 개발 환경의 24시간 가동과 오버프로비저닝 #

야간·주말에도 도는 개발·스테이징 인스턴스, “일단 크게” 잡아 놓은 RDS가 베이스라인을 꾸준히 밀어 올립니다. 갑작스러운 급증보다는 “야금야금 오르는” 패턴으로 나타나고, 신규 환경을 만든 달에는 계단형 증가로 나타납니다.

  • 확인: 태그(환경별) 기준 그룹핑, Compute Optimizer의 다운사이징 권고를 봅니다.
  • 처방: 개발 환경 스케줄 정지(Instance Scheduler), 권고 기반 다운사이징입니다.

9. RI·Savings Plans 만료 #

사용량은 그대로인데 요금만 뛰었다면 가장 먼저 의심할 항목입니다. 예약 인스턴스나 Savings Plans가 만료되면 같은 사용량이 온디맨드 단가로 청구되므로, 아무것도 바꾸지 않았는데 30〜40%가 오릅니다.

  • 확인: Billing 콘솔의 RI/SP 커버리지 리포트에서 만료일과 커버리지 하락을 봅니다.
  • 처방: 만료 알림을 미리 설정하고, 갱신 또는 사용 패턴에 맞는 재약정을 합니다. 가격 모델의 구조는 SAA Domain 4-1에서 다뤘습니다.

10. CloudWatch 지표·API 호출: 모니터링 도구의 폴링 #

외부 모니터링 도구(또는 직접 만든 대시보드)가 GetMetricData를 고빈도로 폴링하면 CloudWatch API 요금이 눈에 띄는 항목으로 올라옵니다. 커스텀 지표(지표당 약 $0.30/월)를 카디널리티 높게(인스턴스별, 고객별) 만든 경우도 같습니다.

  • 확인: Usage Type의 CW:GMD-Metrics(GetMetricData), CW:MetricMonitorUsage(커스텀 지표)를 봅니다.
  • 처방: 폴링 주기 완화, 필요 지표만 수집, 카디널리티 축소입니다.

재발 방지: 다음 급증은 청구서 전에 알기 #

원인을 잡았다면 같은 일을 청구서로 다시 알게 되지 않도록 세 가지를 켜 둡니다.

  • AWS Budgets: 월 예산과 예측 초과 알림을 겁니다. 최소한의 안전망입니다.
  • Cost Anomaly Detection: 서비스별 평소 패턴에서 벗어나면 알림을 줍니다. 무료이고, 이 글의 사례 대부분을 며칠 안에 잡아 줍니다.
  • 비용 할당 태그와 정기 리뷰: 태그 없는 비용은 추적할 수 없습니다. 월 1회 Cost Explorer 리뷰를 팀 루틴으로 만듭니다.

모니터링 대시보드 구성까지 포함한 운영 흐름은 AWS 실전 #6에서 다뤘습니다.

정리 #

  • 범인 찾기는 Cost Explorer에서 Service → Usage Type 순서의 그룹핑으로 시작합니다. 감이 아니라 그래프가 답합니다.
  • 급증의 단골은 NAT Gateway 처리량, CloudWatch Logs 수집, 스냅샷 누적, 데이터 전송, Lambda 폭주입니다.
  • 사용량이 그대로인데 올랐다면 RI·Savings Plans 만료부터 확인합니다.
  • 퍼블릭 IPv4, 멈춘 인스턴스의 EBS처럼 “쓰지 않아도 나가는” 항목은 목록으로 정기 청소합니다.
  • Budgets와 Cost Anomaly Detection을 켜 두면 다음 급증은 청구서가 아니라 알림으로 먼저 만납니다.
X