

# 排查 Amazon S3 生命周期问题
<a name="troubleshoot-lifecycle"></a>

以下信息可以帮助您排查 Amazon S3 生命周期规则的常见问题。

**Topics**
+ [我对我的桶运行了一个列表操作，看到了我认为已按生命周期规则过期或转换的对象。](#troubleshoot-lifecycle-1)
+ [如何监控生命周期规则执行的操作？](#troubleshoot-lifecycle-2)
+ [即使在启用了版本控制的存储桶上设置了生命周期规则之后，我的 S3 对象计数仍增加。](#troubleshoot-lifecycle-3)
+ [如何使用生命周期规则清空 S3 桶？](#troubleshoot-lifecycle-4)
+ [在将对象转换到成本较低的存储类后，我的 Amazon S3 账单增加了。](#troubleshoot-lifecycle-5)
+ [我已经更新了我的桶策略，但我的 S3 对象仍会被过期的生命周期规则删除。](#troubleshoot-lifecycle-6)
+ [我能否恢复由 S3 生命周期规则过期的 S3 对象？](#troubleshoot-lifecycle-7)
+ [为什么我的到期和转换生命周期操作没有发生？](#troubleshoot-lifecycle-failures)
+ [如何从我的生命周期规则中排除前缀？](#troubleshoot-lifecycle-8)
+ [如何在我的生命周期规则中包含多个前缀？](#troubleshoot-lifecycle-9)

## 我对我的桶运行了一个列表操作，看到了我认为已按生命周期规则过期或转换的对象。
<a name="troubleshoot-lifecycle-1"></a>

S3 生命周期[对象转换](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html)和[对象过期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html)是异步操作。因此，在对象符合过期或转换条件的时间与它们实际转换或过期的时间之间可能会有延迟。一旦满足生命周期规则，即使操作尚未完成，也会立即应用账单的变化。此行为的例外情况是，如果您有一个生命周期规则集转换为 S3 Intelligent-Tiering 存储类。在此类情况下，在对象转换为 S3 Intelligent-Tiering 存储类之前，账单不会发生更改。有关账单变化的更多信息，请参阅[设置桶的生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

**注意**  
Amazon S3 不会将小于 128KB 的对象从 S3 Standard 或 S3 Standard-IA 存储类转换为 S3 Intelligent-Tiering、S3 Standard-IA 或 S3 One Zone-IA 存储类。

## 如何监控生命周期规则执行的操作？
<a name="troubleshoot-lifecycle-2"></a>

要监控生命周期规则执行的操作，可以使用以下功能：
+ **S3 事件通知**：您可以设置 [S3 事件通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configure-notification.html)，以便收到有关任何 S3 生命周期到期或转换事件的通知。
+ **S3 服务器访问日志**：您可以为 S3 存储桶启用服务器访问日志，以捕获 S3 生命周期操作，例如对象转换到另一个存储类或对象到期。有关更多信息，请参阅[生命周期和日志记录](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-and-other-bucket-config.html#lifecycle-general-considerations-logging)。

要每天查看由生命周期操作引起的存储更改，我们建议使用 [S3 Storage Lens 存储统计管理工具控制面板](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_basics_metrics_recommendations.html#storage_lens_basics_dashboards)，而不是使用 Amazon CloudWatch 指标。在 Storage Lens 存储分析功能控制面板中，可以查看以下指标，这些指标监控对象计数或大小：
+ **当前版本字节数**
+ **当前版本对象计数**
+ **非当前版本字节数**
+ **非当前版本对象计数**
+ **删除标记对象计数**
+ **删除标记存储字节数**
+ **未完成的分段上传字节数**
+ **未完成的分段上传对象计数**

## 即使在启用了版本控制的存储桶上设置了生命周期规则之后，我的 S3 对象计数仍增加。
<a name="troubleshoot-lifecycle-3"></a>

在[启用了版本控制的存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html#versioning-states)中，当对象到期时，不会从存储桶中完全删除该对象。而是创建[删除标记](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html)作为对象的最新版本。删除标记仍算作对象。因此，如果创建的生命周期规则仅使当前版本过期，则 S3 桶中的对象计数实际上会增加而不是减少。

例如，假设一个包含 100 个对象的 S3 桶启用了版本控制，并且生命周期规则设置为在 7 天后使对象的当前版本过期。第七天之后，对象计数增加到 200，这是因为除了 100 个原始对象（现在是非当前版本）之外，还创建了 100 个删除标记。有关启用版本控制的桶的 S3 生命周期配置规则操作的更多信息，请参阅[对于桶设置生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

要永久删除对象，请添加额外的生命周期配置以删除对象的先前版本、过期的删除标记和未完成的分段上传。有关如何创建新的生命周期规则的说明，请参阅[对于桶设置生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

**注意**  
Amazon S3 将对象的转换或过期日期舍入到第二天的世界标准时间午夜。  
在评估对象的生命周期操作时，Amazon S3 使用以 UTC 表示的对象创建时间。例如，假设一个不受版本控制的存储桶，其生命周期规则配置为在一天后对象就会到期。假设一个对象是在太平洋夏令时（PDT）的 1 月 1 日 17:05 创建的，该时间对应于 UTC 时间 1 月 2 日 00:05。该对象在 UTC 时间 1 月 3 日 00:05 时已存在一天，因此，当 S3 生命周期在 UTC 时间 1 月 4 日 00:00 评估对象时，该对象符合到期条件。  
由于 Amazon S3 生命周期操作是异步发生的，因此，在生命周期规则中指定的日期与对象的实际物理转换之间可能会有一些延迟。有关更多信息，请参阅[转换或到期延迟](how-to-set-lifecycle-configuration-intro.md#lifecycle-action-delay)。  
有关更多信息，请参阅[生命周期规则：基于对象的存在期限](https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#intro-lifecycle-rules-number-of-days)。
对于受对象锁定保护的 S3 对象，不会永久删除当前版本。而是向对象添加删除标记，使其成为非当前对象。非当前版本将被保留，并且不会永久过期。

## 如何使用生命周期规则清空 S3 桶？
<a name="troubleshoot-lifecycle-4"></a>

S3 生命周期规则是[清空包含数百万个对象的 S3 桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)的有效工具。要从 S3 存储桶中删除大量对象，请确保使用以下两对生命周期规则：
+ **将对象的当前版本设为过期**和**永久删除对象的先前版本**
+ **删除过期的删除标记**和**删除未完成的分段上传**

有关如何创建生命周期配置规则的步骤，请参阅[对于桶设置生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

**注意**  
对于受对象锁定保护的 S3 对象，不会永久删除当前版本。而是向对象添加删除标记，使其成为非当前对象。非当前版本将被保留，并且不会永久过期。

## 在将对象转换到成本较低的存储类后，我的 Amazon S3 账单增加了。
<a name="troubleshoot-lifecycle-5"></a>

将对象转换为成本较低的存储类后，您的账单可能会增加，原因有很多：
+ 小型对象的 S3 Glacier 开销费用

  对于每个转换为 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 的对象，与此存储更新关联的总开销为 40KB。作为 40KB 开销的一部分，8KB 用于存储元数据和对象的名称。此 8KB 按照 S3 Standard 费率收费。剩余的 32KB 用于编制索引和相关的元数据。这 32KB 按照 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 定价收费。

  因此，如果您要存储许多大小较小的对象，我们不建议使用生命周期转换。相反，为了减少任何开销费用，请考虑在将许多较小的对象存储到 Amazon S3 中之前，将它们聚合为数量较少的大型对象。有关成本注意事项的更多信息，请参阅[转换为 S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 存储类（对象存档）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#before-deciding-to-archive-objects)。
+ 最低存储费用

  某些 S3 存储类有最短存储持续时间要求。在满足最短持续时间之前从这些类中删除、覆盖或转换的对象将按比例收取提前转换或删除费用。这些最短存储持续时间要求如下所示：
  + S3 Standard-IA 和 S3 One Zone-IA – 30 天
  + S3 Glacier Flexible Retrieval 和 S3 Glacier Instant Retrieval – 90 天
  + S3 Glacier Deep Archive – 180 天

  有关这些要求的更多信息，请参阅[使用 S3 生命周期转换对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html)的*约束*部分。有关一般 S3 定价信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)和 [AWS 定价计算器](https://calculator.aws/#/addService/S3)。
+ 生命周期转换成本

  每次通过生命周期规则将对象转换到不同的存储类时，Amazon S3 都会将该转换视为一个转换请求。这些转换请求的成本未包含在这些存储类的成本中。如果计划转换大量对象，请在转换到较低层时考虑请求成本。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

## 我已经更新了我的桶策略，但我的 S3 对象仍会被过期的生命周期规则删除。
<a name="troubleshoot-lifecycle-6"></a>

桶策略中的 `Deny` 语句不会阻止在生命周期规则中定义的对象过期。生命周期操作（例如转换或过期）不使用 S3 `DeleteObject` 操作。相反，S3 生命周期操作是使用内部 S3 端点执行的。（有关更多信息，请参阅[生命周期和日志记录](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-and-other-bucket-config.html#lifecycle-general-considerations-logging)。） 

要防止您的生命周期规则采取任何操作，您必须编辑、删除或[禁用该规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-examples.html#lifecycle-config-conceptual-ex2)。

## 我能否恢复由 S3 生命周期规则过期的 S3 对象？
<a name="troubleshoot-lifecycle-7"></a>

恢复由 S3 生命周期过期的对象的唯一方法是通过版本控制，版本控制必须在对象符合过期条件之前就位。您无法撤消由生命周期规则执行的过期操作。如果现有的 S3 生命周期规则永久删除了对象，则无法恢复这些对象。要对桶启用版本控制，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

如果您已对桶应用了版本控制，并且对象的非当前版本仍然完好无损，则可以[恢复过期对象的先前版本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RestoringPreviousVersions.html)。有关 S3 生命周期规则操作的行为和版本控制状态的更多信息，请参阅[描述生命周期操作的元素](https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-rules.html#non-current-days-calculations)中的*生命周期操作和桶版本控制状态*表。

**注意**  
如果 S3 桶受 [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/s3-backups.html) 或 [S3 复制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html)保护，则您也可以使用这些功能来恢复过期的对象。

## 为什么我的到期和转换生命周期操作没有发生？
<a name="troubleshoot-lifecycle-failures"></a>

对于已启用版本控制或已暂停版本控制的存储桶，以下注意事项决定了 Amazon S3 如何处理到期操作：
+ 对象过期仅适用于对象的当前版本（它对非当前对象版本没有影响）。
+ 如果有一个或多个对象版本，并且删除标记是当前版本，则 Amazon S3 不会执行任何操作。
+ Amazon S3 不会对应用了 S3 对象锁定的非当前版本的对象执行任何操作。
+ 对于具有 `PENDING` 复制状态的对象，Amazon S3 不会对当前或非当前版本的对象执行任何操作。

生命周期存储类转换具有以下约束：
+ 默认情况下，小于 128 KB 的对象不会转换到任何存储类。
+ 对象必须存储至少达 30 天，才能转换到 S3 Standard-IA 或 S3 One Zone-IA。
+ 对于启用了版本控制或已暂停版本控制的存储桶，无法转换具有 `PENDING` 复制状态的对象。

## 如何从我的生命周期规则中排除前缀？
<a name="troubleshoot-lifecycle-8"></a>

S3 生命周期不支持在规则中排除前缀。而是，使用标签来标记要包含在规则中的所有对象。有关在生命周期规则中使用标签的更多信息，请参阅[在创建后的一天内归档所有对象](lifecycle-configuration-examples.md#lifecycle-config-ex1)。

## 如何在我的生命周期规则中包含多个前缀？
<a name="troubleshoot-lifecycle-9"></a>

S3 生命周期不支持在规则中包含多个前缀。而是，使用标签来标记要包含在规则中的所有对象。有关在生命周期规则中使用标签的更多信息，请参阅[在创建后的一天内归档所有对象](lifecycle-configuration-examples.md#lifecycle-config-ex1)。

但是，如果您有一个或多个前缀以相同的字符开头，则可以通过在筛选条件中指定不带尾部斜杠 (`/`) 的部分前缀，来将所有这些前缀包含在规则中。例如，假设您有以下前缀：

```
sales1999/
sales2000/
sales2001/
```

要在规则中包含所有三个前缀，请在生命周期规则中指定 `<Prefix>sales</Prefix>`。