生命周期规则

您可以创建基于最后一次修改时间(Last Modified Time)的生命周期规则(Lifecycle),定期将云盒Bucket内的Object和碎片删除,从而节省存储费用。

前提条件

  • 华东1(杭州)、华南1(深圳)、华南2(河源)、华北2(北京)、西南1(成都)地域支持使用OSS ON云盒服务。

  • 已购买云盒。具体操作,请参见购买云盒

使用限制

不支持对重叠前缀的Object设置两条或两条以上包含碎片过期策略的生命周期规则。示例如下:

  • 示例一

    您对整个Bucket设置了一条包含碎片过期策略的生命周期规则,则不支持对Bucket中任意前缀的Object再设置一条包含碎片过期策略的生命周期规则。

  • 示例二

    您对某个Bucket中前缀为dir1设置了一条包含碎片过期策略的生命周期规则,则不支持对该Bucket中包含重叠前缀(例如dir1/dir2)的Object再设置一条包含碎片过期策略的生命周期规则。

注意事项

规则数量

通过控制台最多可配置100条生命周期规则。如果您需要配置更多数量的生命周期规则,请使用SDK或者命令行工具ossutil。

覆盖语义

PutBucketLifecycle为覆盖语义。例如,某个Bucket已配置了生命周期规则Rule1,您需要在Rule1基础上继续追加生命周期规则Rule2,您需要执行以下操作。

  • 调用GetBucketLifecycle接口获取当前生命周期规则配置Rule1。

  • 在Rule1基础上叠加Rule2。

  • 调用PutBucketLifecycle接口更新生命周期规则为Rule1+Rule2。

生效时间

生命周期规则创建后的24小时内,OSS会加载规则。规则加载完成后,OSS会在每天的北京时间8:00开始执行规则。

Object的最后修改时间与生命周期规则开始执行时间(8:00)必须间隔24小时以上。例如生命周期规则指定Object上传1天后删除,则2020年7月20日上传的文件删除时间如下:

  • 北京时间8:00前上传的文件会在2020年7月21日8:00开始删除,并在7月22日8:00前删除完毕。

  • 北京时间8:00后上传的文件会在2020年7月22日8:00开始删除,并在7月23日8:00前删除完毕。

重要

更新生命周期规则会中止当天的生命周期任务,请不要频繁更新生命周期规则。

执行完成时间

  • 对于未配置标签的生命周期规则,执行10亿或以下次生命周期相关操作(包括Object删除、Object存储类型转换以及碎片过期),可在24小时内完成。如果生命周期相关操作超出10亿次,则可能超出24小时。

  • 对于已配置标签的生命周期规则,执行5亿或以下次生命周期相关操作(包括Object删除、Object存储类型转换以及碎片过期),可在24小时内完成。如果生命周期相关操作超出5亿次,则可能超出24小时。

说明

如果存储空间开启了版本控制,则对Object的每个版本均记为一次操作。

费用说明

关于通过生命周期规则转换Object存储类型或者删除Object时可能涉及的存储和请求费用说明,请参见生命周期费用说明

操作步骤

使用OSS控制台

  1. 登录OSS管理控制台

  2. 在左侧导航栏,选择数据服务 > 云盒Bucket,然后在Bucket列表中单击目标Bucket。

  3. 在左侧导航栏,选择数据管理 > 生命周期

  4. 单击创建规则,在创建生命周期规则面板,按如下说明配置生命周期规则。

    • 云盒Bucket未开启版本控制

      区域

      配置项

      说明

      基本设置

      状态

      设置生命周期规则的状态,可选择启动禁用

      策略

      选择生命周期规则作用的Object。您可以选择按前缀匹配配置到整个Bucket

      前缀

      输入规则要匹配的Object名称的前缀。例如,您需要匹配名称以img开头的Object,则输入img

      清除策略

      文件时间策略

      选择Object过期策略,可选择过期天数过期日期不启用。选择不启用时,文件过期策略不生效。

      删除文件

      配置删除过期Object的规则。

      例如,过期日期设置为2022年09月24日,并指定在指定日期前的数据自动删除,则最后修改日期在2021年9月24日之前的Object会被自动删除,且删除后不可恢复。

      清理碎片

      碎片过期策略

      设置对过期碎片执行的操作。您可以选择碎片过期策略的过期天数过期日期,也可以选择不启用碎片过期策略。当选择不启用时,碎片过期策略不生效。

      重要 生命周期规则至少包含文件过期策略或碎片过期策略。

      删除碎片

      根据碎片过期策略选择的过期天数或过期日期设定碎片何时过期,碎片过期后会被自动删除,且删除后不可恢复。

    • 云盒Bucket已开启版本控制

      开启版本控制后,基本设置清理碎片区域涉及的配置项,与未开启版本控制的配置方法相同。以下表格仅介绍与未开启版本控制相比,开启版本控制后配置项存在的差异。

      区域

      配置项

      说明

      当前版本

      清理对象删除标记

      开启版本控制后,清除策略中增加了清理对象删除标记选项,其他选项与未开启版本控制时相同。

      选择此选项后,如果当前Object仅有一个版本且为删除标记时,则OSS将删除过期Object的删除标记。如果当前Object有多个版本,且Object的最新版本为删除标记时,则OSS将保留该删除标记。关于删除标记的更多信息,请参见删除标记

      历史版本

      文件时间策略

      设置历史版本文件的过期策略,可选择过期天数不启用。当选择不启用时,文件过期策略不生效。

      删除文件

      设定一个过期天数N,历史版本的Object会在其被转换为历史版本的N天后过期,并在过期的第二天执行删除操作。例如设置为30,则在2021年09月01日被转为历史版本的Object会在2021年10月01日被删除。

      重要 您可以通过Object下一个版本的最后一次修改时间确定Object被转为历史版本的时间。

使用阿里云SDK

仅支持通过Java SDK设置生命周期规则,Java SDK要求3.15.0及以上版本。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.LifecycleRule;
import com.aliyun.oss.model.SetBucketLifecycleRequest;
import java.util.List;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;

public class Demo {

    public static void main(String[] args) throws Exception {
        // 填写云盒Bucket的数据域名。
        String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写云盒Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
    // 填写云盒Bucket所在地域。
    String region = "cn-hangzhou";
    // 填写云盒ID。
        String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";

        // 创建OSSClient实例。
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        conf.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(new DefaultCredentialProvider(credentialsProvider.getCredentials()))
                .clientConfiguration(conf)
                .build();

        try {
            // 创建SetBucketLifecycleRequest。
            SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName);

            // 设置规则ID。
            String ruleId0 = "rule0";
            // 如果文件匹配前缀设置为空,则表示此规则适用于Bucket中的所有Object。
            String matchPrefix0 = null;

            // 距最后修改时间3天后过期。
            LifecycleRule rule = new LifecycleRule(ruleId0, matchPrefix0, LifecycleRule.RuleStatus.Enabled, 3);
            request.AddLifecycleRule(rule);

            // 发起设置生命周期规则请求。
            ossClient.setBucketLifecycle(request);

            // 查看生命周期规则。
            List<LifecycleRule> listRules = ossClient.getBucketLifecycle(bucketName);
            for(LifecycleRule rules : listRules){
                System.out.println("ruleId="+rules.getId()+", matchPrefix="+rules.getPrefix()+", expirationDays="+rules.getExpirationDays());
            }
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

使用命令行工具ossutil

关于使用ossutil设置生命周期规则的具体操作, 请参见lifecycle(生命周期)

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketLifecycle