

# 从启用了版本控制的存储桶中删除对象版本
<a name="DeletingObjectVersions"></a>

您在需要时随时可以从 Amazon S3 存储桶中删除对象版本。您还可为具有明确定义的生命周期的对象定义生命周期配置规则，请求 Amazon S3 使当前对象版本过期，或者永久删除非当前对象版本。当存储桶已启用版本控制或者版本控制已暂停时，生命周期配置操作的工作方式如下：
+ `Expiration` 操作适用于当前对象版本。Amazon S3 通过添加*删除标记*将当前版本作为非当前版本保留（而不是删除当前对象版本），然后删除标记将成为当前版本。
+ `NoncurrentVersionExpiration` 操作适用于非当前对象版本，Amazon S3 会永久删除这些对象版本。无法恢复永久删除的对象。

有关 S3 生命周期的更多信息，请参阅[管理对象的生命周期](object-lifecycle-mgmt.md)和[S3 生命周期配置的示例](lifecycle-configuration-examples.md)。

要查看您的存储桶有多少个当前和非当前对象版本，您可以使用 Amazon S3 Storage Lens 存储统计管理工具指标。S3 Storage Lens 存储统计管理工具是一项云存储分析功能，您可以使用它在整个组织范围内了解对象存储的使用情况和活动。有关更多信息，请参阅[使用 S3 Storage Lens 存储统计管理工具优化存储成本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-optimize-storage.html?icmpid=docs_s3_user_guide_DeletingObjectVersions.html)。有关指标的完整列表，请参阅 [S3 Storage Lens 存储统计管理工具指标词汇表](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html)。

**注意**  
 正常的 Amazon S3 费率适用于存储和传输的每个对象版本，包括非当前对象版本。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

## 删除请求使用案例
<a name="delete-request-use-cases"></a>

`DELETE` 请求具有以下使用案例：
+ 启用版本控制后，简单 `DELETE` 无法永久删除对象。（简单 `DELETE` 请求是指未指定版本 ID 的请求。） Amazon S3 将在存储桶中插入删除标记，该删除标记将成为对象的当前版本并具有新的 ID。

  当您尝试对当前版本为删除标记的对象执行 `GET` 操作时，Amazon S3 将该对象作为已删除对象对待（即使它尚未被擦除），并返回 404 错误。有关更多信息，请参阅 [使用删除标记](DeleteMarker.md)。

  下图显示简单 `DELETE` 实际上不会删除指定的对象。但是，Amazon S3 将插入一个删除标记。  
![\[图中显示了删除标记插入。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)
+ 要永久删除受版本控制的对象，您必须使用 `DELETE Object versionId`。

  下图显示删除指定的对象版本将永久删除该对象。  
![\[图中显示了 DELETE Object versionId 如何永久删除特定对象版本。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)

## 要删除对象版本
<a name="delete-object-version"></a>

您可以使用控制台、AWS SDK 或 REST API 或 AWS Command Line Interface 删除 Amazon S3 中的对象版本。

### 使用 S3 控制台
<a name="deleting-object-versions"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在**存储桶**列表中，请选择包含对象的存储桶的名称。

1. 在 **Objects**（对象）列表中，请选择对象的名称。

1. 请选择 **Versions**（版本）。

   Amazon S3 显示了对象的所有版本。

1. 选中要检索的版本的**版本 ID** 旁的复选框。

1. 请选择 **Delete**（删除）。

1. 在 **Permanently delete objects?**（永久删除对象？）中，输入 **permanently delete**。
**警告**  
永久删除对象版本时，该操作将无法撤消。

1. 请选择 **Delete objects**（删除对象）。

   Amazon S3 将删除对象版本。

### 使用 AWS SDK
<a name="delete-obj-version-version-enabled-bucket-sdks"></a>

有关使用适用于 Java、.NET 和 PHP 的 AWS SDK 删除对象的示例，请参阅 [删除 Amazon S3 对象](DeletingObjects.md)。在不受版本控制和启用了版本控制的存储桶中删除对象的示例是相同的。但是，对于启用了版本控制的存储桶，Amazon S3 会分配版本号。否则，版本号为空。

有关使用其他 AWS SDK 的信息，请参阅 [AWS 开发人员中心](https://aws.amazon.com/code/)。

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

以下 Python 代码示例通过删除版本控制对象的所有版本永久删除了该对象。

```
def permanently_delete_object(bucket, object_key):
    """
    Permanently deletes a versioned object by deleting all of its versions.

    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 delete.
    """
    try:
        bucket.object_versions.filter(Prefix=object_key).delete()
        logger.info("Permanently deleted all versions of object %s.", object_key)
    except ClientError:
        logger.exception("Couldn't delete all versions of %s.", object_key)
        raise
```

------

### 使用 REST API
<a name="delete-obj-version-enabled-bucket-rest"></a>

**删除对象的特定版本**
+ 在 `DELETE` 中，指定版本 ID。

**Example — 删除特定版本**  
以下示例删除了 `UIORUnfnd89493jJFJ` 的版本 `photo.gif`。  

```
1. DELETE /photo.gif?versionId=UIORUnfnd89493jJFJ HTTP/1.1 
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 12 Oct 2009 17:50:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
5. Content-Type: text/plain
6. Content-Length: 0
```

### 使用 AWS CLI
<a name="delete-obj-version-enabled-bucket-cli"></a>

以下命令从名为 `amzn-s3-demo-bucket1` 的存储桶中删除名为 test.txt 的对象。要删除特定版本的对象，您必须是存储桶拥有者，并且您必须使用版本 Id 子资源。

```
aws s3api delete-object --bucket amzn-s3-demo-bucket1 --key test.txt --version-id versionID
```

有关 `delete-object` 的更多信息，请参阅《AWS CLI 命令参考》**中的 [https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html)。

有关删除对象版本的更多信息，请参阅以下主题：
+ [使用删除标记](DeleteMarker.md)
+ [删除删除标记以使旧版本变为当前版本](ManagingDelMarkers.md#RemDelMarker)
+ [从启用了 MFA 删除的存储桶中删除对象](UsingMFADelete.md)