AWS Cost Explorer CSV 읽기: 필드별 가이드

AWS Cost Explorer CSV 내보내기의 각 열이 실제로 무엇을 뜻하는지, 처음 읽는 사람을 당황시키는 스키마 함정, 그리고 보통 원하는 답을 얻기 위해 파일을 어떻게 나눠 볼지 정리합니다.

AWS Cost Explorer의 CSV 내보내기는 AWS 청구에서 가장 유용하면서 동시에 가장 헷갈리는 산출물입니다. 유용한 이유는 CUR을 제외하면 AWS가 제공하는 가장 세밀한 단위의 데이터가 들어 있기 때문이고, 헷갈리는 이유는 열 이름이 늘 예상과 같지는 않고, UI에서 어떤 차원으로 그룹화했느냐에 따라 같은 논리적 데이터가 서로 다른 헤더 아래 나타나기 때문입니다. 이 글은 스키마를 열 단위로 훑고, 처음 읽을 때 대부분의 사람을 걸려 넘어지게 하는 예닐곱 가지를 짚습니다.

파일이 생성되는 방식

Cost Explorer 내보내기는 내보내는 시점에 UI에서 고른 차원을 따릅니다. 서비스로 그룹화하면 CSV에 서비스 열이 생기고, 사용 유형으로 그룹화하면 열도 그에 맞게 바뀝니다. 예외는 시계열입니다. 파일은 항상 시간 구간(보통 일 또는 월)마다 그룹화 값별로 한 행씩 담으므로, 서비스 50개를 30일치 일별로 내보내면 약 1,500행이 나옵니다. 날짜와 비용 쌍은 항상 있고, 나머지는 무엇으로 필터링하고 그룹화했는지에 달려 있습니다.

이건 들리는 것보다 중요합니다. 겉보기에 같은 질문("지난 분기 월별 지출이 얼마였나?")을 던지는 듯한 두 내보내기도, 하나는 연결 계정으로, 다른 하나는 서비스로 그룹화했다면 스키마가 달라질 수 있습니다. CSV를 파싱하는 도구는 이런 변동을 너그럽게 받아들여야 합니다.

열별 참조

Service

청구서에 나타나는 그대로의 AWS 서비스 이름입니다. "Amazon Elastic Compute Cloud - Compute", "Amazon Simple Storage Service" 같은 식입니다. API에서 보는 짧은 서비스 코드(AmazonEC2, AmazonS3)가 아니라 긴 문자열입니다. Cost Explorer는 한 내보내기 안에서는 일관되지만, AWS가 내부적으로 서비스 이름을 바꾸면 이름이 가끔 달라집니다. "Amazon RDS Service"는 어느 시점에 "Amazon Relational Database Service"가 되었고, 오래된 보고서에는 여전히 이전 이름이 들어 있습니다.

Linked account

통합 결제(Consolidated Billing) 조직을 쓸 때, 요금을 발생시킨 12자리 AWS 계정 ID입니다. AWS Organizations의 표시 이름은 여기 나오지 않고 숫자 ID만 나옵니다. 연결 계정으로 그룹화했다면 이 값이 행 식별자이고, 아니라면 아예 집계되어 사라질 수 있습니다.

Usage Type

가장 정보량이 많은 단 하나의 열입니다. AWS는 서비스, 리전, 리소스별 세부 정보를 슬래시로 구분한 문자열로 여기 담습니다. USE1-BoxUsage:m5.xlarge, APN1-DataTransfer-Out-Bytes, EUC1-NatGateway-Bytes 같은 식입니다. 세 글자 접두사는 항공사 코드 스타일로 축약한 AWS 리전 코드입니다(USE1 = us-east-1, APN1 = ap-northeast-1, EUC1 = eu-central-1). 접두사 뒤의 부분이 무엇에 요금이 매겨졌는지를 나타냅니다. 진단 작업 대부분에서는 Usage Type으로 정렬하는 편이 Service 열보다 무슨 일이 벌어지는지 더 빨리 알려 줍니다.

Operation

AWS가 그렇게 귀속할 수 있을 때, 요금을 만든 API 작업입니다. S3에서는 대단히 유용합니다. GetObject/PutObject/ListBucket 요금이 서로 다른 비율로 쌓이기 때문입니다. EC2에서는 모든 것에 대해 이 열이 흔히 RunInstances로 찍혀서 덜 유용합니다. 이 열은 모든 내보내기에 있지만, 사용 유형의 약 60%에만 값이 채워집니다.

Resource ID

Cost Explorer에서 리소스 수준 데이터를 명시적으로 켰을 때만 채워집니다(추가 비용이 듭니다. 리소스 조회 1,000건당 $0.01). 값이 있을 때는 ARN을 담습니다. arn:aws:ec2:us-east-1:123:instance/i-abc, arn:aws:s3:::mybucket/path/ 같은 식입니다. CSV에서 가장 큰 개인정보 고려 사항입니다. 이 ARN들은 파일을 읽는 누구에게나 당신의 계정, 버킷, 인스턴스를 식별하게 해 줍니다. 공유하거나 외부 도구에 붙여 넣기 전에 이 열을 제거하세요.

Tag

비용 할당 태그로 활성화한 AWS 태그마다, Cost Explorer는 aws:(시스템 태그) 또는 user:(사용자 정의) 접두사가 붙은 열을 추가합니다. 값이 prod, dev, stagingEnvironment 태그는 user:Environment 열을 만듭니다. 태그가 없는 행은 여기 값이 비어 있고, 그 빈 값도 암묵적인 하나의 태그 값입니다. "태그 없음"은 태그 정책을 빠져나간 리소스를 찾는 데 유용한 필터입니다.

UsageStartDate / UsageEndDate

행이 포괄하는 구간이며 UTC 기준입니다. 일별 보고서에서는 보통 2025-05-01 00:00:00 UTC부터 2025-05-02 00:00:00 UTC까지인데, 끝값은 포함이 아니라 배제라는 점에 주의하세요. 여기서 생기는 하나 차이(off-by-one) 오류가 "합계가 안 맞는다"는 지원 티켓의 가장 큰 원인입니다.

UsageQuantityUnit

얼마나 사용했는지입니다. Unit 열은 무엇을 곱해야 하는지 알려 줍니다. 스토리지는 GB-Mo, 컴퓨팅은 Hrs, API 호출은 Requests입니다. 수량과 단위를 합치면 비용 열이 할인이나 크레딧으로 조정된 경우에도 실제 사용량 수치를 얻을 수 있습니다.

비용 열

보통 두 개가 있습니다. Cost(UnblendedCost라고도 함)는 실제로 청구된 금액이고, AmortizedCost는 선결제한 예약 인스턴스와 Savings Plans의 평탄화된 값을 반영합니다. 발생주의 방식 보고에는 상각(amortized)을, 현금 흐름 보고에는 비혼합(unblended)을 쓰세요. 차이는 흔히 전체의 10~20%에 달하며, 한쪽을 골라 고수하기를 잊은 사람을 혼란스럽게 합니다.

pricing/termpricing/unit

값이 있을 때, 해당 라인이 온디맨드, 예약, 스팟 요율 중 무엇으로 청구되었는지와 단위당 가격이 얼마인지 알려 줍니다. 주로 청구 급증의 "체험판 만료" 원인을 진단할 때 유용합니다(따로 다룹니다 — #7 참고).

읽는 사람을 놀라게 하는 세 가지 패턴

음수 비용은 실재합니다. 크레딧, RI 절감, 정정은 Cost 열에 음수가 들어간 행을 만듭니다. 이를 걸러내지 않고 합산하면 지출을 과소 계상하게 됩니다. 포함하든 제외하든 일관되게 처리하세요.

파일의 합계가 AWS 청구서의 합계와 맞지 않을 수 있습니다. Cost Explorer는 행을 독립적으로 반올림하고, 그 반올림이 1달러 미만의 차이를 남길 수 있습니다. 정확한 대사(reconciliation)에는 CSV가 아니라 행 수준 S3 내보내기인 Cost and Usage Report(CUR)가 필요합니다.

계정 수준 보고서는 Service 열을 떨굽니다. 연결 계정으로만 그룹화하면 모든 서비스가 계정마다 하루 한 행으로 합쳐집니다. 비용 청구 배분(chargeback)에는 그게 맞지만 급증 진단에는 쓸모가 없습니다. Service로 그룹화해 다시 내보내세요.

파일 다루기

일회성 탐색이라면 내보내기가 50,000행 미만일 때 Excel이나 Google Sheets로 충분합니다. 그 이상이면 Python pandas 노트북이나 DuckDB CLI가 더 쾌적합니다. 어느 쪽이든 처음 쓸 만한 세 가지 쿼리는 이렇습니다. Service로 그룹화해 Cost 내림차순으로 정렬하고, 최상위 서비스로 필터링해 Usage Type으로 그룹화하고, 최상위 사용 유형으로 필터링해 연결 계정이나 태그로 그룹화합니다. 이 세 단계 점검이 급증 대부분을 해결합니다.

SQL을 쓰지 않고 더 빠르게 훑고 싶다면, AWS Billing Analyzer가 CSV를 바로 받아 위의 필드 해석을 적용하고 각 수준에서 상위 기여 요인을 드러냅니다. 파일은 브라우저 안에 머뭅니다. Resource ID 열이 거기 들어 있으니 관련 있는 부분입니다.