您可以创建基于最后一次修改时间(Last Modified Time)的生命周期规则(Lifecycle),定期将云盒Bucket内的Object和碎片删除,从而节省存储费用。
前提条件
-
仅华东1(杭州)、华东2(上海)、华南1(深圳)、华南2(河源)、华北2(北京)、西南1(成都)地域支持使用OSS ON云盒服务。
-
已购买云盒。
-
已在云盒内创建专有网络VPC和交换机。
-
已联系技术支持申请创建云盒VPC内网SingleTunnel网络类型。
使用限制
不支持对重叠前缀的Object设置两条或两条以上包含碎片过期策略的生命周期规则。示例如下:
-
示例一
您对整个Bucket设置了一条包含碎片过期策略的生命周期规则,则不支持对Bucket中任意前缀的Object再设置一条包含碎片过期策略的生命周期规则。
-
示例二
您对某个Bucket中前缀为dir1设置了一条包含碎片过期策略的生命周期规则,则不支持对该Bucket中包含重叠前缀(例如dir1/dir2)的Object再设置一条包含碎片过期策略的生命周期规则。
注意事项
规则数量
通过控制台最多可配置100条生命周期规则。如果您需要配置更多数量的生命周期规则,请使用SDK或者命令行工具ossutil。
覆盖语义
PutBucketLifecycle为覆盖语义。例如,某个Bucket已配置了生命周期规则Rule1,您需要在Rule1基础上继续追加生命周期规则Rule2,您需要执行以下操作。
调用GetBucketLifecycle接口获取当前生命周期规则配置Rule1。
在Rule1基础上叠加Rule2。
调用PutBucketLifecycle接口更新生命周期规则为Rule1+Rule2。
生效时间
生命周期规则创建后的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前删除完毕。
更新生命周期规则会中止当天的生命周期任务,请不要频繁更新生命周期规则。
执行完成时间
对于未配置标签的生命周期规则
华东1(杭州)、华东2(上海)、华北2(北京)、华北 3(张家口)、华北6(乌兰察布)、华南1(深圳)、新加坡地域执行10亿或以下次生命周期相关操作(包括Object删除、Object存储类型转换以及碎片过期),可在24小时内完成。如果生命周期相关操作超出10亿次,则可能超出24小时。如果扫描的object数超出1000亿,则可能超出24小时。
其他地域执行1亿或以下次生命周期相关操作,可在24小时内完成。如果生命周期相关操作超出1亿次,则可能超出24小时。如果扫描的object数超出300亿,则可能超出24小时。
对于已配置标签的生命周期规则
华东1(杭州)、华东2(上海)、华北2(北京)、华北 3(张家口)、华北6(乌兰察布)、华南1(深圳)、新加坡地域执行5亿或以下次生命周期相关操作(包括Object删除、Object存储类型转换以及碎片过期),可在24小时内完成。如果生命周期相关操作超出5亿次,则可能超出24小时。如果扫描的object数超出1000亿或tagging数超出100亿,则可能超出24小时。
其他地域执行5千万或以下次生命周期相关操作,可在24小时内完成。如果生命周期相关操作超出5千万次,则可能超出24小时。如果扫描的object数超出300亿或tagging数超出30亿,则可能超出24小时。
如果存储空间开启了版本控制,则对Object的每个版本均记为一次操作。
费用说明
关于通过生命周期规则转换Object存储类型或者删除Object时可能涉及的存储和请求费用说明,请参见生命周期费用说明。
操作步骤
使用OSS控制台
登录OSS管理控制台。
-
在左侧导航栏,选择数据服务 > 云盒Bucket,然后在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被转为历史版本的时间。
-
使用阿里云SDK
支持通过Java、Python、Go SDK设置生命周期规则(Java SDK要求3.15.0及以上版本,Python SDK V2要求1.1.1及以上版本,Go SDK V2要求v1.2.1及以上版本)。云盒场景下,Python、Go SDK的操作调用方式与公共云OSS一致,创建客户端的方式请参见SDK支持。
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;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
public class Demo {
public static void main(String[] args) throws Exception {
// 填写云盒Bucket的数据域名。
String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写云盒Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写云盒Bucket所在地域。
String region = "cn-hangzhou";
// 填写云盒ID。
String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";
// 创建OSSClient实例。
// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
conf.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(new DefaultCredentialProvider(credentialsProvider.getCredentials()))
.clientConfiguration(conf)
.region(region)
.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();
}
}
}
}import alibabacloud_oss_v2 as oss
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# 使用SDK的默认配置。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# 填写云盒Bucket所在地域,例如cn-hangzhou。
cfg.region = "cn-hangzhou"
# 填写云盒ID。设置云盒ID后,SDK会自动将签名产品切换为oss-cloudbox。
cfg.cloud_box_id = "cb-f8z7yvzgwfkl9q0h****"
# 填写云盒Bucket的数据域名,格式为CloudboxId.Region.oss-cloudbox.aliyuncs.com。
cfg.endpoint = "cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com"
# 创建OSS客户端。
client = oss.Client(cfg)
# 设置生命周期规则:距最后一次修改时间3天后过期,规则适用于Bucket中所有Object。
result = client.put_bucket_lifecycle(oss.PutBucketLifecycleRequest(
bucket="examplebucket",
lifecycle_configuration=oss.LifecycleConfiguration(
rules=[oss.LifecycleRule(
id="rule0",
prefix="",
status="Enabled",
expiration=oss.LifecycleRuleExpiration(
days=3,
),
)],
),
))
print(f'status code: {result.status_code}, request id: {result.request_id}')package main
import (
"context"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
// 使用SDK的默认配置,并从环境变量中获取访问凭证。
// 运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
// 填写云盒Bucket所在地域,例如cn-hangzhou。
WithRegion("cn-hangzhou").
// 填写云盒Bucket的数据域名,格式为CloudboxId.Region.oss-cloudbox.aliyuncs.com。
WithEndpoint("cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com").
// 填写云盒ID。设置云盒ID后,SDK会自动将签名产品切换为oss-cloudbox。
WithCloudBoxId("cb-f8z7yvzgwfkl9q0h****")
// 创建OSS客户端。
client := oss.NewClient(cfg)
// 设置生命周期规则:距最后一次修改时间3天后过期,规则适用于Bucket中所有Object。
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr("examplebucket"),
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
ID: oss.Ptr("rule0"),
Prefix: oss.Ptr(""),
Status: oss.Ptr("Enabled"),
Expiration: &oss.LifecycleRuleExpiration{
Days: oss.Ptr(int32(3)),
},
},
},
},
}
result, err := client.PutBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket lifecycle %v", err)
}
log.Printf("put bucket lifecycle result:%#v\n", result)
}使用命令行工具ossutil
关于使用ossutil设置生命周期规则的具体操作, 请参见put-bucket-lifecycle。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketLifecycle。