

# 删除 Amazon S3 对象
<a name="DeletingObjects"></a>

您可以使用 Amazon S3 控制台、Amazon SDK、Amazon Command Line Interface (Amazon CLI) 或 REST API 直接从 Amazon S3 删除一个或多个对象。例如，如果您正在收集日志文件，最好在不再需要这些文件时将其删除。可以[设置 S3 生命周期规则](https://docs.amazonaws.cn/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)来自动删除对象（如日志文件）。

要删除对象，可以使用以下 API 操作之一：
+ **删除单个对象** – Amazon S3 提供了 `DELETE`（`DeleteObject`）API 操作，使您能够删除单个 HTTP 请求中的一个对象。
+ **删除多个对象** – Amazon S3 提供了多对象删除（`DeleteObjects`）API 操作，使您能够在单个 HTTP 请求中删除多达 1000 个对象。

从未启用版本控制的存储桶中删除对象时，只需提供对象键名称。但是，当从启用版本控制的存储桶中删除对象时，可以提供对象的版本 ID，来删除该对象的特定版本。

## 删除对象之前应考虑的最佳实践
<a name="DeletingObjects-best-practices"></a>

在删除对象之前，请考虑以下最佳实践：
+ 启用[存储桶版本控制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/manage-versioning-examples.html)。[S3 版本控制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/Versioning.html)增加了对简单 `DeleteObject` 请求的保护，以防止意外删除。对于受版本控制的存储桶，如果您删除对象的当前版本，或删除请求未指定特定版本 ID，则 Amazon S3 不会永久删除该对象。而是 S3 添加一个删除标记，发出对象软删除。然后，删除标记将成为对象的当前（或最新）版本，具有新版本 ID。有关更多信息，请参阅[从启用了版本控制的存储桶中删除对象版本](https://docs.amazonaws.cn/AmazonS3/latest/userguide/DeletingObjectVersions.html)。
+ 如果您要删除大量对象，或者要以编程方式根据对象创建日期删除对象，请[在存储桶上设置 S3 生命周期配置](https://docs.amazonaws.cn/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。要监控这些删除，建议您[使用 S3 生命周期事件通知](https://docs.amazonaws.cn/AmazonS3/latest/userguide/lifecycle-configure-notification.html)。配置 S3 生命周期通知后，如果删除了存储桶中的对象，`s3:LifecycleExpiration:Delete` 事件类型会通知您。当 S3 生命周期配置永久删除对象版本时，它也会通知您。当 S3 生命周期创建删除标记时，`s3:LifecycleExpiration:DeleteMarkerCreated` 事件类型会通知您。在删除受版本控制的存储桶中对象的当前版本后，将创建删除标记。
+ 在对 S3 生命周期配置进行任何更新之前，请确认生命周期已针对所有目标对象完成了操作。有关更多信息，请参阅[在存储桶上设置 S3 生命周期配置](https://docs.amazonaws.cn/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)中的**更新、禁用或删除生命周期规则**。
**注意**  
S3 生命周期规则必须应用于对象的正确子集，以防止意外删除。在创建生命周期规则时，可以按前缀、对象标签或对象大小筛选对象。
+ 考虑限制用户从存储桶中移除或删除对象。要限制用户，您需要在 [Amazon S3 存储桶策略](https://docs.amazonaws.cn/AmazonS3/latest/userguide/bucket-policies.html)中显式拒绝用户执行以下操作的权限：
  + `s3:DeleteObject`、`s3:DeleteObjectVersion`（控制谁可以使用 API 请求删除对象）
  + `s3:PutLifecycleConfiguration`（控制谁可以添加 S3 生命周期到期规则）
+ 考虑使用 [S3 复制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/replication.html)来创建数据的多个副本，并将它们同时复制到多个位置。可以根据需要选择任意数量的目标存储桶。此外，如果无意中删除了某个对象，您仍将拥有该数据的副本。
+ 避免向未受版本控制的存储桶发送对象版本 ID。此外，请确保对所有存储桶（包括未受版本控制的存储桶）正确设置 `s3:DeleteObject` 和 `s3:DeleteObjectVersion` 权限。

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

如果存储桶已启用版本控制，则存储桶中可能存在同一对象的多个版本。使用启用了版本控制的存储桶时，`Delete` API 操作将启用以下选项：
+ **指定不受版本控制的删除请求** – 仅指定对象的键，而不指定版本 ID。在此情况下，Amazon S3 将在对象的当前版本上创建一个删除标记，并在响应中返回其版本 ID。这将使您的对象从存储桶中消失。有关对象版本控制和删除标记概念的信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。
+ **指定受版本控制的删除请求** – 同时指定键和版本 ID。在此情况下，可能会出现以下结果：
  + 如果版本 ID 映射到特定的对象版本，则 Amazon S3 将删除该特定版本的对象。
  + 如果版本 ID 映射到对象的删除标记，则 Amazon S3 将删除该删除标记。删除了删除标记后，该对象随后会重新出现在存储桶中。

## 从已暂停版本控制的存储桶中删除对象
<a name="Deleting-objects-versioning-suspended-bucket"></a>

如果存储桶已暂停版本控制，则 `Delete` API 操作的行为方式与启用版本控制的存储桶相同（但当前版本的版本 ID 为空时除外）。有关更多信息，请参阅 [从已暂停版本控制的存储桶中删除对象](DeletingObjectsfromVersioningSuspendedBuckets.md)。

## 从不受版本控制的存储桶中删除对象
<a name="Deleting-objects-unversioned-bucket"></a>

如果存储桶不受版本控制，则可以在 `Delete` API 操作中指定对象的键，而 Amazon S3 将永久删除该对象。为防止永久删除对象，请[启用存储桶版本控制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/manage-versioning-examples.html)。

对于未受版本控制的存储桶，如果存储桶策略中明确拒绝了 `s3:DeleteObject` 或 `s3:DeleteObjectVersion` 权限，则任何 `DeleteObject`、`DeleteObjects` 或 `DeleteObjectVersion` 请求都会导致 `403 Access Denied` 错误。

## 从启用了 MFA 的存储桶中删除对象
<a name="DeletingObjectsfromanMFA-EnabledBucket"></a>

从启用了多重身份验证（MFA）的存储桶中删除对象时，请注意以下内容：
+ 如果您提供了无效的 MFA 令牌，请求将始终失败。
+ 如果您拥有一个启用了 MFA 的存储桶，并且发送了一个受版本控制的删除请求（您提供了对象键和版本 ID），若您不能提供有效的 MFA 令牌，请求将失败。此外，对启用了 MFA 的存储桶使用多对象 `Delete` API 操作时，如果任何删除是受版本控制的删除请求（也即，您指定了对象键和版本 ID），若不能提供有效的 MFA 令牌，则整个请求将失败。

但是，在下面的情况下，请求将成功：
+ 如果您拥有一个启用了 MFA 的存储桶，并发出一个不受版本控制的删除请求（不删除受版本控制的对象），且您未提供 MFA 令牌，删除会成功。
+ 如果您发出一个多对象删除请求，此请求指定从一个启用了 MFA 的存储桶中仅删除不受版本控制的对象，且您未提供 MFA 令牌，这些删除会成功。

有关 MFA 删除的信息，请参阅 [配置 MFA 删除](MultiFactorAuthenticationDelete.md)。

**Topics**
+ [删除对象之前应考虑的最佳实践](#DeletingObjects-best-practices)
+ [从启用版本控制的存储桶中删除对象](#DeletingObjectsfromaVersion-EnabledBucket)
+ [从已暂停版本控制的存储桶中删除对象](#Deleting-objects-versioning-suspended-bucket)
+ [从不受版本控制的存储桶中删除对象](#Deleting-objects-unversioned-bucket)
+ [从启用了 MFA 的存储桶中删除对象](#DeletingObjectsfromanMFA-EnabledBucket)
+ [删除单个对象](delete-objects.md)
+ [删除多个对象](delete-multiple-objects.md)