TOS 支持对桶设置生命周期规则(Lifecycle),实现自动转换对象的存储类型、自动淘汰过期的对象,以有效利用存储特性,优化存储空间。您可以通过 SDK 使用对象存储的生命周期管理功能,实现对象的过期删除达到节约存储成本的目的。配置生命周期规则时,可指定规则生效的对象前缀或者对象标签。如果您同时指定了两种生效条件,则对象需满足设置的所有条件,才会应用该生命周期规则。
注意
tos:PutLifecycleConfiguration
权限,具体操作请参见权限配置指南。以下代码用于设置桶 examplebucket
的生命周期规则。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 设置桶的生命周期 PutBucketLifecycleInput input(bucketName); // 指定生命周期规则 rule1,该规则设置创建 60 天后过期 auto rule1 = LifecycleRule(); // 规则 ID rule1.setId("rule1"); // 指定规则适用的前缀,匹配前缀 rule1.setPrefix("test1/"); // 规则状态,标示规则是否启用 rule1.setStatus(StatusType::StatusEnabled); // 对象的过期时间 // Days: 指定在对象过期多少天后进行操作,需要传入参数为 int 类型,当前传入为 int 类型 // Date: 指定对象在哪一天过期,需要传入参数为 time_t 类型 rule1.setExpiratioon(std::make_shared<Expiration>(60)); // 设置对象标签 rule1.addTag(Tag("key1", "value1")); rule1.addTag(Tag("key2", "value2")); // 指定生命周期规则 rule2,该规则设置创建 365 天后过期 auto rule2 = LifecycleRule(); // 规则 ID rule2.setId("rule2"); // 指定规则适用的前缀,匹配前缀 rule2.setPrefix("test2/"); // 规则状态,标示规则是否启用 rule2.setStatus(StatusType::StatusDisabled); // 获取 time_t 类型的当前时间 time_t expirationTime = time(nullptr); tm* gmtmExpiration = gmtime(&expirationTime); gmtmExpiration->tm_min = 0; gmtmExpiration->tm_hour = 0; gmtmExpiration->tm_sec = 0; gmtmExpiration->tm_year = gmtmExpiration->tm_year + 1; auto exactTime = timegm(gmtmExpiration); // 对象的过期时间 // Days: 指定在对象过期多少天后进行操作,需要传入参数为 int 类型 // Date: 指定对象在哪一天过期,需要传入参数为 time_t 类型,当前传入为 time_t 类型 rule2.setExpiratioon(exactTime); // 指定生命周期规则 rule3,为针对版本控制状态下的Bucket的生命周期规则。 auto rule3 = LifecycleRule(); rule3.setId("rule3"); rule3.setPrefix("test3/"); rule3.setStatus(StatusType::StatusDisabled); // 设置当前版本的 Object 距其最后修改时间365天之后自动转为归档类型。 auto transition = Transition(); transition.setDays(365); transition.setStorageClass(StorageClassType::ARCHIVE_FR); rule3.addTransition(transition); // 设置非当前版本的Object距最后修改时间10天之后转为低频访问类型。 auto transition1 = NoncurrentVersionTransition(10, StorageClassType::IA); // 设置非当前版本的Object距最后修改时间20天之后转为归档类型。 auto transition2 = NoncurrentVersionTransition(20, StorageClassType::ARCHIVE_FR); // 设置Object在其成为非当前版本30天之后删除。 rule3.setNoncurrentVersionExpiration(30); std::vector<NoncurrentVersionTransition> noncurrentVersionStorageTransitions{transition1, transition2}; rule3.setNoncurrentVersionTransitions(noncurrentVersionStorageTransitions); // 设置生命周期规则,包含 rule1、rule2、rule3。 std::vector<LifecycleRule> rules{rule1, rule2, rule3}; input.setRules(rules); auto output = client.putBucketLifecycle(input); if (!output.isSuccess()) { // 异常处理 std::cout << "PutBucketLifecycle failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "PutBucketLifecycle success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
以下代码用于获取桶 examplebucket
的生命周期规则。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 查询桶生命周期规则 GetBucketLifecycleInput input(bucketName); auto output = client.getBucketLifecycle(input); if (!output.isSuccess()) { // 异常处理 std::cout << "GetBucketLifecycle failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } // 打印桶的生命周期 auto lifycycleRules= output.result().getRules(); for (auto& rule : lifycycleRules){ // 查看规则 ID、匹配前缀、规则状态(标识规则是否启用)、对象过期时间 std::cout << "rule:" << rule.getId() << "," << rule.getPrefix() << "," << rule.getStringFormatStatus() << "," << "hasExpiration:" << rule.hasExpiration() << "," << std::endl; // 查看当前规则的 tags auto taglist = rule.getTags(); for (const auto& tag : taglist) { std::cout <<"GetBucketLifecycle tag success, Key:" << tag.getKey() << "; Value:" << tag.getValue() << std::endl; } // 查看当前版本 Object 存储类型转换规则。 for (auto const lifeCycleTransition : rule.getTransitions()) { std::cout << "rule versions trans days:" << lifeCycleTransition.getDays() << " trans storage class: " << lifeCycleTransition.getStringFormatStorageClass() << std::endl; } // 查看非当前版本 Object 存储类型转换规则。 for (auto const lifeCycleTransition : rule.getNoncurrentVersionTransitions()) { std::cout << "rule noncurrent versions trans days:" << lifeCycleTransition.getNoncurrentDays() << " trans storage class: " << lifeCycleTransition.getStringFormatStorageClass() << std::endl; } // 查看当前版本Object过期规则。 if (rule.hasExpiration()) { std::cout << "rule versions expiration days:" << rule.getExpiratioon()->getDays() << std::endl; } // 查看非当前版本Object过期规则。 if (rule.hasNoncurrentVersionExpiration()) { std::cout << "rule noncurrent versions expiration days:" << rule.getNoncurrentVersionExpiration()->getNoncurrentDays() << std::endl; } // 查看 CompleteMultipartUpload 终止规则 if (rule.hasAbortInCompleteMultipartUpload()) { std::cout << "abort in completeMultipartUpload days:" << rule.getAbortInCompleteMultipartUpload()->getDaysAfterInitiation() <<std::endl; } } // 释放网络等资源 CloseClient(); return 0; }
以下代码用于删除桶 examplebucket
的生命周期规则。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); // 删除桶的生命周期 DeleteBucketLifecycleInput input(bucketName); auto output = client.deleteBucketLifecycle(input); if (!output.isSuccess()) { // 异常处理 std::cout << "DeleteBucketLifecycle failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "DeleteBucketLifecycle success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
关于生命周期规则的更多信息,请参见设置生命周期规则。