OSS支持设置生命周期(Lifecycle)规则,自动删除过期的文件和碎片,或将到期的文件转储为低频或归档存储类型,从而节省存储费用。本文介绍如何管理生命周期规则。
背景信息
生命周期规则包含如下信息:
- 前缀或标签匹配策略:生命周期规则匹配的Object和碎片。
- 按前缀匹配:按指定前缀匹配Object和碎片。可创建多条规则匹配不同的前缀,前缀不能重复。
- 按标签匹配:按指定标签的Key和Value匹配Object。单条规则可配置多个标签,OSS对所有拥有这些标签的对象执?生命周期规则。标签匹配?可以作用于碎片。
说明 对象标签功能详情请参见 对象标签。
- 按前缀+标签匹配:按指定前缀和一个或多个标签的筛选条件匹配对象。
- 配置到整个Bucket:匹配整个Bucket内的所有Object和碎片。此种方式只能创建一条规则。
- 文件过期策略:设置Object的过期时间及操作。
- 过期天数:指定一个过期天数N,并指定非版本状态下的所有Object、以及版本控制状态下的当前版本Object过期后执行什么操作。Object会在其最后修改时间的N天后过期,并执行指定的操作。
- 过期日期:指定一个过期日期,并指定非版本状态下的所有Object、以及版本控制状态下的当前版本Object过期后执行什么操作。最后修改时间在该日期之前的Object全部过期,并执行指定的操作。
- Object成为非当前版本天数:指定一个过期天数N,并指定非当前版本Object过期后执行什么操作。Object会在其成为非当前版本的N天后过期,并执行指定的操作。
说明 您可以将过期Object转换为低频访问类型或归档类型,也可以选择删除过期Object。详情请参见 生命周期配置元素。 - 碎片过期策略:设置碎片的过期时间及操作。
- 过期天数:可指定一个过期天数N,碎片会在其最后修改时间的N天后被删除。
- 过期日期:指定一个过期日期,最后修改时间在该日期之前的碎片会被全部删除。
通过uploadPart方法上传的分片也支持设置生命周期规则。文件最后修改时间以初始化分片上传事件的时间为准。
更多关于生命周期的内容请参见管理对象生命周期。
设置生命周期规则
以下代码用于设置生命周期规则:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* 初始化OSS账号信息。*/ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; std::string Endpoint = "yourEndpoint"; std::string BucketName = "yourBucketName"; /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); SetBucketLifecycleRequest request(BucketName); std::string date("2022-10-12T00:00:00.000Z"); /* 设置标签。*/ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); /* 指定生命周期规则。*/ auto rule1 = LifecycleRule(); rule1.setID("rule1"); rule1.setPrefix("test1/"); rule1.setStatus(RuleStatus::Enabled); rule1.setExpiration(3); rule1.setTags(tagging.Tags()); /* 指定过期时间。*/ auto rule2 = LifecycleRule(); rule2.setID("rule2"); rule2.setPrefix("test2/"); rule2.setStatus(RuleStatus::Disabled); rule2.setExpiration(date); /* rule3为针对版本控制状态下的Bucket的生命周期规则。*/ auto rule3 = LifecycleRule(); rule3.setID("rule3"); rule3.setPrefix("test3/"); rule3.setStatus(RuleStatus::Disabled); /* 设置Object距其最后修改时间365天之后自动转为归档类型。*/ auto transition = LifeCycleTransition(); transition.Expiration().setDays(365); transition.setStorageClass(StorageClass::Archive); rule3.addTransition(transition); /* 设置自动移除过期删除标记。*/ rule3.setExpiredObjectDeleteMarker(true); /* 设置非当前版本的Object距最后修改时间10天之后转为低频访问类型。*/ auto transition1 = LifeCycleTransition(); transition1.Expiration().setDays(10); transition1.setStorageClass(StorageClass::IA); /* 设置非当前版本的object距最后修改时间20天之后转为归档类型。*/ auto transition2 = LifeCycleTransition(); transition2.Expiration().setDays(20); transition2.setStorageClass(StorageClass::Archive); /* 设置Object在其成为非当前版本30天之后删除。*/ auto expiration = LifeCycleExpiration(30); rule3.setNoncurrentVersionExpiration(expiration); LifeCycleTransitionList noncurrentVersionStorageTransitions{transition1, transition2}; rule3.setNoncurrentVersionTransitionList(noncurrentVersionStorageTransitions); /* 设置生命周期规则。*/ LifecycleRuleList list{rule1, rule2, rule3}; request.setLifecycleRules(list); auto outcome = client.SetBucketLifecycle(request); if (!outcome.isSuccess()) { /* 异常处理 */ std::cout << "SetBucketLifecycle fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; ShutdownSdk(); return -1; } /* 释放网络等资源。*/ ShutdownSdk(); return 0; }
查看生命周期规则
以下代码用于查看生命周期规则:
#include <alibabacloud/oss/OssClient.h> #include "../src/utils/Utils.h" using namespace AlibabaCloud::OSS; int main(void) { /* 初始化OSS账号信息。*/ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; std::string Endpoint = "yourEndpoint"; std::string BucketName = "yourBucketName"; /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* 查看生命周期规则。*/ auto outcome = client.GetBucketLifecycle(BucketName); if (outcome.isSuccess()) { std::cout << "GetBucketLifecycle success," << std::endl; for (auto const rule : outcome.result().LifecycleRules()) { std::cout << "rule:" << rule.ID() << "," << rule.Prefix() << "," << rule.Status() << "," "hasExpiration:" << rule.hasExpiration() << "," << "hasTransitionList:" << rule.hasTransitionList() << "," << std::endl; auto taglist = rule.Tags(); for (const auto& tag : taglist) { std::cout <<"GetBucketLifecycle tag success, Key:" << tag.Key() << "; Value:" << tag.Value() << std::endl; } /* 查看是否自动删除过期删除标记。*/ if (rule.ExpiredObjectDeleteMarker()) { std::cout << "rule expired delete marker: " << rule.ExpiredObjectDeleteMarker() << std::endl; } /* 查看非当前版本object存储类型转换规则。*/ if (rule.hasNoncurrentVersionTransitionList()) { for (auto const lifeCycleTransition : rule.NoncurrentVersionTransitionList()) { std::cout << "rule noncurrent versions trans days:" << lifeCycleTransition.Expiration() << " trans storage class: " << ToStorageClassName(lifeCycleTransition.StorageClass()) << std::endl; } } /* 查看非当前版本object过期规则。*/ if (rule.hasNoncurrentVersionExpiration()) { std::cout << "rule noncurrent versions expiration days:" << rule.NoncurrentVersionExpiration().Days() << std::endl; } } } else { /* 异常处理。*/ std::cout << "GetBucketLifecycle fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; ShutdownSdk(); return -1; } /* 释放网络等资源。*/ ShutdownSdk(); return 0; }
清空生命周期规则
以下代码用于清空生命周期规则:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* 初始化OSS账号信息。*/ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; std::string Endpoint = "yourEndpoint"; std::string BucketName = "yourBucketName"; /* 初始化网络等资源。*/ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* 清空生命周期规则。*/ DeleteBucketLifecycleRequest request(BucketName); auto outcome = client.DeleteBucketLifecycle(request); if (!outcome.isSuccess()) { /* 异常处理 */ std::cout << "DeleteBucketLifecycle fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; ShutdownSdk(); return -1; } /* 释放网络等资源。*/ ShutdownSdk(); return 0; }