

# 生命周期配置元素
<a name="intro-lifecycle-rules"></a>

S3 生命周期配置由生命周期规则组成，这些规则包括各种元素，而这些元素描述 Amazon S3 在对象的生命周期内执行的操作。可以为每个 S3 存储桶分配一个生命周期配置，其中最多可以包含 1000 条规则。可以将 Amazon S3 生命周期配置指定为 XML，该配置包含一个或多个生命周期规则，其中每个规则由一个或多个元素组成。

```
<LifecycleConfiguration>
    <Rule>
         <Element>
    </Rule>
    <Rule>
         <Element>
         <Element>
    </Rule>
</LifecycleConfiguration>
```

每个规则由以下内容组成：
+ 规则元数据，包含规则 ID 以及指示规则是已启用还是已禁用的状态。如果规则处于禁用状态，则 Amazon S3 不会执行规则中指定的任何操作。
+ 标识规则应用到的对象的筛选条件。您可以通过使用对象大小、对象键前缀、一个或多个对象标签或者筛选条件的组合来指定筛选条件。
+ 您希望 Amazon S3 执行指定操作时的一个或多个转换或过期操作，带有位于对象的生命周期内的日期或时间段。

**Topics**
+ [ID 元素](#intro-lifecycle-rule-id)
+ [Status 元素](#intro-lifecycle-rule-status)
+ [Filter 元素](#intro-lifecycle-rules-filter)
+ [用于描述生命周期操作的元素](#intro-lifecycle-rules-actions)
+ [将筛选条件添加到生命周期规则](intro-lifecycle-filters.md)

以下部分介绍了 S3 生命周期配置中的 XML 元素。有关示例配置，请参阅 [S3 生命周期配置的示例](lifecycle-configuration-examples.md)。

## ID 元素
<a name="intro-lifecycle-rule-id"></a>

生命周期配置是在存储桶级别设置的，每个存储桶都有自己的生命周期配置。对于每个存储桶，S3 生命周期配置最多可以有 1000 条规则。此限制不可调整。`<ID>` 元素唯一标识存储桶的生命周期配置中的一条规则。ID 长度最多为 255 个字符。

## Status 元素
<a name="intro-lifecycle-rule-status"></a>

`<Status>` 元素值可以是 `Enabled` 或 `Disabled`。如果规则处于禁用状态，则 Amazon S3 不会执行规则中定义的任何操作。

## Filter 元素
<a name="intro-lifecycle-rules-filter"></a>

S3 生命周期规则可以根据您在规则中指定的 `<Filter>` 元素，应用于存储桶中的所有对象或一部分对象。

您可以按键前缀、对象标签或二者的组合（在此情况下，Amazon S3 使用逻辑 `AND` 组合筛选条件）筛选对象。有关筛选条件的示例和更多信息，请参阅[将筛选条件添加到生命周期规则](intro-lifecycle-filters.md)。
+ **使用键前缀指定筛选条件** – 此示例显示一个 S3 生命周期规则，此规则基于键名前缀（`logs/`）应用于一部分对象。例如，此生命周期规则应用于对象 `logs/mylog.txt`、`logs/temp1.txt` 和 `logs/test.txt`。此规则不应用于对象 `example.jpg`。

  ```
  <LifecycleConfiguration>
      <Rule>
          <Filter>
             <Prefix>logs/</Prefix>
          </Filter>
          transition/expiration actions
           ...
      </Rule>
      ...
  </LifecycleConfiguration>
  ```

  如果您要基于不同的键名称前缀将生命周期操作应用于一部分对象，可指定单独的规则。在每个规则中，指定基于前缀的筛选条件。例如，要描述具有键前缀 `projectA/` 和 `projectB/` 的对象的生命周期操作，可指定两个规则，如下所示：

  ```
  <LifecycleConfiguration>
      <Rule>
          <Filter>
             <Prefix>projectA/</Prefix>
          </Filter>
          transition/expiration actions
           ...
      </Rule>
  
      <Rule>
          <Filter>
             <Prefix>projectB/</Prefix>
          </Filter>
          transition/expiration actions
           ...
      </Rule>
  </LifecycleConfiguration>
  ```

  有关对象键的更多信息，请参阅 [为 Amazon S3 对象命名](object-keys.md)。
+ **指定基于对象标签的筛选条件** – 在以下示例中，此生命周期规则指定基于标签（`key`）和值（`value`）的筛选条件。随后，此规则仅应用于具有特定标签的一部分对象。

  ```
  <LifecycleConfiguration>
      <Rule>
          <Filter>
             <Tag>
                <Key>key</Key>
                <Value>value</Value>
             </Tag>
          </Filter>
          transition/expiration actions
          ...
      </Rule>
  </LifecycleConfiguration>
  ```

  您可以指定基于多个标签的筛选条件。您必须在 `<And>` 元素中包含标签，如以下示例所示。此规则指示 Amazon S3 对具有两个标签（带特定的标签键和值）的对象执行生命周期操作。

  ```
  <LifecycleConfiguration>
      <Rule>
        <Filter>
           <And>
              <Tag>
                 <Key>key1</Key>
                 <Value>value1</Value>
              </Tag>
              <Tag>
                 <Key>key2</Key>
                 <Value>value2</Value>
              </Tag>
               ...
            </And>
        </Filter>
        transition/expiration actions
      </Rule>
  </Lifecycle>
  ```

  此生命周期规则应用于具有指定的两个标签的对象。Amazon S3 执行逻辑 `AND`。请注意以下几点：
  + 每个标签的键和值*都* 必须完全匹配。如果您只指定 `<Key>` 元素而不指定 `<Value>` 元素，则该规则将仅应用于与标签键匹配而*未* 指定值的对象。
  + 此规则应用于具有规则中指定的所有标签的一部分对象。如果某个对象指定了其他标签，则该规则仍将适用。
**注意**  
当您在筛选条件中指定多个标签时，每个标签键必须是唯一的。
+ **指定基于前缀和一个或多个标签的筛选条件** – 在生命周期规则中，您可以指定基于键前缀和一个或多个标签的筛选条件。同样，您必须在 `<And>` 元素中包含所有这些筛选条件元素，如下所示：

  ```
  <LifecycleConfiguration>
      <Rule>
          <Filter>
            <And>
               <Prefix>key-prefix</Prefix>
               <Tag>
                  <Key>key1</Key>
                  <Value>value1</Value>
               </Tag>
               <Tag>
                  <Key>key2</Key>
                  <Value>value2</Value>
               </Tag>
                ...
            </And>
          </Filter>
          <Status>Enabled</Status>
          transition/expiration actions
      </Rule>
  </LifecycleConfiguration>
  ```

  Amazon S3 使用逻辑 `AND` 组合这些筛选条件。也就是说，该规则应用于具有指定键前缀和指定标签的对象子集。一个筛选条件只能有一个前缀以及零个或多个标签。
+ 您可以指定 **empty filter**（空筛选条件），在此情况下，此规则应用于桶中的所有对象。

  ```
  <LifecycleConfiguration>
      <Rule>
          <Filter>
          </Filter>
          <Status>Enabled</Status>
          transition/expiration actions
      </Rule>
  </LifecycleConfiguration>
  ```
+ 要按照 **object size**（对象大小）筛选规则，您可以指定最小的大小 (`ObjectSizeGreaterThan`) 或最大大小 (`ObjectSizeLessThan`)，也可以指定一系列对象大小。

  对象大小值以字节为单位。默认情况下，除非您指定较小的最小大小 (`ObjectSizeGreaterThan`) 或最大大小 (`ObjectSizeLessThan`)，否则小于 128 KB 的对象不会转换到任何存储类。有关更多信息，请参阅 [示例：支持转换小于 128 KB 的对象](lifecycle-configuration-examples.md#lc-small-objects)。

  ```
                      <LifecycleConfiguration>
      <Rule>
          <Filter>
              <ObjectSizeGreaterThan>500</ObjectSizeGreaterThan>   
          </Filter>
          <Status>Enabled</Status>
          transition/expiration actions
      </Rule>
  </LifecycleConfiguration>
  ```
**注意**  
`ObjectSizeGreaterThan` 和 `ObjectSizeLessThan` 筛选条件不包含所指定的值。例如，如果您将大小为 128 KB 到 1024 KB 的对象设置为从 S3 Standard 存储类移到 S3 Standard-IA 存储类，则大小精确为 1024 KB 和 128 KB 的对象将不会转换到 S3 Standard-IA。相反，该规则将仅适用于大小大于 128 KB 且小于 1024 KB 的对象。

  如果要指定对象大小范围，`ObjectSizeGreaterThan` 整数必须小于 `ObjectSizeLessThan` 值。当使用多个筛选条件时，必须将筛选条件包装在 `<And>` 元素中。以下示例显示了如何指定范围在 500 字节到 64000 字节之间的对象。

  ```
  <LifecycleConfiguration>
      <Rule>
          <Filter>
              <And>
                  <Prefix>key-prefix</Prefix>
                  <ObjectSizeGreaterThan>500</ObjectSizeGreaterThan>
                  <ObjectSizeLessThan>64000</ObjectSizeLessThan>
              </And>    
          </Filter>
          <Status>Enabled</Status>
          transition/expiration actions
      </Rule>
  </LifecycleConfiguration>
  ```

## 用于描述生命周期操作的元素
<a name="intro-lifecycle-rules-actions"></a>

通过在 S3 生命周期规则中指定一个或多个以下预定义操作，您可以指示 Amazon S3 在对象的生命周期内执行特定操作。这些操作的效果取决于桶的版本控制状态。
+ **`Transition` 操作元素** – 您指定 `Transition` 操作来将对象从一个存储类转换为另一个存储类。有关转换对象的更多信息，请参阅 [支持的转换](lifecycle-transition-general-considerations.md#lifecycle-general-considerations-transition-sc)。达到对象生命周期内指定的日期或时间段后，Amazon S3 将执行该转换。

  对于受版本控制的桶（已启用版本控制或已暂停版本控制的桶），`Transition` 操作适用于当前对象版本。为了管理非当前版本，Amazon S3 定义了 `NoncurrentVersionTransition` 操作（本主题稍后会对此描述）。
+ **`Expiration` 操作元素** – `Expiration` 操作使规则中标识的对象到期，并且应用于任意 Amazon S3 存储类中符合条件的对象。有关存储类别的更多信息，请参阅 [了解和管理 Amazon S3 存储类](storage-class-intro.md)。Amazon S3 使所有过期的对象不可用。是否永久删除对象取决于桶的版本控制状态。
  + **不受版本控制的存储桶** – `Expiration` 操作导致 Amazon S3 永久移除对象。
  + **受版本控制的桶** – 对于受版本控制的桶（即，已启用版本控制或已暂停版本控制），有一些指导 Amazon S3 如何处理 `Expiration` 操作的注意事项。对于启用版本控制或暂停版本控制的桶，以下内容适用：
    + `Expiration` 操作仅适用于当前版本 (对非当前对象版本没有影响)。
    + 如果有一个或多个对象版本，并且删除标记是当前版本，则 Amazon S3 不会执行任何操作。
    + 如果当前对象版本是唯一的对象版本并且它还是删除标记（也称为*过期对象删除标记*，在这种情况下，所有对象版本都已删除，您只剩下一个删除标记），则 Amazon S3 将删除过期对象删除标记。还可以使用过期操作来指示 Amazon S3 移除所有到期对象删除标记。有关示例，请参阅 [在启用了版本控制的存储桶中移除到期对象删除标记](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。

    有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。

    设置 Amazon S3 以管理过期时，还应该考虑以下各项：
    + **已启用版本控制的桶** 

      如果当前对象版本不是删除标记，Amazon S3 将添加具有唯一的版本 ID 的删除标记。这会使当前对象版本变为非当前版本，并使删除标记变为当前版本。
    + **已暂停版本控制的桶** 

      在已暂停版本控制的存储桶中，到期操作将使 Amazon S3 创建版本 ID 为 `null` 的删除标记。此删除标记会在版本层次结构中将任何对象版本替换为 null 版本 ID，从而实际上删除对象。

此外，Amazon S3 还提供可用于管理受版本控制的桶（即，启用了版本控制和暂停了版本控制的桶）中的非当前对象版本的以下操作。
+ **`NoncurrentVersionTransition` 操作元素** – 使用此操作可指定 Amazon S3 何时将对象转换到指定的存储类。您可以根据自对象变为非当前版本以来的一定天数 (`<NoncurrentDays>`) 来确定此转换。除了天数之外，还可以指定要保留的非当前版本的数量 (`<NewerNoncurrentVersions>`)（介于 1 和 100 之间）。此值确定在 Amazon S3 可以转换给定版本之前，必须存在多少个较新的非当前版本。Amazon S3 将转换超过要保留的指定数量的任何其它非当前版本。要进行转换，必须同时超过 `<NoncurrentDays>` **和** `<NewerNoncurrentVersions>` 的值。

  要指定要保留的非当前版本数量，还必须提供 `<Filter>` 元素。如果您未指定 `<Filter>` 元素，Amazon S3 会在您指定要保留的非当前版本数量时生成 `InvalidRequest` 错误。

  有关转换对象的更多信息，请参阅 [支持的转换](lifecycle-transition-general-considerations.md#lifecycle-general-considerations-transition-sc)。有关当您在 `NoncurrentVersionTransition` 操作中指定天数时 Amazon S3 如何计算日期的详细信息，请参阅 [生命周期规则：基于对象的存在期限](#intro-lifecycle-rules-number-of-days)。
+ **`NoncurrentVersionExpiration` 操作元素** – 使用此操作可指示 Amazon S3 何时永久删除对象的非当前版本。删除的对象无法恢复。您可以根据自对象变为非当前对象以来的一定天数 (`<NoncurrentDays>`) 来确定此到期日期。除了天数之外，还可以指定要保留的非当前版本的数量 (`<NewerNoncurrentVersions>`)（介于 1 和 100 之间）。此值指定在 Amazon S3 可以使给定版本到期之前，必须存在多少较新的非当前版本。Amazon S3 将永久删除超过要保留的指定数量的任何其它非当前版本。要进行删除，必须同时超过 `<NoncurrentDays>` **和** `<NewerNoncurrentVersions>` 的值。

  要指定要保留的非当前版本数量，还必须提供 `<Filter>` 元素。如果您未指定 `<Filter>` 元素，Amazon S3 会在您指定要保留的非当前版本数量时生成 `InvalidRequest` 错误。

  当您需要更正任何意外删除或覆盖时，非当前对象的延时移除可能很有帮助。例如，您可以配置一个到期规则，以便在对象变为非当前版本五天后删除非当前版本。例如，假设在 2014 年 1 月 1 日上午 10:30 UTC，您创建了名为 `photo.gif` 的对象（版本 ID 111111）。在 2014 年 2 月 1 日上午 11:30 UTC，您意外删除了 `photo.gif`（版本 ID 111111），这将导致使用新版本 ID（如版本 ID 4857693）创建一个删除标记。您现在有五天时间可以在永久删除之前，恢复原始版本的 `photo.gif` (版本 ID 111111)。在 2014 年 1 月 8 日 00:00 UTC，有关到期的生命周期规则运行并永久删除 `photo.gif`（版本 ID 111111）（在它成为非当前版本五天之后）。

  有关当您在 `NoncurrentVersionExpiration` 操作中指定天数时 Amazon S3 如何计算日期的详细信息，请参阅 [生命周期规则：基于对象的存在期限](#intro-lifecycle-rules-number-of-days)。
**注意**  
对象到期生命周期配置不会移除未完成的分段上传。要移除未完成的分段上传，您必须使用 `AbortIncompleteMultipartUpload` 生命周期配置操作，如本节后面所述。

除了转换和到期操作之外，您还可以使用以下生命周期配置操作，来指示 Amazon S3 停止未完成的分段上传或移除到期的对象删除标记：
+ **`AbortIncompleteMultipartUpload` 操作元素** – 使用此元素可设置您希望允许分段上传保持运行的最长时间（天）。如果适用的分段上传（由生命周期规则中指定的键名称 `prefix` 确定）未在预定义的时间段内成功完成，Amazon S3 将停止未完成的分段上传。有关更多信息，请参阅 [中止分段上传](abort-mpu.md)。
**注意**  
如果规则具有使用对象标签的筛选条件，则您无法在此规则中指定此生命周期操作。
+ **`ExpiredObjectDeleteMarker` 操作元素** – 在启用了版本控制的存储桶中，包含零个非当前版本的删除标记称为*到期对象删除标记*。您可以使用此生命周期操作来指示 Amazon S3 移除到期对象移除标记。有关示例，请参阅[在启用了版本控制的存储桶中移除到期对象删除标记](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。
**注意**  
如果规则具有使用对象标签的筛选条件，则您无法在此规则中指定此生命周期操作。

### Amazon S3 如何计算对象已成为非当前版本的时间长度
<a name="non-current-days-calculations"></a>

在启用版本控制的桶中，您可以有一个对象的多个版本。当前版本始终有一个，以及零个或零个以上非当前版本。每次上传对象时，当前版本都保留为非当前版本，新添加的版本 (后继者) 会成为当前版本。为了确定对象成为非当前版本的天数，Amazon S3 会查看其后继者的创建时间。Amazon S3 使用自后继者创建以来的天数作为对象成为非当前版本的天数。

**在使用 S3 生命周期配置时还原对象的以前版本**  
按照[还原早期版本](RestoringPreviousVersions.md)中的详细说明，您可以使用以下两种方法中的任一种来检索对象的以前版本：  
**方法 1 – 将对象的非当前版本复制到相同存储桶中。**复制的对象将成为该对象的当前版本，且所有对象版本都保留。
**方法 2 – 永久删除对象的当前版本。**当您删除当前对象版本时，实际上是将非当前版本转换为该对象的当前版本。
当您正在将 S3 生命周期配置规则用于启用版本控制的存储桶时，我们建议的最佳实践是使用方法 1。  
S3 生命周期在最终一致的模型下运行。在更改传播到所有 Amazon S3 系统之前，永久删除的当前版本可能不会消失。（因此，Amazon S3 可能暂时不知道此删除操作。） 同时，您配置用于使非当前对象过期的生命周期规则可能会永久删除非当前对象，包括您要还原的对象。因此，复制旧版本（按照方法 1 建议）是更安全的替代方法。

### 生命周期操作与桶版本控制状态
<a name="lifecycle-actions-bucket-versioning-state"></a>

下表总结了对于对象执行的 S3 生命周期配置规则操作的行为与包含对象的存储桶的版本控制状态的关系。


| Action | 不受版本控制的桶（未启用版本控制） | 已启用版本控制的桶 | 已暂停版本控制的桶 | 
| --- | --- | --- | --- | 
|  `Transition` 达到对象生命周期中指定的日期或时间段时。  | Amazon S3 将对象转换为指定存储类。 | Amazon S3 将对象的当前版本转换为指定存储类。 | 行为与启用了版本控制的桶相同。 | 
|  `Expiration` 达到对象生命周期中指定的日期或时间段时。  | Expiration 操作删除对象，删除的对象无法恢复。 | 如果当前版本不是删除标记，Amazon S3 将创建一个删除标记（这会变为当前版本），现有当前版本将保留为非当前版本。 | 生命周期操作使用 null 版本 ID 创建删除标记，这会成为当前版本。如果对象当前版本的版本 ID 是 null，则 Expiration 操作永久删除此版本。否则，当前版本保留为非当前版本。 | 
|  `NoncurrentVersionTransition` 对于已启用版本控制或暂停版本控制的存储桶中的非当前版本，当对象为非当前版本的天数超过在规则的**对象变为非当前对象以来的天数** (`<NoncurrentDays>`) 下指定的值，**并且**当版本数超过在规则的**要保留的较新版本的数量** (`<NewerNoncurrentVersions>`) 中指定的值时，S3 生命周期就会转换对象。  | NoncurrentVersionTransition 无效。 |  Amazon S3 将非当前对象版本转换为指定存储类。  | 行为与启用了版本控制的存储桶相同。 | 
|  `NoncurrentVersionExpiration` 对于已启用版本控制或暂停版本控制的存储桶中的非当前版本，当对象为非当前版本的天数超过在规则的**对象变为非当前对象以来的天数** (`<NoncurrentDays>`) 下指定的值，**并且**当版本数超过在规则的**要保留的较新版本的数量** (`<NewerNoncurrentVersions>`) 中指定的值时，S3 生命周期就会使对象到期。  | NoncurrentVersionExpiration 无效。 | NoncurrentVersionExpiration 操作永久删除对象的非当前版本，删除的对象无法恢复。 | 行为与启用了版本控制的桶相同。 | 

### 生命周期规则：基于对象的存在期限
<a name="intro-lifecycle-rules-number-of-days"></a>

您可以指定 Amazon S3 能够执行指定操作的时间段 [自对象创建（或修改）以来的天数]。

当您在 S3 生命周期配置中的 `Transition` 和 `Expiration` 操作中指定天数时，请注意以下事项：
+ 您指定的值是自对象创建以来将发生此操作的天数。
+ Amazon S3 按以下方式计算时间：将在规则中指定的天数与对象创建时间相加，然后将得出的时间四舍五入至下一日的午夜 UTC。例如，如果对象的创建时间是 2014 年 1 月 15 日上午 10:30 UTC，并且您在转换规则中指定了 3 天，则对象的转换日期将计算为 2014 年 1 月 19 日 00:00 UTC。

**注意**  
Amazon S3 仅为每个对象保持上次修改日期。例如，Amazon S3 控制台在对象的**属性**窗格中显示**上次修改**日期。最初创建新对象时，此日期反映对象的创建日期。如果您替换对象，此日期会相应地更改。因此，创建日期与**上次修改**日期同义。

当在生命周期配置中的 `NoncurrentVersionTransition` 和 `NoncurrentVersionExpiration` 操作中指定天数时，请注意以下几点：
+ 您指定的值是从对象版本变为非当前版本以来（即，当对象被覆盖或删除时）的天数，作为 Amazon S3 将对指定的对象执行操作的时间。
+ Amazon S3 按以下方式计算时间：将在规则中指定的天数与创建对象的新后继版本的时间相加，然后将得出的时间四舍五入至下一日的午夜 UTC。例如，在您的存储桶中，假设某个对象的当前版本的创建时间是 2014 年 1 月 1 日上午 10:30 UTC。如果替换当前版本的对象新版本的创建时间是 2014 年 1 月 15 日上午 10:30 UTC，并且您在转换规则中指定了 3 天，则对象的转换日期计算为 2014 年 1 月 19 日 00:00 UTC。

### 生命周期规则：基于特定日期
<a name="intro-lifecycle-rules-date"></a>

当在 S3 生命周期规则中指定操作时，您可以指定希望 Amazon S3 执行此操作的日期。到达特定日期时，Amazon S3 会向所有合格对象应用该操作（基于筛选条件）。

如果为 S3 生命周期操作指定一个过去的日期，所有合格对象会立即符合该生命周期操作的条件。

**重要**  
基于日期的操作并非一次性操作。即使过了该日期后，只要规则状态为 `Enabled`，Amazon S3 仍会继续应用该基于日期的操作。  
例如，假设您指定一个基于日期的 `Expiration` 操作来删除所有对象（假设规则中未指定任何筛选条件）。在指定日期，Amazon S3 会使桶中的所有对象过期。此外，Amazon S3 还会继续使您在存储桶中创建的所有新对象到期。要停止生命周期操作，您必须从生命周期规则中移除操作，禁用规则或从生命周期配置中删除规则。

此日期值必须符合 ISO 8601 格式。时间始终为午夜 UTC。

**注意**  
您无法使用 Amazon S3 控制台创建基于日期的生命周期规则，但是可以查看、禁用或删除这类规则。