You need to enable JavaScript to run this app.
导航

管理桶生命周期(C++ SDK)

最近更新时间2024.02.04 18:31:04

首次发布时间2023.01.29 15:35:46

TOS 支持对桶设置生命周期规则(Lifecycle),实现自动转换对象的存储类型、自动淘汰过期的对象,以有效利用存储特性,优化存储空间。您可以通过 SDK 使用对象存储的生命周期管理功能,实现对象的过期删除达到节约存储成本的目的。配置生命周期规则时,可指定规则生效的对象前缀或者对象标签。如果您同时指定了两种生效条件,则对象需满足设置的所有条件,才会应用该生命周期规则。

设置生命周期规则

注意

  • 要为桶设置生命周期规则,您必须具备 tos:PutLifecycleConfiguration 权限,具体操作请参见权限配置指南
  • 如果已对桶配置过生命周期规则,则执行此操作将覆盖原有配置,要追加生命周期规则,请先使用 GetLifecycleConfigutation 获取当前的规则,再追加写入新规则,最后再调用 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;
}

获取生命周期规则

注意

  • 要为桶设置生命周期规则,您必须具备 tos:GetLifecycleConfiguration 权限,具体操作请参见权限配置指南
  • 关于生命周期规则的更多介绍,请参见桶生命周期规则

示例代码

以下代码用于获取桶 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;
}

删除生命周期规则

注意

  • 要为桶设置生命周期规则,您必须具备 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);
    
    // 删除桶的生命周期
    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;
}

相关文档

关于生命周期规则的更多信息,请参见设置生命周期规则