

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 管理刪除標記
<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/zh_tw/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/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## 使用 S3 主控台
<a name="undelete-objects"></a>

使用下列步驟，從 S3 儲存貯體中復原不是資料夾的已刪除物件，包括這些資料夾內的物件。

1. 登入 AWS 管理主控台 並開啟位於 https：//[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 SDKs
<a name="remove-delete-marker-examples-sdk"></a>

如需使用 AWS SDKs的詳細資訊，請參閱 [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)
```

------