S3 청구서가 매달 조용히 늘어나는데 정작 최근에 쓰는 데이터는 얼마 안 됩니다. 로그, 백업, 옛 업로드가 한 번 올라온 뒤 아무도 안 보는데 계속 표준 요금을 내고 있는 겁니다. 수명주기 정책(Lifecycle Policy) 은 이런 "식어버린" 데이터를 자동으로 더 싼 등급으로 옮기거나 삭제해 줍니다.
스토리지 클래스와 비용
같은 1GB라도 어느 클래스에 두느냐에 따라 단가가 크게 달라집니다. 접근 빈도가 낮을수록 저장 단가는 싸지지만, 꺼낼 때 비용·지연이 붙습니다.
| 클래스 | 적합한 데이터 | 특징 |
|---|---|---|
| Standard | 자주 읽는 최신 데이터 | 저장 단가 높음, 즉시 접근 |
| Standard-IA | 가끔 읽는 데이터 (30일+) | 저장 싸고, 읽기당 요금 |
| Glacier Instant | 분기에 한 번 수준 | 더 싸고 즉시 꺼냄 |
| Glacier Deep Archive | 규제용 장기 보관 | 가장 쌈, 복원 수 시간 |
자주 안 보는데 Standard에 있는 데이터가 비용의 주범입니다. 어디에 무엇이 쌓이는지는 S3 Storage Lens나 스토리지 클래스 분석으로 먼저 봅니다.
수명주기 정책 만들기
정책은 "올린 지 N일 지나면 다른 클래스로 전환, M일 지나면 삭제" 규칙의 묶음입니다. 접두사(prefix)나 태그로 대상을 좁힐 수 있습니다.
JSON
{
"Rules": [{
"ID": "logs-archive-and-expire",
"Filter": { "Prefix": "logs/" },
"Status": "Enabled",
"Transitions": [
{ "Days": 30, "StorageClass": "STANDARD_IA" },
{ "Days": 90, "StorageClass": "GLACIER" }
],
"Expiration": { "Days": 365 }
}]
}
이 규칙은 logs/ 아래 객체를 30일 후 IA로, 90일 후 Glacier로 옮기고 365일이 지나면 삭제합니다. CLI로는 다음처럼 적용합니다.
로컬 터미널
aws s3api put-bucket-lifecycle-configuration \
--bucket my-bucket \
--lifecycle-configuration file://lifecycle.json
적용 순서와 주의점
- 분석 먼저 — Storage Lens로 어떤 접두사가 비용을 먹는지 확인합니다.
- 전환 비용 확인 — 클래스 전환 자체에 객체당 소액 요청 비용이 듭니다. 작은 파일 수백만 개를 IA로 옮기면 절감보다 전환 비용이 더 클 수 있습니다.
- 최소 보관 기간 주의 — IA·Glacier는 최소 저장 기간(30~90일)이 있어 그 전에 지우면 위약 요금이 붙습니다.
- 불완전 멀티파트 정리 — 실패한 업로드 조각이 보이지 않게 쌓입니다.
AbortIncompleteMultipartUpload규칙을 함께 넣습니다. - 버전 관리 버킷 — 버저닝을 켰다면 구버전(
noncurrent) 만료 규칙도 따로 둬야 진짜로 줄어듭니다.
요점 정리
- 비용의 주범은 자주 안 보는데 Standard에 남아 있는 데이터다.
- 수명주기 정책으로 IA → Glacier 전환·만료를 자동화한다.
- 작은 파일 다수는 전환 비용이, IA·Glacier는 최소 보관 기간이 함정이다.
- 멀티파트 조각·구버전 정리 규칙을 같이 넣어야 실제로 줄어든다.
수명주기 정책을 직접 작성해 스토리지 클래스 전환을 확인하는 실습은 클라우드 트랙에서 회원가입 없이 무료로 할 수 있습니다.