您可以创建基于最后一次修改时间(Last Modified Time)的生命周期规则(Lifecycle),定期将云盒Bucket内的Object和碎片删除,从而节省存储费用。
使用限制
- 示例一
您对整个Bucket设置了一条包含碎片过期策略的生命周期规则,则不支持对Bucket中任意前缀的Object再设置一条包含碎片过期策略的生命周期规则。
- 示例二
您对某个Bucket中前缀为dir1设置了一条包含碎片过期策略的生命周期规则,则不支持对该Bucket中包含重叠前缀(例如dir1/dir2)的Object再设置一条包含碎片过期策略的生命周期规则。
注意事项
- 覆盖语义
PutBucketLifecycle为覆盖语义。当您需要追加生命周期规则时,请先调用GetBucketLifecycle接口获取当前生命周期规则配置,然后追加新的生命周期规则配置,最后调用PutBucketLifecycle接口更新生命周期规则配置。
- 数量
通过控制台最多可配置100条生命周期规则,通过SDK或者命令行工具ossutil最多可配置1000条生命周期规则。
- 生效时间
生命周期规则创建后的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前删除完毕。
重要 更新生命周期规则会中止当天的生命周期任务,请不要频繁更新生命周期规则。 - 在开通了OSS-HDFS服务的Bucket中配置生命周期规则
如果您对开通了OSS-HDFS服务的Bucket设置或更新为匹配整个Bucket的生命周期规则,需通过NOT元素排除
.dlsdata/
,避免因生命周期规则触发的Object删除或存储类型转换行为影响OSS-HDFS数据读写。
云盒Bucket
- 登录OSS管理控制台。
- 在左侧导航栏,单击云盒Bucket,然后单击目标Bucket名称。
- 选择 。
- 单击创建规则,在创建生命周期规则面板,按如下说明配置生命周期规则。
- 云盒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被转为历史版本的时间。
- 云盒Bucket未开启版本控制
使用阿里云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;
public class Demo {
public static void main(String[] args) throws Exception {
// 填写云盒Bucket的数据域名。
String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写云盒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(accessKeyId, accessKeySecret))
.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设置生命周期规则的具体操作, 请参见添加或修改生命周期规则。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketLifecycle。