AWS 요금이 갑자기 늘어났을 때: 가장 흔한 원인 10가지
청구서를 열었더니 지난달의 두 배입니다. 트래픽이 두 배가 된 것도 아니고, 인스턴스를 늘린 기억도 없습니다. 이 글은 그 상황에서 범인을 찾는 순서와, 실무에서 가장 자주 걸리는 원인 10가지를 정리합니다. 요금 항목의 기초(결제 알림, Cost Explorer, 무료 티어)는 AWS 기초 #3에서 다뤘으므로, 여기서는 “요금이 갑자기 튄 상황"의 시나리오에 집중합니다. 금액 예시는 us-east-1 기준이고 리전마다 다릅니다.
범인부터 찾는 순서 #
원인 목록을 훑기 전에, 어느 서비스에서 늘었는지부터 30초 만에 좁힐 수 있습니다.
- Cost Explorer 에서 기간을 “지난 3개월, 일 단위"로 놓고 Service 기준 그룹핑으로 봅니다. 어느 서비스가 언제부터 튀었는지 그래프로 바로 드러납니다.
- 서비스를 찾았으면 같은 화면에서 Usage Type 기준 그룹핑으로 바꿉니다. 같은 EC2라도 인스턴스 시간인지, EBS인지, 데이터 전송인지가 여기서 갈립니다.
- 리소스 단위까지 내려가려면 태그가 필요합니다. 태깅이 안 돼 있다면 이번 사건을 계기로 비용 할당 태그를 정리해 두는 것을 권합니다.
이 순서로 좁힌 뒤, 아래 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을 켜 두면 다음 급증은 청구서가 아니라 알림으로 먼저 만납니다.