本文介绍如何管理生命周期。

OSS支持设置生命周期(Lifecycle)规则,自动删除过期的文件和碎片,或将到期的文件转储为低频或归档存储类型,从而节省存储费用。每条规则包含:
  • 规则ID。用于标识一条规则,同一存储空间内规则ID不能重复。
  • 策略。有以下两种设置方式。同一存储空间内仅支持一种设置方式。
    • 按前缀匹配。此种方式允许创建多条规则,前缀不能重复。
    • 配置到整个存储空间。此种方式只能创建一条规则。
  • 过期时间。有两种指定方式:
    • 指定一个过期天数N,文件会在其最近更新时间点的N天后过期。
    • 指定一个过期时间点,最近更新时间在该时间点之前的文件全部过期。
  • 是否生效。

通过uploadPart方法上传的分片也支持设置生命周期规则。文件最后修改时间以初始化分片上传事件的时间为准。

更多关于生命周期的内容请参见管理对象生命周期

设置生命周期规则

以下代码用于设置生命周期规则:

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 创建SetBucketLifecycleRequest
SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName);

// 设置规则ID,文件匹配前缀与标签。
String ruleId0 = "rule0";
String matchPrefix0 = "A0/";
Map<String, String> matchTags0 = new HashMap<String, String>();
matchTags0.put("key0", "value0");


String ruleId1 = "rule1";
String matchPrefix1 = "A1/";
Map<String, String> matchTags1 = new HashMap<String, String>();
matchTags1.put("key1", "value1");

String ruleId2 = "rule2";
String matchPrefix2 = "A2/";

String ruleId3 = "rule3";
String matchPrefix3 = "A3/";

String ruleId4 = "rule4";
String matchPrefix4 = "A4/";

String ruleId5 = "rule5";
String matchPrefix5 = "A5/";

String ruleId6 = "rule6";
String matchPrefix6 = "A6/";

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

// 指定日期之前创建的文件过期。
rule = new LifecycleRule(ruleId1, matchPrefix1, LifecycleRule.RuleStatus.Enabled);
rule.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
rule.setTags(matchTags1);
request.AddLifecycleRule(rule);

// 分片3天后过期。
rule = new LifecycleRule(ruleId2, matchPrefix2, LifecycleRule.RuleStatus.Enabled);
LifecycleRule.AbortMultipartUpload abortMultipartUpload = new LifecycleRule.AbortMultipartUpload();
abortMultipartUpload.setExpirationDays(3);
rule.setAbortMultipartUpload(abortMultipartUpload);
request.AddLifecycleRule(rule);

// 指定日期之前的分片过期。
rule = new LifecycleRule(ruleId3, matchPrefix3, LifecycleRule.RuleStatus.Enabled);
abortMultipartUpload = new LifecycleRule.AbortMultipartUpload();
abortMultipartUpload.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
rule.setAbortMultipartUpload(abortMultipartUpload);
request.AddLifecycleRule(rule);

// 距最后修改时间10天后转低频访问,距最后修改时间30天后转归档
rule = new LifecycleRule(ruleId4, matchPrefix4, LifecycleRule.RuleStatus.Enabled);
List<StorageTransition> storageTransitions = new ArrayList<StorageTransition>();
StorageTransition storageTransition = new StorageTransition();
storageTransition.setStorageClass(StorageClass.IA);
storageTransition.setExpirationDays(10);
storageTransitions.add(storageTransition);
storageTransition = new StorageTransition();
storageTransition.setStorageClass(StorageClass.Archive);
storageTransition.setExpirationDays(30);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
request.AddLifecycleRule(rule);

// 指定日期之前的分片过期。
rule = new LifecycleRule(ruleId5, matchPrefix5, LifecycleRule.RuleStatus.Enabled);
storageTransitions = new ArrayList<StorageTransition>();
storageTransition = new StorageTransition();
storageTransition.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
storageTransition.setStorageClass(StorageClass.Archive);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
request.AddLifecycleRule(rule);

// rule6针对版本控制状态下的Bucket.
rule = new LifecycleRule(ruleId6, matchPrefix6, LifecycleRule.RuleStatus.Enabled);
// 设置object 相对最后修改时间365天之后自动转为归档文件
storageTransitions = new ArrayList<StorageTransition>();
storageTransition = new StorageTransition();
storageTransition.setStorageClass(StorageClass.Archive);
storageTransition.setExpirationDays(365);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
// 设置自动移除过期删除标记。
rule.setExpiredDeleteMarker(true);
// 设置非当前版本的object距最后修改时间10天之后转为低频访问类型。
NoncurrentVersionStorageTransition noncurrentVersionStorageTransition =
        new NoncurrentVersionStorageTransition().withNoncurrentDays(10).withStrorageClass(StorageClass.IA);
// 设置非当前版本的object距最后修改时间20天之后转为归档类型。
NoncurrentVersionStorageTransition noncurrentVersionStorageTransition2 =
        new NoncurrentVersionStorageTransition().withNoncurrentDays(20).withStrorageClass(StorageClass.Archive);
// 设置非当前版本object30天之后删除。
NoncurrentVersionExpiration noncurrentVersionExpiration = new NoncurrentVersionExpiration().withNoncurrentDays(30);
List<NoncurrentVersionStorageTransition> noncurrentVersionStorageTransitions = new ArrayList<NoncurrentVersionStorageTransition>();
noncurrentVersionStorageTransitions.add(noncurrentVersionStorageTransition2);
rule.setStorageTransition(storageTransitions);
rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
rule.setNoncurrentVersionStorageTransitions(noncurrentVersionStorageTransitions);
request.AddLifecycleRule(rule);

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

// 关闭OSSClient。
ossClient.shutdown();

查看生命周期规则

以下代码用于查看生命周期规则:

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 获取生命周期规则
List<LifecycleRule> rules = ossClient.getBucketLifecycle(bucketName);

// 查看生命周期规则。
for (LifecycleRule r : rules) {
    System.out.println("================");

    // 查看规则id。
    System.out.println("rule id: " + r.getId());

    // 查看规则状态。
    System.out.println("rule status: " + r.getStatus());

    // 查看规则前缀。
    System.out.println("rule prefix: " + r.getPrefix());

    // 查看规则标签。
    if (r.hasTags()) {
        System.out.println("rule tagging: "+ r.getTags().toString());
    }

    // 查看过期天数规则。
    if (r.hasExpirationDays()) {
        System.out.println("rule expiration days: " + r.getExpirationDays());
    }

    // 查看过期日期规则。
    if (r.hasCreatedBeforeDate()) {
        System.out.println("rule expiration create before days: " + r.getCreatedBeforeDate());
    }

    // 查看过期分片规则。
    if(r.hasAbortMultipartUpload()) {
        if(r.getAbortMultipartUpload().hasExpirationDays()) {
            System.out.println("rule abort uppart days: " + r.getAbortMultipartUpload().getExpirationDays());
        }

        if (r.getAbortMultipartUpload().hasCreatedBeforeDate()) {
            System.out.println("rule abort uppart create before date: " + r.getAbortMultipartUpload().getCreatedBeforeDate());
        }
    }

    // 查看存储类型转换规则。
    if (r.getStorageTransition().size() > 0) {
        for (StorageTransition transition : r.getStorageTransition()) {
            if (transition.hasExpirationDays()) {
                System.out.println("rule storage trans days: " + transition.getExpirationDays() +
                        " trans storage class: " + transition.getStorageClass());
            }

            if (transition.hasCreatedBeforeDate()) {
                System.out.println("rule storage trans before create date: " + transition.getCreatedBeforeDate());
            }
        }
    }

    // 查看是否自动删除过期删除标记。
    if (r.hasExpiredDeleteMarker()) {
        System.out.println("rule expired delete marker: " + r.getExpiredDeleteMarker());
    }

    // 查看非当前版本object存储类型转换规则。
    if (r.hasNoncurrentVersionStorageTransitions()) {
        for (NoncurrentVersionStorageTransition transition : r.getNoncurrentVersionStorageTransitions()) {
            System.out.println("rule noncurrent versions trans days:" + transition.getNoncurrentDays() +
                    " trans storage class: " + transition.getStorageClass());
        }
    }

    // 查看非当前版本object过期规则。
    if (r.hasNoncurrentVersionExpiration()) {
        System.out.println("rule noncurrent versions expiration days:" + r.getNoncurrentVersionExpiration().getNoncurrentDays());
    }
}

// 关闭OSSClient。
ossClient.shutdown();

清空生命周期规则

以下代码用于清空生命周期规则:

// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

ossClient.deleteBucketLifecycle(bucketName);

// 关闭OSSClient。
ossClient.shutdown();