

# 삭제 마커 관리
<a name="ManagingDelMarkers"></a>

## 만료된 삭제 마커를 자동으로 정리하는 수명 주기 구성
<a name="LifecycleDelMarker"></a>

만료된 객체 삭제 마커는 모든 객체 버전이 삭제되고 하나의 삭제 마커만 남은 마커입니다. 수명 주기 구성이 현재 버전을 삭제하도록 설정되어 있거나 `ExpiredObjectDeleteMarker` 작업이 명시적으로 설정된 경우 Amazon S3는 만료된 객체의 삭제 마커를 제거합니다. 관련 예제는 [버전 관리를 사용하는 버킷에서 만료된 객체 삭제 마커 제거](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7) 섹션을 참조하세요 

## 이전 버전을 현재 버전으로 만들기 위해 삭제 마커 제거
<a name="RemDelMarker"></a>

버전 관리가 사용 설정된 버킷에서 한 객체를 삭제하면 모든 버전이 버킷에 그대로 유지되며 Amazon S3는 해당 객체에 대한 삭제 마커를 생성합니다. 객체 삭제를 취소하려면 이 삭제 마커를 삭제해야 합니다. 버전 관리와 삭제 마커에 대한 자세한 정보는 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md)을 참조하세요.

삭제 마커를 영구적으로 삭제하려면 `DeleteObject versionId` 요청에 삭제 마커의 버전 ID를 포함해야 합니다. 다음 그림은 `DeleteObject versionId` 요청이 어떻게 삭제 마커를 영구적으로 제거하는지를 보여 줍니다.

![버전 ID를 사용한 삭제 마커 삭제를 보여 주는 그림.](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


삭제 마커 제거의 영향으로 단순 `GET` 요청은 이제 현재 버전 ID(121212)의 객체를 가져옵니다.

**참고**  
현재 버전이 삭제 마커인 `DeleteObject` 요청을 사용하는 경우(삭제 마커의 버전 ID 지정 없이) Amazon S3은 삭제 마커를 삭제하지 않고 그 대신 다른 삭제 마커를 넣습니다(`PUTs`).

`NULL` 버전 ID를 사용해 삭제 마커를 삭제하려면 `DeleteObject` 요청에서 버전 ID로 `NULL`을 전달해야 합니다. 다음 그림은 버전 ID 없이 이루어진 단순 `DeleteObject` 요청(현재 버전이 삭제 마커임)으로 아무것도 제거되지 않고, 그 대신 고유한 버전 ID(7498372)의 추가적인 삭제 마커가 추가되는 과정을 보여주고 있습니다.

![NULL 버전 ID를 사용한 삭제 마커 삭제를 보여 주는 그림.](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## S3 콘솔 사용
<a name="undelete-objects"></a>

다음 단계를 사용하여 S3 버킷의 폴더가 아닌 S3 버킷에서 삭제된 객체(해당 폴더 내에 있는 객체 포함)를 복원할 수 있습니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷(Buckets)** 목록에서 원하는 버킷의 이름을 선택합니다.

1. 버킷에 있는 객체 **버전** 목록을 확인하려면 [**버전 나열(List versions)**] 스위치를 선택합니다. 삭제된 객체들에 대한 삭제 마커를 볼 수 있습니다.

   

1. 어떤 객체의 삭제를 취소하려면 삭제 마커를 삭제해야 합니다. 복원할 객체의 **삭제 마커** 옆에 있는 확인란을 선택한 후, **삭제(Delete)**를 선택합니다.

1. **객체 삭제(Delete objects)** 페이지에서 삭제를 확인합니다.

   1. **Permanently delete objects?(객체를 영구적으로 삭제하시겠습니까?)**에 **permanently delete**를 입력합니다.

   1. **객체 삭제(Delete objects)**를 선택합니다.

**참고**  
Amazon S3 콘솔을 사용하여 폴더의 삭제를 취소할 수 없습니다. AWS CLI 또는 SDK를 사용해야 합니다. 예를 들어 AWS 지식 센터에서 [버전 관리 지원 버킷에서 삭제된 Amazon S3 객체를 검색하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/s3-undelete-configuration/)를 참조하세요.

## REST API 사용
<a name="delete-marker-rest-api"></a>

**영구적으로 삭제 마커 제거**

1. `versionId`를 제거하려는 삭제 마커의 버전 ID에 설정합니다.

1. `DELETE Object versionId` 요청을 보냅니다.

**Example - 삭제 마커 제거**  
다음 예제에서는 `photo.gif` 버전 4857693에 대한 삭제 마커를 제거합니다.  

```
1. DELETE /photo.gif?versionId=4857693 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

삭제 마커를 삭제하는 경우 Amazon S3에서는 응답에 다음을 포함합니다.

```
1. 204 NoContent 
2. x-amz-version-id: {{versionID}} 
3. x-amz-delete-marker: true
```

## AWS SDK 사용
<a name="remove-delete-marker-examples-sdk"></a>

다른 AWS SDK 사용에 대한 자세한 내용은 [AWS 개발자 센터](https://aws.amazon.com/code/)를 참조하세요.

------
#### [ Python ]

다음 Python 코드 예제에서는 객체에서 삭제 마커를 제거하여 현재 버전이 아닌 최신 버전을 객체의 현재 버전으로 만드는 방법을 보여 줍니다.

```
def revive_object(bucket, object_key):
    """
    Revives a versioned object that was deleted by removing the object's active
    delete marker.
    A versioned object presents as deleted when its latest version is a delete marker.
    By removing the delete marker, we make the previous version the latest version
    and the object then presents as *not* deleted.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to revive.
    """
    # Get the latest version for the object.
    response = s3.meta.client.list_object_versions(
        Bucket=bucket.name, Prefix=object_key, MaxKeys=1
    )

    if "DeleteMarkers" in response:
        latest_version = response["DeleteMarkers"][0]
        if latest_version["IsLatest"]:
            logger.info(
                "Object %s was indeed deleted on %s. Let's revive it.",
                object_key,
                latest_version["LastModified"],
            )
            obj = bucket.Object(object_key)
            obj.Version(latest_version["VersionId"]).delete()
            logger.info(
                "Revived %s, active version is now %s  with body '%s'",
                object_key,
                obj.version_id,
                obj.get()["Body"].read(),
            )
        else:
            logger.warning(
                "Delete marker is not the latest version for %s!", object_key
            )
    elif "Versions" in response:
        logger.warning("Got an active version for %s, nothing to do.", object_key)
    else:
        logger.error("Couldn't get any version info for %s.", object_key)
```

------