[AWS] S3 버킷 버저닝(Versioning) 과 삭제마커(Delete Maker)
IT/AWS

[AWS] S3 버킷 버저닝(Versioning) 과 삭제마커(Delete Maker)

반응형

S3 객체 버저닝(Versioning)이란?

S3 객체 버전 관리를 사용하면 객체의 여러 버전을 유지할 수 있습니다. 객체를 변경하면 S3는 새 버전을 생성하고 이를 저장하므로 필요한 경우 이전 버전으로 되돌릴 수 있습니다.

AWS S3 삭제 마커(Delete Maker)란 ?

삭제 마커는 버전 관리가 활성화된 S3 버킷의 기능입니다. 버전 관리가 활성화된 버킷에서 객체를 삭제해도 해당 객체는 영구적으로 삭제되지 않습니다. 대신 AWS는 객체에 대한 자리 표시자(또는 마커)를 생성합니다. 이 마커를 삭제 마커라고 합니다. 이 마커는 개체의 현재 버전이 됩니다. 삭제 마커는 AWS S3가 마치 객체가 삭제된 것처럼 동작하도록 만듭니다.

아래 그림과 같이 버저닝이 활성화 된경우 DELETE를 할때 지정된 객체를 제거하지 않고 대신 삭제 마커를 입력 하게 됩니다.

삭제 마커의 작동 원리

버전 관리가 활성화된 S3 버킷의 객체에 대해 DELETE 요청을 하면 Amazon S3는 객체를 영구적으로 삭제하지 않습니다. 대신 S3는 해당 버킷에 삭제 마커를 삽입하고 해당 마커는 새 ID를 가진 객체의 현재 버전이 됩니다.

삭제 마커에는 다음과 같은 속성이 있습니다.

  • 다른 객체와 마찬가지로 키 이름(또는 키) 및 버전 ID입니다.
  • 관련된 데이터가 없습니다.
  • ACL(액세스 제어 목록) 값과 연결되지 않습니다.
  • 데이터가 없기 때문에 GET 요청에서 아무것도 검색하지 않습니다. 404 오류가 발생합니다.
  • 삭제 마커에 사용할 수 있는 유일한 작업은 DELETE이며, 버킷 소유자만 이러한 요청을 실행할 수 있습니다.

객체를 가져오려고 하는데 현재 버전이 삭제 마커인 경우 Amazon S3는 다음과 같이 응답합니다.

  • 404(개체를 찾을 수 없음) 오류
  • 응답 헤더:x-amz-delete-marker: true

검증해보자

버전 관리가 활성화된 버킷에서 객체 삭제

aws s3api delete-object --bucket kym-test-s3 --key test.png

{
"DeleteMarker": true,
"VersionId": "3txP5qiz0dyZXnWF9LMBSqYFNm2d_FqW"
}

S3에서 객체 검색

aws s3api get-object --bucket kym-test-s3 --key test.png test.png

An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.

S3에서 모든 객체 버전 검색

특정 개체의 모든 버전을 검색할 수 있습니다.

aws s3api list-object-versions --bucket kym-test-s3

{
    "Versions": [
        {
            "ETag": "\"6e15da68a1616095266dc2ecc0f54148\"",
            "Size": 115211,
            "StorageClass": "STANDARD",
            "Key": "test.png",
            "VersionId": "DUjhiQ1YlAfNMwxa9ulyHKR6hlG2iXgh",
            "IsLatest": false,
            "LastModified": "2024-01-05T06:50:37+00:00",
            "Owner": {
                "ID": "43df4eaa7f91106dfce1d36653df6ccf2850571448fa93e4ae88cb5871569466"
            }
        },
        {
            "ETag": "\"6e15da68a1616095266dc2ecc0f54148\"",
            "Size": 115211,
            "StorageClass": "STANDARD",
            "Key": "스크린샷 2024-01-05 오후 2.37.31.png",
            "VersionId": "4o6TkoF4Ol7J63mV.T75FyA8hVIfvE5l",
            "IsLatest": false,
            "LastModified": "2024-01-05T06:50:28+00:00",
            "Owner": {
                "ID": "43df4eaa7f91106dfce1d36653df6ccf2850571448fa93e4ae88cb5871569466"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "ID": "43df4eaa7f91106dfce1d36653df6ccf2850571448fa93e4ae88cb5871569466"
            },
            "Key": "test.png",
            "VersionId": "3txP5qiz0dyZXnWF9LMBSqYFNm2d_FqW",
            "IsLatest": true,
            "LastModified": "2024-01-05T06:50:41+00:00"
        },
        {
            "Owner": {
                "ID": "43df4eaa7f91106dfce1d36653df6ccf2850571448fa93e4ae88cb5871569466"
            },
            "Key": "test.png",
            "VersionId": "null",
            "IsLatest": false,
            "LastModified": "2024-01-05T06:49:20+00:00"
        },
        {
            "Owner": {
                "ID": "43df4eaa7f91106dfce1d36653df6ccf2850571448fa93e4ae88cb5871569466"
            },
            "Key": "스크린샷 2024-01-05 오후 2.37.31.png",
            "VersionId": "anpQMTG6gFHoq_DYhJBQs.i7thv0AUpQ",
            "IsLatest": true,
            "LastModified": "2024-01-05T06:50:38+00:00"
        },
        {
            "Owner": {
                "ID": "43df4eaa7f91106dfce1d36653df6ccf2850571448fa93e4ae88cb5871569466"
            },
            "Key": "스크린샷 2024-01-05 오후 2.37.31.png",
            "VersionId": "null",
            "IsLatest": false,
            "LastModified": "2024-01-05T06:48:55+00:00"
        }
    ],
    "RequestCharged": null
}

이전 버전의 객체 쿼리

요청에 버전 ID를 지정하여 객체의 이전(현재가 아닌) 버전을 검색할 수 있습니다.

aws s3api get-object --bucket kym-test-s3 --key test.png --version-id DUjhiQ1YlAfNMwxa9ulyHKR6hlG2iXgh test.png
{
    "AcceptRanges": "bytes",
    "LastModified": "2024-01-05T06:50:37+00:00",
    "ContentLength": 115211,
    "ETag": "\"6e15da68a1616095266dc2ecc0f54148\"",
    "VersionId": "DUjhiQ1YlAfNMwxa9ulyHKR6hlG2iXgh",
    "ContentType": "image/png",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}

삭제 마커 삭제

객체 삭제 요청에 버전 ID를 지정하여 삭제 마커를 삭제할 수 있습니다. 삭제 표시를 제거하면 이전 버전이 최신 버전이 됩니다.

aws s3api delete-object --bucket kym-test-s3 --key test.png --version-id DUjhiQ1YlAfNMwxa9ulyHKR6hlG2iXgh
{
    "VersionId": "DUjhiQ1YlAfNMwxa9ulyHKR6hlG2iXgh"
}

만료된 삭제 마커를 자동으로 정리하도록 수명 주기 구성

만료된 객체 삭제 마커는 모든 객체 버전이 삭제되고 단일 삭제 마커만 남아 있는 객체입니다. 수명 주기 정책이 현재 버전을 삭제하도록 설정되어 있거나 ExpiredObjectDeleteMarker작업이 명시적으로 설정된 경우 Amazon S3는 만료된 객체의 삭제 마커를 제거합니다.

참조

반응형