S3 파일을 삭제해도 요금이 나오는 이유: 이전 버전 확인과 수명 주기 설정법

S3 파일을 삭제해도 요금이 나오는 이유는 이전 버전이 그대로 남아 있기 때문일 수 있다. 버전 관리가 활성화된 버킷에서는 일반 삭제가 파일 데이터를 지우는 대신 삭제 마커를 추가한다. 파일이 목록에서 사라지고 조회 요청이 실패해도, 이전 버전의 저장 요금은 계속 발생할 수 있다.

확인 순서는 간단하다. 버전 목록에서 실제로 남은 데이터를 확인하고, 현재 버전과 이전 버전의 수명 주기를 나눠 설정한 다음, 영구 삭제가 필요한 범위를 결정하면 된다. 아래 내용은 2026년 10월 확인한 AWS 공식 문서와 요금 안내를 기준으로 하며, 버전 관리가 활성화된 일반 S3 버킷을 대상으로 한다.

📌 핵심 요약

  • 일반 삭제 후 반환되는 404는 모든 버전의 영구 삭제를 뜻하지 않는다.
  • Expiration만 설정하면 이전 버전의 저장 요금이 남을 수 있다.
  • NoncurrentVersionExpiration은 이전 버전이 된 시점부터 보존 기간을 계산하며, 삭제된 버전은 복구할 수 없다.

1. S3 이전 버전 확인: Show versions부터 켜기

삭제 후 비용이 줄지 않았다면 S3 콘솔의 일반 객체 목록만으로 판단하지 않는 것이 좋다. 버전 표시를 켜야 같은 키에 남아 있는 이전 버전과 삭제 마커를 함께 확인할 수 있다. 여기서 키는 폴더 경로를 포함한 객체 이름을 뜻한다.

  1. AWS Management Console에서 Amazon S3를 열고 해당 버킷을 선택한다.
  2. Objects 화면에서 Show versions, 즉 버전 표시를 켠다.
  3. 삭제한 파일의 전체 키 또는 접두사로 검색한다.
  4. 각 행의 버전 ID, 삭제 마커 여부, 크기와 스토리지 클래스를 확인한다.

AWS CLI에서는 ListObjectVersions API에 대응하는 다음 명령으로 확인할 수 있다. 아래 명령은 조회만 수행하며, 버킷 이름과 접두사는 실제 확인 대상에 맞게 바꿔야 한다.

aws s3api list-object-versions --bucket YOUR_BUCKET --prefix "logs/"

응답에서 Versions는 데이터 버전, DeleteMarkers는 삭제 마커 목록이다. --prefix는 정확히 일치하는 파일 하나가 아니라 해당 문자열로 시작하는 키를 조회하므로, 개별 파일을 확인할 때는 응답의 Key도 함께 대조해야 한다.

버킷 전체의 비용 원인을 살피려면 Amazon S3 Storage Lens에서 현재 버전과 이전 버전의 저장량을 구분해 보는 방법도 유용하다. 화면에 보이는 최신 파일 수보다 실제 보관 중인 버전의 총량이 비용 분석에 더 직접적인 단서가 된다.

출처: AWS 공식 문서 「Troubleshooting versioning」, 「Deleting object versions from a versioning-enabled bucket」.

S3 파일을 삭제해도 요금이 나오는 이유: 이전 버전 확인과 수명 주기 설정법

2. 삭제 마커와 404 오류가 있어도 저장 요금이 남는 이유

삭제 마커는 객체가 삭제된 것처럼 보이게 만드는 표시이며, 기존 데이터 버전을 지우는 작업과는 다르다. 버전 관리가 활성화된 버킷에서 버전 ID 없이 삭제하면 삭제 마커가 최신 버전이 된다. 이 상태에서 버전 ID를 지정하지 않은 GET 요청은 404 Not Found를 반환한다.

가령 같은 키의 데이터 버전이 남아 있는 상태에서 일반 삭제를 실행하면, 기본 조회 경로에서는 파일을 찾을 수 없지만 이전 데이터는 보관된다. 적절한 권한과 해당 버전 ID가 있으면 남아 있는 버전을 지정해 접근할 수 있다. 따라서 애플리케이션에서 다운로드가 실패한다는 사실만으로 저장 공간이 해제됐다고 결론 내릴 수 없다.

이전 버전에는 각 버전의 스토리지 클래스에 따른 정상 저장 요금이 적용된다. 삭제 마커 자체에도 요금이 붙는데, AWS는 키 이름의 UTF-8 크기를 기준으로 S3 Standard 요금을 적용한다고 설명한다. 문자당 크기는 1~4바이트이며, 삭제 마커에 원본 파일 데이터가 들어 있는 것은 아니다.

비용 분석에서는 삭제 마커 개수만 보지 말고 이전 데이터 버전의 총크기를 먼저 확인하는 편이 합리적이다. 특히 같은 키를 반복해서 덮어쓰는 작업에서는 최신 파일의 크기가 일정해 보여도, 보관된 이전 버전 때문에 총저장량이 늘어날 수 있다.

출처: AWS 공식 문서 「Working with delete markers」, 「Deleting object versions from a versioning-enabled bucket」.

3. S3 수명 주기 설정: Expiration과 이전 버전 만료 구분하기

자동 정리를 설정할 때 가장 흔한 빈틈은 현재 버전의 만료만 지정하는 것이다. Expiration은 현재 버전을 대상으로 하므로, 버전 관리가 활성화된 버킷에서는 데이터가 이전 버전으로 남을 수 있다. 이전 버전을 실제로 없애려면 NoncurrentVersionExpiration을 별도로 설정해야 한다.

설정 적용 대상과 결과
Expiration 현재 데이터 버전에 삭제 마커를 추가하고, 기존 데이터를 이전 버전으로 전환
NoncurrentVersionExpiration 이전 버전이 된 뒤 지정한 일수가 지난 데이터 버전을 영구 삭제
ExpiredObjectDeleteMarker 데이터 버전이 모두 사라지고 삭제 마커만 남는 등 만료 조건을 충족한 마커 제거

콘솔에서 규칙을 만드는 순서

  1. 버킷의 Management → Lifecycle rules → Create lifecycle rule로 이동한다.
  2. 규칙 이름을 정하고 적용할 접두사 등 범위를 지정한다. 버킷 전체 적용 전에는 기존 보관 정책을 확인한다.
  3. 현재 파일도 정기적으로 없애려면 Expire current versions of objects를 선택하고 생성 후 경과 일수를 입력한다.
  4. Permanently delete noncurrent versions of objects를 선택하고 이전 버전 전환 후 경과 일수를 입력한다.
  5. 데이터와 삭제 마커까지 정리하려면 만료된 삭제 마커 제거 규칙을 추가하고, 범위와 상태를 확인한 뒤 저장한다.

AWS는 모든 데이터 버전과 삭제 마커를 정리하는 구성으로 현재 버전 만료·이전 버전 영구 삭제를 담당하는 규칙과 만료된 삭제 마커를 제거하는 규칙, 총 2개 규칙을 안내한다. 삭제 마커 제거 옵션은 아직 데이터 버전이 남아 있는 객체를 강제로 비우는 기능이 아니다.

이미 일반 삭제한 파일의 이전 버전만 정리하려는 목적이라면 현재 버전 만료까지 무조건 켤 필요는 없다. 현재 운영 중인 파일의 수명과, 삭제·덮어쓰기 이후의 복구 기간을 별도로 정해야 정상 서비스 중인 데이터가 예상보다 빨리 만료되는 일을 피할 수 있다.

출처: AWS 공식 문서 「Expiring objects」, 「Troubleshooting versioning」.

4. 이전 버전 보존 기간과 최소 보관 요금 함께 정하기

이전 버전 만료의 기준일은 최초 업로드일이 아니라 그 버전이 이전 버전으로 바뀐 시점이다. 오래전에 업로드한 파일도 방금 덮어썼다면, 이전 버전 보존 기간은 그 전환 시점부터 계산된다. 이 차이를 놓치면 오래된 파일이 왜 계속 남아 있는지 이해하기 어렵다.

제공된 AWS 설정 예시의 30일은 정책을 이해하기 위한 예시이지 모든 버킷의 권장 보존 기간은 아니다. 운영 정책은 삭제 실수를 발견하는 데 걸리는 시간, 장애 조사 기간, 별도 백업의 복구 가능 범위에 맞춰 정해야 한다. 비용 절감만 보고 기간을 줄이면 필요한 복구 지점까지 함께 사라진다.

반대로 최신 이전 버전을 일정 개수 남기는 조건을 추가했다면 일수가 지났다는 이유만으로 모두 삭제되지는 않는다. AWS의 이전 버전 만료는 보존 개수 조건을 함께 설정한 경우 두 조건을 모두 충족해야 실행된다. 자동으로 비워지는 정책이 필요한지, 최소한의 복구 버전을 유지하는 정책이 필요한지 먼저 구분해야 한다.

스토리지 클래스 최소 보관 기간
S3 Standard-IA · S3 One Zone-IA 30일
S3 Glacier Instant Retrieval · Flexible Retrieval 90일
S3 Glacier Deep Archive 180일

이 기간이 끝나기 전에 삭제하면 남은 기간에 해당하는 보관료가 비례 청구된다. 수명 주기의 이전 버전 보존 기간과 스토리지 클래스의 최소 보관 기간은 서로 다른 기준이므로, 이전 버전을 저렴한 클래스로 전환한 뒤 곧바로 삭제하는 정책은 예상한 만큼 절약되지 않을 수 있다.

출처: AWS 공식 문서 「Expiring objects」 및 Amazon S3 Pricing의 최소 보관 기간 안내.

5. S3 버전 영구 삭제 전 확인과 비용 검증

특정 버전을 즉시 영구 삭제하려면 삭제 요청에 versionId를 지정해야 한다. 콘솔에서도 버전 표시를 켠 뒤 대상 데이터 버전을 선택해 삭제할 수 있다. 영구 삭제한 데이터 버전은 S3 Versioning으로 복구할 수 없으므로, 객체 키와 버전 ID를 함께 확인해야 한다.

삭제 마커만 지우는 작업은 데이터 버전 삭제와 결과가 다르다. 최신 삭제 마커를 제거하면 바로 아래에 남은 데이터 버전이 다시 현재 버전으로 드러날 수 있다. 비용을 줄이려다 삭제했던 파일을 다시 노출시키지 않도록 데이터 버전과 마커를 구분해야 한다.

💡 참고: S3 Object Lock의 보존 기간이나 법적 보존이 적용된 버전은 보호 조건 때문에 영구 삭제가 제한될 수 있다. 일반 삭제로 마커가 추가됐다는 사실은 보호된 데이터 버전까지 없어졌다는 뜻이 아니다.

S3 Lifecycle은 하루 단위로 대상을 평가하며 실제 삭제는 비동기로 진행된다. 규칙 저장 직후 목록이 비워지는 방식이 아니어서 처리에 며칠이 걸릴 수 있다. AWS는 수명 주기에 따라 만료된 객체의 실제 제거가 지연되더라도 그 지연 기간의 저장 요금은 부과하지 않는다고 안내하지만, 최소 보관 기간에 따른 요금은 별도로 고려해야 한다.

  • 규칙 범위: 정리하려는 키가 접두사·필터에 실제로 포함되는지 확인한다.
  • 이전 버전 조건: 경과 일수와 추가한 보존 개수 조건을 함께 확인한다.
  • 처리 결과: Show versions 또는 버전 목록 API로 데이터 버전과 삭제 마커를 다시 조회한다.
  • 비용 내역: 이미 발생한 보관료와 최소 보관 기간 요금을 이후 저장 요금과 구분한다.

운영 관점에서 중요한 것은 삭제 버튼을 누른 횟수가 아니라 복구 가능한 데이터를 언제까지 보관하고, 언제 영구 제거할지 명시하는 것이다. 버전 목록 확인으로 남아 있는 데이터를 파악한 뒤, 필요한 복구 기간만큼 이전 버전을 보존하도록 설정하면 비용과 복구 가능성을 함께 관리할 수 있다.

출처: AWS 공식 문서 「Deleting object versions from a versioning-enabled bucket」, 「Troubleshooting versioning」, 「Expiring objects」 및 AWS re:Post의 S3 Lifecycle 버킷 정리 안내. 공식 문서 확인 기준: 2026년 10월.