S3 프리티어에서 먼저 터지는 건 용량이 아니라 요청 수다. 저장 5GB에 비해 쓰기 요청 2,000건은 훨씬 빨리 소진된다. 100GB 파일 하나를 멀티파트로 올리면 API 호출이 1,002번 나간다. 그 한 번으로 월 한도의 절반이 사라진다. 그리고 2025년 7월 15일부터 신규 계정은 프리티어 구조 자체가 달라졌다. 내 계정이 어느 쪽인지부터 확인해야 한다.
먼저 — 내 계정은 어느 프리티어인가
2025년 7월 15일을 기준으로 두 가지가 공존한다. 검색해서 나오는 글 대부분은 왼쪽 기준이라, 신규 계정이면 그 설명이 안 맞는다.
| 2025-07-15 이전 생성 | 2025-07-15 이후 생성 | |
|---|---|---|
| 형태 | 서비스별 무료 사용량 | 크레딧 |
| S3 몫 | 5GB 저장 / GET 20,000 / PUT 2,000 / 전송 100GB | 서비스 공통 크레딧에서 차감 |
| 기간 | 가입일부터 12개월 | 6개월 |
| 소진 시 | 초과분 과금 | 6개월 경과 또는 크레딧 소진 중 먼저 오는 시점에 계정이 닫힘 |
신규 계정은 최초 $100, 활동에 따라 최대 $100 추가로 합계 $200까지 받는다. 그리고 유료 플랜으로 전환하지 않으면 과금되지 않고 계정이 닫힌다. 요금 폭탄은 없는 대신, 모르고 있으면 계정이 사라진다.
두 플랜 모두 30개 이상 서비스의 상시 무료 한도는 그대로 적용된다. (AWS 프리티어)
아래 내용은 구 프리티어(12개월) 기준으로 쓴다. 신규 계정이라면 "한도 소진"을 "크레딧 차감"으로 바꿔 읽으면 된다.
5GB보다 2,000 PUT이 먼저 터진다
이게 초과 청구의 가장 흔한 원인이다.
한도는 매월 초기화되고 12개월 내내 누적되지 않는다. 그런데 쓰기 2,000건은 감이 안 잡히는 숫자다. 이렇게 소진된다.
- 파일 개수가 곧 PUT 수다. 5,000개짜리 디렉터리를
aws s3 sync로 올리면 그 자체로 2,000을 넘긴다. 총 용량이 100MB여도 그렇다. - 멀티파트 업로드는 파트마다 호출한다. AWS 문서의 예시로, 100GB 파일을 100MB 파트로 올리면
CreateMultipartUpload1회 +UploadPart1,000회 +CompleteMultipartUpload1회 = 1,002번이다. (문서) - CI가 매번 올린다. 빌드마다 산출물을 올리면 빌드 횟수 × 파일 수다.
용량은 5GB를 넘겨도 초과분만 조금 붙지만, 요청은 자동화가 걸려 있으면 순식간에 자릿수가 바뀐다.
실패한 업로드가 계속 과금된다
두 번째로 흔한 원인이고, 이쪽이 더 고약하다. 버킷 목록에 안 보이기 때문이다.
멀티파트 업로드를 시작하고 완료도 중단도 안 하면, 이미 올라간 파트가 그대로 남는다. AWS 문서는 이렇게 못 박는다 — 업로드를 완료하거나 중단해야 파트 저장 요금이 멈춘다. 그전까지는 저장·대역폭·요청이 전부 청구된다.
네트워크가 끊기거나 CI 잡이 중간에 죽으면 이 상태가 된다. 콘솔에서 버킷을 열어도 객체가 없으니, 용량은 0인데 저장 요금이 나오는 상황이 만들어진다.
확인은 이렇게 한다.
aws s3api list-multipart-uploads \
--bucket my-bucket \
--query 'Uploads[].{Key:Key,Initiated:Initiated}' \
--output table
아무것도 없으면 출력이 비어 있다. Initiated 날짜가 오래된 항목이 보이면 그게 요금을 먹고 있는 것이다.
재발 방지는 수명 주기 규칙으로
한 번 지우는 것으로 끝내면 안 된다. 같은 일이 또 생긴다. AbortIncompleteMultipartUpload를 걸어 두면 지정한 일수가 지난 미완료 업로드를 S3가 알아서 정리한다.
{
"Rules": [
{
"ID": "abort-incomplete-mpu",
"Status": "Enabled",
"Filter": { "Prefix": "" },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
}
]
}
aws s3api put-bucket-lifecycle-configuration \
--bucket my-bucket \
--lifecycle-configuration file://lifecycle.json
이 규칙은 객체를 지우지 않는다. 미완료 파트만 정리하고, 완료된 업로드에는 영향이 없다. 조기 삭제 요금도 붙지 않는다. (문서)
기존 업로드와 앞으로 생길 업로드에 모두 적용되므로, 버킷을 만들 때 같이 걸어 두는 게 맞다.
무엇이 한도를 먹었는지 찾는 방법
청구서에는 "S3 $3.4" 같은 합계만 보인다. 원인을 알려면 사용 유형별로 쪼개야 한다.
aws ce get-cost-and-usage \
--time-period Start=2026-08-01,End=2026-09-01 \
--granularity MONTHLY \
--metrics UsageQuantity \
--filter '{"Dimensions":{"Key":"SERVICE","Values":["Amazon Simple Storage Service"]}}' \
--group-by Type=DIMENSION,Key=USAGE_TYPE
USAGE_TYPE으로 묶으면 저장·요청·전송이 갈린다. 여기서 요청 쪽 수치가 크면 위의 두 원인 중 하나다. 자동화가 도는 버킷을 먼저 본다.
Cost Explorer를 처음 켜면 데이터가 채워지는 데 시간이 걸린다. 청구서를 이미 받은 뒤라면 결제 콘솔의 사용량 보고서가 더 빠르다.
재발 방지 — 알람을 먼저 건다
원인을 고쳤어도 다음 달에 다른 데서 또 난다. 그래서 금액 알람을 건다.
여기서 자주 하는 실수가 하나 있다. 청구 지표(AWS/Billing)는 us-east-1에만 온다. 서울 리전에 알람을 만들면 영영 안 울린다. 지표가 없으니 INSUFFICIENT_DATA로 남을 뿐이고, 조용히 실패한다.
이건 NAT 게이트웨이 요금이 늘었을 때와 같은 성격의 문제다. 요금은 터진 뒤에 알면 이미 늦고, 알람은 걸어 놓고 안 울리면 없는 것과 같다.
두 단으로 거는 것을 권한다. 경고 단계에서 먼저 알고, 한도에 닿기 전에 손을 쓸 수 있다.
FAQ
5GB를 안 넘겼는데 왜 요금이 나오나요
요청 수나 미완료 멀티파트 업로드 때문일 가능성이 높다. 특히 후자는 콘솔 객체 목록에 안 보이므로 list-multipart-uploads로 직접 확인해야 한다.
프리티어 한도는 버킷마다인가요
아니다. 계정 단위다. 버킷을 나눠도, 리전을 나눠도 한도는 하나다.
한도를 넘기면 서비스가 멈추나요
구 프리티어(12개월)는 멈추지 않고 초과분이 과금된다. 2025년 7월 15일 이후 생성한 계정은 반대로, 크레딧을 다 쓰거나 6개월이 지나면 유료 전환을 하지 않는 한 계정이 닫힌다.
확인한 것과 확인하지 못한 것
이 글의 수치는 AWS 공식 문서에서 확인했다. 프리티어 구성(5GB / GET 20,000 / PUT 2,000 / 전송 100GB, 12개월, 매월 초기화, 계정 단위), 2025년 7월 15일 이후 계정의 크레딧 $200과 6개월, 100GB 멀티파트 업로드의 1,002회 호출, AbortIncompleteMultipartUpload의 동작이 그렇다.
확인하지 못한 것도 적어 둔다. 서울 리전의 요청 단가는 AWS 요금 페이지가 스크립트로 렌더링되어 값을 직접 읽지 못했다. 그래서 이 글에는 "얼마가 청구된다"는 계산을 넣지 않았다. 금액이 필요하면 S3 요금 페이지에서 리전을 직접 골라 보는 편이 정확하다.
요금은 바뀐다. 이 글의 프리티어 구조도 2025년에 바뀐 것이고, 그래서 날짜가 적히지 않은 요금 글은 믿을 게 못 된다.
'AWS' 카테고리의 다른 글
| EC2 예약 인스턴스와 Savings Plans 차이 — 갈림길은 할인율이 아니다 (0) | 2026.09.04 |
|---|---|
| SES 프로덕션 전환 신청부터 하세요 — 코드로 안 되는 것들 (0) | 2026.09.03 |
| 930일 동안 이중화가 0이었다 — mod_jk에서 ALB 블루그린으로 (0) | 2026.09.02 |
| SSM Session Manager로 베스천 없이 EC2에 접속하기 (0) | 2026.09.01 |
| Terraform import로 콘솔에서 만든 AWS 계정 코드화하기 (0) | 2026.08.31 |
댓글