

# 削除マーカーの管理
<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/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


削除マーカーを削除すると、シンプルな `GET` リクエストがオブジェクトの現行バージョン ID (121212) を取得するようになります。

**注記**  
現行バージョンが削除マーカーである場合に、削除マーカーのバージョン ID を指定せずに `DeleteObject` リクエストを使用すると、Amazon S3 は削除マーカーを削除せず、その代わりに別の削除マーカーを `PUTs` します。

`NULL` バージョン ID を持つ削除マーカーを削除するには、`DeleteObject` リクエストのバージョン ID として `NULL` を渡す必要があります。以下の図は、現行バージョンが削除マーカーになっているときに、バージョンID なしで実行されたシンプルな `DeleteObject` リクエストが何も削除せず、その代わりに一意のバージョン ID (7498372) を持つ削除マーカーをさらに追加する状況を示しています。

![\[NULL バージョン ID を使用した削除マーカーの削除を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## S3 コンソールの使用
<a name="undelete-objects"></a>

S3 バケットから削除されたフォルダ以外のオブジェクト (フォルダ内のオブジェクトも含む) を復元するには、以下の手順を実行します。

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. [**Buckets (バケット)**] リストで、目的のバケットの名前を選択します。

1. バケット内のオブジェクトの**バージョン**一覧を表示するには、[**バージョンのリスト**] を選択します。削除されたオブジェクトの削除マーカーを表示できます。

   

1. 削除したオブジェクトを復元するには、削除マーカーを削除する必要があります。復元するオブジェクトの**削除マーカー**の横にあるチェックボックスを選択し、次に [**削除**] を選択します。

1. [**オブジェクトの削除**] ページで削除を確認します。

   1. **[オブジェクトを完全に削除しますか?]** に、**permanently delete** と入力します。

   1. **[オブジェクトの削除]** を選択します。

**注記**  
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)
```

------