1. S3는 무엇인가 — 파일 서버가 아니다
많은 프로젝트가 S3를 "네트워크 드라이브"처럼 생각하고 시작했다가 문제를 겪습니다. S3는 파일 시스템이 아니라 객체 스토리지입니다. 이 차이가 설계와 비용 모두를 결정합니다.
| 구분 | 파일 시스템 (EBS · EFS) | 객체 스토리지 (S3) |
|---|---|---|
| 접근 방식 | POSIX — 마운트 후 open/read/write |
HTTP API — GET/PUT 단위 |
| 부분 수정 | 가능 — 파일 일부만 덮어쓰기 | 불가 — 객체 전체를 다시 업로드 |
| 디렉터리 | 실제 계층 구조 | 없음 — /를 포함한 키 이름일 뿐 |
| 용량 한도 | 볼륨 크기만큼 사전 할당 | 무제한 — 객체당 최대 5TB |
| 내구성 | 99.999% (EBS 연간) | 99.999999999% (11 nines) |
| 과금 기준 | 프로비저닝한 용량 (안 써도 과금) | 저장한 만큼 + 요청 수 + 전송량 |
| 적합한 용도 | DB 데이터 파일, OS 디스크, 공유 홈 | 정적 자산, 백업, 로그, 데이터 레이크 |
2. 실제 사용 용도 10가지
현장에서 S3가 실제로 쓰이는 패턴을 정리하면 다음 10가지로 수렴합니다. 각 용도마다 권장 스토리지 클래스가 다릅니다.
정적 웹사이트 · 프런트엔드 호스팅
HTML·CSS·JS·이미지를 S3에 두고 CloudFront로 배포합니다. 서버가 없으니 패치·스케일링 부담이 사라집니다. 이 블로그도 같은 구조입니다.
S3 Standard + CloudFront백업 · 스냅샷 저장소
DB 덤프, EBS 스냅샷 사본, 온프레미스 백업(Storage Gateway·DataSync). 라이프사이클로 30일 후 자동 아카이빙합니다.
Standard-IA → Glacier로그 · 감사 증적 보관
CloudTrail, VPC Flow Logs, ALB 액세스 로그, 애플리케이션 로그. 규정상 1~5년 보존이 요구되는 대표적 아카이브 대상입니다.
Standard-IA → Deep Archive데이터 레이크
Parquet·ORC 형식으로 적재하고 Athena·Glue·EMR·Redshift Spectrum이 직접 조회합니다. 저장과 컴퓨팅이 분리되는 구조의 기반입니다.
Standard / Intelligent-Tiering미디어 저장 · 스트리밍 원본
동영상·이미지 원본을 보관하고 MediaConvert로 변환, CloudFront로 배포합니다. 원본은 접근이 드물어 아카이빙 대상입니다.
Standard(변환본) + Glacier IR(원본)ML 학습 데이터 · 모델 아티팩트
SageMaker·Bedrock의 학습 데이터셋, 파인튜닝 결과물, RAG용 문서 원본 저장소. 학습 시에만 집중적으로 읽습니다.
Standard / Express One Zone배포 아티팩트 저장소
CodePipeline 산출물, Lambda 배포 패키지, 컨테이너 빌드 캐시, Terraform 상태 파일(DynamoDB 잠금과 함께).
Standard + 버전 관리시스템 간 데이터 교환
파트너사 파일 연계, 사전 서명 URL(presigned URL)로 안전한 업로드·다운로드 제공, SFTP 대체(AWS Transfer Family).
Standard + 수명 주기 삭제마이그레이션 착륙 지점
온프레미스에서 Snowball·DataSync로 옮긴 데이터의 1차 도착지. 이후 분석·복원 용도로 분기합니다.
Standard → 분류 후 전환랜섬웨어 대비 불변 저장소
Object Lock(WORM)으로 지정 기간 동안 삭제·변경을 원천 차단합니다. 금융·의료 규정 대응의 핵심 수단입니다.
Glacier + Object Lock3. 스토리지 클래스 8종
S3의 비용 설계는 사실상 "어떤 데이터를 어떤 클래스에 두느냐"의 문제입니다. 모든 클래스는 동일한 11 nines 내구성을 제공합니다(One Zone 계열 제외). 차이는 가용성·최소 보관 기간·검색 비용·검색 시간입니다.
| 스토리지 클래스 | 저장 (GB/월) | 검색 (GB) | 최소 보관 | 검색 시간 | 주 용도 |
|---|---|---|---|---|---|
| S3 Standard | 약 $0.025 | 없음 | 없음 | 즉시 | 자주 접근하는 활성 데이터 |
| Intelligent-Tiering | 티어별 자동 + 모니터링 $0.0025/1천 객체 |
없음 | 없음 | 즉시 (아카이브 티어 제외) |
접근 패턴을 예측할 수 없는 데이터 |
| Standard-IA | 약 $0.0138 | 약 $0.01 | 30일 | 즉시 | 월 1회 미만 접근, 즉시성 필요 |
| One Zone-IA | 약 $0.011 | 약 $0.01 | 30일 | 즉시 | 재생성 가능한 사본 (AZ 1곳만) |
| Glacier Instant Retrieval | 약 $0.005 | 약 $0.03 | 90일 | 즉시 (밀리초) | 분기 1회 접근하나 즉시 필요한 아카이브 |
| Glacier Flexible Retrieval | 약 $0.0045 | $0(대량) ~$0.03(신속) |
90일 | 1분 ~ 12시간 | 연 1~2회 접근하는 백업 |
| Glacier Deep Archive | 약 $0.002 | 약 $0.0025 ~$0.02 |
180일 | 12 ~ 48시간 | 규정상 장기 보존 (7년 로그 등) |
| Express One Zone | 약 $0.16 | 없음 | 없음 | 한 자릿수 밀리초 | 고빈도 소형 객체 · ML 학습 가속 |
같은 데이터 10TB를 1년간 보관할 때 클래스별 저장 비용만 비교하면 차이가 분명해집니다.
※ 10TB = 10,240GB × 12개월 기준 저장 요금만 계산. 요청·검색·전송 비용은 제외한 수치입니다.
4. 가격을 구성하는 5가지 요소
S3 청구서는 항상 다음 다섯 가지의 합입니다. 대부분의 예상 초과는 1번이 아니라 2·3번에서 발생합니다.
① 저장 용량 (Storage)
GB-월 단위로 과금됩니다. 월 중간에 올리고 지우면 보관한 시간에 비례해 일할 계산됩니다. 주의할 점은 버전 관리를 켠 버킷에서는 이전 버전과 삭제 마커도 모두 과금 대상이라는 것입니다.
② 요청 (Requests)
| 요청 유형 | Standard | Standard-IA | Glacier Deep Archive |
|---|---|---|---|
| PUT · COPY · POST · LIST (1,000건) | 약 $0.0045 | 약 $0.01 | 약 $0.065 |
| GET · SELECT (1,000건) | 약 $0.00035 | 약 $0.001 | 약 $0.0004 |
| 라이프사이클 전환 (1,000건) | — | 약 $0.01 | 약 $0.065 |
숫자만 보면 사소해 보이지만, 객체 수가 많으면 요청 비용이 저장 비용을 추월합니다. 1KB짜리 로그 객체 1억 개를 올린다고 가정하면 저장 용량은 약 100GB($2.5)에 불과하지만 PUT 요청 비용은 1억 ÷ 1,000 × $0.0045 = $450입니다. 저장 요금의 180배입니다.
③ 데이터 전송 (Data Transfer)
| 경로 | 요금 | 비고 |
|---|---|---|
| 인터넷 → S3 (업로드) | 무료 | 인바운드는 과금하지 않음 |
| S3 → 인터넷 (다운로드) | 약 $0.126/GB | 계정당 월 100GB 무료 제공분 이후 |
| S3 → CloudFront | 무료 | 오리진 전송 비용 없음 — 배포는 반드시 CloudFront 경유 |
| S3 → 같은 리전 EC2 | 무료 | 단, NAT 게이트웨이 경유 시 NAT 처리 비용 발생 |
| S3 → 다른 리전 | 약 $0.08 ~ $0.09/GB | 크로스 리전 복제(CRR) 비용의 대부분 |
| S3 ↔ 같은 리전 다른 AZ | 무료 | S3는 리전 서비스이므로 AZ 개념 없음 |
④ 검색 · 조기 삭제 (Retrieval & Early Delete)
IA 이하 클래스는 읽을 때마다 GB당 검색 요금이 붙고, 최소 보관 기간 전에 삭제하면 남은 기간이 청구됩니다. "가끔 읽는 데이터"라고 IA에 넣었는데 실제로는 자주 읽는다면 Standard보다 비싸집니다.
# 손익분기점 계산 — 1TB를 Standard-IA에 두는 것이 유리한가? Standard : 1,024GB × $0.025 = $25.60 / 월 Standard-IA: 1,024GB × $0.0138 = $14.13 / 월 + 읽은 용량 × $0.01 (검색) # 차액 $11.47을 검색 요금으로 소진하는 지점 $11.47 ÷ $0.01 = 1,147GB # → 월 1.1TB 이상 읽으면 IA가 오히려 손해 # → 즉 "전체 용량의 월 100% 이상을 읽는다면" Standard 유지
⑤ 관리 기능 (Management & Analytics)
| 기능 | 요금 | 쓸 만한가 |
|---|---|---|
| S3 Storage Lens (무료 지표) | 무료 | 28개 기본 지표 — 반드시 켜세요 |
| Storage Lens 고급 지표 | 객체 100만 개당 월 약 $0.20 | 프리픽스별 분석이 필요할 때 |
| Storage Class Analysis | 객체 100만 개당 월 약 $0.10 | IA 전환 시점 판단 근거 확보 |
| S3 Inventory | 객체 100만 개당 약 $0.0025 | 대량 객체 감사·정합성 점검 |
| Intelligent-Tiering 모니터링 | 객체 1,000개당 월 약 $0.0025 | 128KB 미만 객체가 많으면 배보다 배꼽 |
| S3 복제 (CRR/SRR) | 전송료 + 대상 저장료 + 요청료 | DR 요건이 있을 때만 |
5. 워크로드별 비용 시뮬레이션
시나리오 A — 중소기업 정적 웹사이트
용량 20GB, 월 방문 트래픽 500GB, 월 요청 200만 건.
| 항목 | 계산 | 월 비용 |
|---|---|---|
| 저장 (Standard) | 20GB × $0.025 | $0.50 |
| GET 요청 | 200만 ÷ 1,000 × $0.00035 | $0.70 |
| S3 → 인터넷 직접 배포 | (500 − 100)GB × $0.126 | $50.40 |
| 소계 (CloudFront 미사용) | $51.60 | |
| CloudFront 적용 시 | 오리진 전송 무료 + CF 아웃 500GB × $0.114 | $57.00 |
| ※ 캐시 히트율 90% 반영 시 S3 요청도 1/10로 감소하며, 무료 티어(월 1TB) 적용 시 | $0.57 | |
소규모 사이트에서는 CloudFront 무료 사용량(월 1TB 전송)만으로 배포 비용이 사실상 0에 수렴합니다. CloudFront를 붙이지 않을 이유가 없습니다.
시나리오 B — 로그 아카이브 (연 30TB 누적)
매월 2.5TB 로그 유입, 최근 30일만 조회, 3년 보존 규정.
| 전략 | 구성 | 3년차 월 비용 | 3년 총액 |
|---|---|---|---|
| 전부 Standard | 90TB 누적 × $0.025 | $2,304 | $42,000 내외 |
| 라이프사이클 적용 | 30일 Standard → 90일 IA → 이후 Deep Archive | $243 | $5,000 내외 |
| 절감 효과 | 동일 데이터·동일 보존 기간 | 89% 절감 | $37,000 절감 |
// 라이프사이클 규칙 — 로그 버킷 표준 구성 { "Rules": [{ "ID": "log-archive-tiering", "Status": "Enabled", "Filter": { "Prefix": "logs/" }, "Transitions": [ { "Days": 30, "StorageClass": "STANDARD_IA" }, { "Days": 120, "StorageClass": "DEEP_ARCHIVE" } ], "Expiration": { "Days": 1095 }, // 미완료 멀티파트 업로드 정리 — 잊으면 유령 비용이 쌓입니다 "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 } }] }
시나리오 C — 데이터 레이크 (5TB, Athena 분석)
| 항목 | CSV 원본 그대로 | Parquet + 파티셔닝 |
|---|---|---|
| 저장 용량 | 5TB | 0.5TB (압축률 약 10:1) |
| S3 저장 비용 | $128 / 월 | $13 / 월 |
| 쿼리당 스캔량 | 5TB 전체 스캔 | 50GB (파티션 프루닝) |
| Athena 비용 (쿼리 100회) | $2,500 | $25 |
| 월 합계 | $2,628 | $38 |
6. 청구서를 부풀리는 7가지 함정
① 미완료 멀티파트 업로드
대용량 업로드가 중간에 실패하면 이미 올라간 파트 조각이 버킷에 남습니다. 객체 목록에는 보이지 않지만 저장 요금은 계속 청구됩니다. 수년간 방치돼 수 TB가 쌓인 사례가 드물지 않습니다.
AbortIncompleteMultipartUpload 규칙(7일)을 기본 적용. 현황은 aws s3api list-multipart-uploads --bucket 이름으로 확인.② 버전 관리 누적
버전 관리를 켜면 덮어쓰기마다 이전 버전이 남습니다. 매일 갱신되는 1GB 파일이 1년이면 365GB가 됩니다. 삭제해도 삭제 마커만 생기고 실제 데이터는 그대로 과금됩니다.
NoncurrentVersionExpiration(예: 30일)과 ExpiredObjectDeleteMarker 정리 규칙을 함께 설정.③ 소형 객체의 최소 과금 크기
Standard-IA·One Zone-IA·Glacier Instant Retrieval은 객체당 최소 128KB로 과금합니다. 4KB 객체 100만 개를 IA로 옮기면 실제 4GB인데 128GB로 청구됩니다. 전환 요청 비용($10)까지 더하면 완전한 손해입니다.
ObjectSizeGreaterThan: 131072 필터를 추가. 소형 객체는 묶어서(tar·Parquet) 저장.④ 조기 삭제 위약금
IA 30일, Glacier 90일, Deep Archive 180일 전에 삭제하거나 다른 클래스로 옮기면 남은 기간이 전액 청구됩니다. "일단 Deep Archive로 내렸다가 필요하면 올리자"는 접근이 가장 위험합니다.
⑤ NAT 게이트웨이 경유 트래픽
프라이빗 서브넷의 EC2가 S3를 호출하면 기본적으로 NAT 게이트웨이를 지납니다. S3 전송 자체는 무료여도 NAT 데이터 처리 비용이 GB당 약 $0.059 붙습니다. 월 10TB면 약 $600입니다.
⑥ KMS 요청 비용
SSE-KMS로 암호화하면 객체를 읽고 쓸 때마다 KMS API가 호출되어 1만 건당 약 $0.03이 과금됩니다. 초당 수천 건을 처리하는 워크로드에서는 KMS 비용이 S3 비용을 넘기기도 합니다.
⑦ 무분별한 LIST 요청
LIST는 GET보다 약 13배 비싸며, 1,000개 객체 단위로 페이징됩니다. 객체 100만 개 버킷을 전체 순회하면 1,000회 호출입니다. 배치 잡이 매시간 전체 목록을 훑으면 요청 비용이 조용히 쌓입니다.
7. 클래스 선택 결정 트리
모르겠다면 추측하지 말고 자동화에 맡기는 편이 거의 항상 낫습니다.
AZ 한 곳에만 저장되므로 원본에는 쓰지 마세요.
8. 비용 최적화 실전
8-1. 먼저 측정하세요 — S3 Storage Lens
최적화의 출발점은 "어느 버킷의 어떤 프리픽스가 얼마를 쓰고 있는가"입니다. Storage Lens 기본 대시보드는 무료이며, 계정·리전·버킷별 용량 추이, 미완료 멀티파트 업로드, 비현행 버전 비중, 클래스 분포를 한 화면에서 보여줍니다.
# 버킷별 용량·객체 수 빠르게 확인 (CloudWatch 지표 활용) aws cloudwatch get-metric-statistics \ --namespace AWS/S3 --metric-name BucketSizeBytes \ --dimensions Name=BucketName,Value=my-bucket \ Name=StorageType,Value=StandardStorage \ --start-time 2026-09-01T00:00:00Z --end-time 2026-09-14T00:00:00Z \ --period 86400 --statistics Average # 미완료 멀티파트 업로드 점검 — 유령 비용의 주범 aws s3api list-multipart-uploads --bucket my-bucket \ --query 'Uploads[].{Key:Key,Initiated:Initiated}' --output table # 버킷 키 활성화 — KMS 호출 최대 99% 절감 aws s3api put-bucket-encryption --bucket my-bucket \ --server-side-encryption-configuration '{ "Rules": [{ "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "alias/s3-cmk" }, "BucketKeyEnabled": true }] }'
8-2. 절감 효과가 큰 순서
| 조치 | 일반적 절감폭 | 작업 난이도 |
|---|---|---|
| S3 게이트웨이 VPC 엔드포인트 생성 | NAT 비용 100% 제거 | 5분 |
| CloudFront를 통한 배포로 전환 | 전송 비용 50~90% | 낮음 |
| 라이프사이클 전환 규칙 적용 | 저장 비용 60~90% | 낮음 |
| 미완료 멀티파트 · 구버전 정리 | 버킷당 수 % ~ 수십 % | 낮음 |
| 버킷 키 활성화 | KMS 비용 최대 99% | 5분 |
| Intelligent-Tiering 전환 | 저장 비용 20~40% | 보통 |
| Parquet 변환 · 파티셔닝 | 분석 비용 90% 이상 | 높음 |
| 소형 객체 병합 | 요청 비용 대폭 감소 | 높음 |
8-3. 최적화 체크리스트
- S3 Storage Lens 기본 대시보드 활성화 (무료)
- 모든 버킷에
AbortIncompleteMultipartUpload7일 규칙 적용 - 버전 관리 버킷에
NoncurrentVersionExpiration설정 - 만료된 삭제 마커 정리 규칙 추가
- S3 게이트웨이 VPC 엔드포인트 생성 — 무료, NAT 비용 제거
- 퍼블릭 배포는 예외 없이 CloudFront 경유
- 라이프사이클 전환 규칙에
ObjectSizeGreaterThan: 131072필터 추가 - 전환 일수를 최소 보관 기간(30·90·180일)보다 길게 설계
- SSE-KMS 사용 버킷에 버킷 키(Bucket Keys) 활성화
- 접근 패턴이 불확실한 데이터는 Intelligent-Tiering으로 이전
- Storage Class Analysis로 전환 시점 근거 확보 후 규칙 확정
- 전체 목록 순회 배치를 S3 Inventory 또는 이벤트 기반으로 전환
- 분석 대상 데이터는 Parquet + 날짜 파티셔닝으로 적재
- 크로스 리전 복제는 DR 요건이 있는 버킷에만 선별 적용
- Cost Anomaly Detection에 S3 서비스 모니터 등록
- 비용 할당 태그(
Service·Env·Owner) 적용 후 Cost Explorer로 분기 검토
마무리
S3 비용 관리의 핵심은 단순합니다. 데이터를 성격별로 분류하고, 분류에 맞는 클래스로 자동 이동시키고, 배포는 CloudFront로 빼는 것입니다. 대부분의 과다 청구는 정교한 최적화가 부족해서가 아니라, 기본 설정 몇 가지를 빠뜨려서 발생합니다.
| 영역 | 핵심 원칙 |
|---|---|
| 용도 | 부분 수정이 잦으면 EFS, 소형 키-값 조회면 DynamoDB — S3는 쓰고 통째로 읽는 데이터용 |
| 클래스 | 예측 가능하면 라이프사이클, 불확실하면 Intelligent-Tiering |
| 요청 | 객체가 많을수록 요청 비용이 저장 비용을 추월 — 소형 객체는 묶어서 저장 |
| 전송 | 인터넷 아웃바운드가 가장 비싸다 — CloudFront + VPC 엔드포인트로 우회 |
| 정리 | 멀티파트 조각·구버전·삭제 마커는 보이지 않는 곳에서 쌓인다 |
| 가시성 | Storage Lens + 비용 할당 태그 = 최적화의 전제 조건 |
