버전 관리란
S3 버킷 버전 관리를 활성화하면, 같은 키(파일명)로 업로드하거나 삭제할 때 이전 버전이 보존됩니다.
| 동작 | 버전 관리 OFF | 버전 관리 ON |
|---|---|---|
| 파일 덮어쓰기 | 원본 영구 소실 | 이전 버전 보존, 복구 가능 |
| 파일 삭제 | 영구 삭제 | 삭제 마커만 추가, 실제 데이터 보존 |
| 랜섬웨어 공격 | 복구 불가 | 이전 버전으로 롤백 가능 |
이전 버전이 생기는 조건
이전 버전은 "같은 파일명으로 다시 업로드하거나 삭제할 때"만 생깁니다. S3는 파일 내용 일부를 수정하는 개념이 없고, 항상 파일 전체를 새로 업로드하는 구조입니다.
| 동작 | 이전 버전 생김? | 설명 |
|---|---|---|
| 같은 파일명으로 다시 업로드 | O | 기존 파일이 이전 버전으로 보존 |
| 파일 삭제 | O | 삭제 마커 추가, 원본은 이전 버전으로 보존 |
| 새 파일명으로 업로드 | X | 새 객체라서 이전 버전 없음 |
| 파일 읽기/다운로드 | X | 변경 아님 |
즉, EDI 허브처럼 매번 다른 파일명으로 쌓이는 구조면 이전 버전이 거의 안 생깁니다. 같은 파일명을 반복해서 덮어쓰는 경우(프론트엔드 빌드 배포 등)에만 이전 버전이 쌓입니다.
기존 시스템 영향
버전 관리를 켜도 기존 동작에 영향 없습니다.
- 파일 읽기/쓰기: 동일하게 동작 (항상 최신 버전 반환)
- CloudFront 연동: 영향 없음
- presigned URL: 동일하게 동작
- SDK/CLI: 변경 없음
유일한 변화: 덮어쓰기/삭제 시 이전 버전이 보존되어 스토리지 사용량 증가 가능.
비용 영향
추가 비용은 "이전 버전이 얼마나 쌓이느냐"에 따라 결정됩니다.
파일이 거의 덮어쓰기 안 되는 경우 (append-only)
EDI 데이터처럼 한번 올라가면 수정 없이 쌓이는 구조에서는 이전 버전이 거의 안 생기므로 추가 비용이 거의 $0입니다.
파일이 주기적으로 덮어쓰기되는 경우
| 일일 덮어쓰기량 | 이전 버전 보존 30일 | S3 Standard 추가 비용 (월) |
|---|---|---|
| 1GB | 30GB | ~$0.75 |
| 5GB | 150GB | ~$3.75 |
| 10GB | 300GB | ~$7.50 |
비용 절감 방법
라이프사이클 정책으로 이전 버전 자동 정리:
- 이전 버전 30일 후 삭제 → 최대 30일치만 보존
- 이전 버전 30일 후 Glacier Deep Archive 이동 → 비용 1/10 수준
적용 방법
버전 관리 활성화
- AWS 콘솔 → S3 → 대상 버킷 → "속성(Properties)" 탭
- "버킷 버전 관리(Bucket Versioning)" → "편집"
- "활성화(Enable)" 선택 → "변경 사항 저장"
라이프사이클 정책 (이전 버전 자동 정리)
- "관리(Management)" 탭 → "수명 주기 규칙 생성"
- 설정:
- 규칙 이름:
delete-old-versions - 범위: 버킷의 모든 객체에 적용
- "객체의 이전 버전 영구 삭제" 체크
- 경과 일수: 30
- 보관할 새 버전 수: 1
- 규칙 이름:
버킷별 적용 판단 기준
| 버킷 유형 | 버전 관리 필요성 | 이유 |
|---|---|---|
| 프론트엔드 빌드 배포 | 높음 | 같은 파일명 덮어쓰기 빈번, 배포 실패 시 즉시 롤백 가능 |
| 사용자 데이터 | 높음 | 실수 삭제/덮어쓰기 복구 |
| 감사 로그 | 높음 | 로그 변조/삭제 방지 |
| EDI 허브 (append-only) | 낮음 | 매번 다른 파일명으로 쌓이는 구조라 이전 버전 거의 안 생김 |
| 임시/테스트 | 낮음 | 불필요한 비용 발생 |
적용 전 확인사항
버킷의 데이터 변경 패턴을 먼저 확인합니다.
S3 콘솔 → 대상 버킷 → 지표(Metrics) 탭 → 버킷 지표
→ PutObject 요청 수로 덮어쓰기 빈도 파악
- PutObject가 거의 없으면 → 바로 적용 (비용 영향 없음)
- PutObject가 많으면 → 라이프사이클 정책 필수로 같이 설정
주의사항
- 버전 관리는 한번 켜면 "비활성화(Suspended)"만 가능하고 완전히 끌 수 없음
- 비활성화해도 기존 이전 버전은 남아 있음 (수동 삭제 필요)
- MFA Delete를 추가로 설정하면 삭제 시 MFA 인증 필요 (보안 강화)
정리
- 버전 관리는 데이터 보호의 기본이지만, 모든 버킷에 일괄 적용할 필요는 없음
- 버킷의 데이터 변경 패턴(append-only vs 덮어쓰기)에 따라 적용 판단
- 라이프사이클 정책으로 이전 버전 자동 정리하여 비용 최적화
- 프론트엔드 빌드, 사용자 데이터, 감사 로그 버킷은 우선 적용 권장