OSS支持设置生命周期(Lifecycle)规则,自动删除过期的文件(Object)和碎片,或将到期的文件转储为低频或归档存储类型,从而节省存储费用。本文介绍如何管理存储空间(Bucket)的生命周期规则。
注意事项
- 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
- 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化。
- 要设置生命周期规则,您必须有
oss:PutBucketLifecycle
权限;要查看生命周期规则,您必须有oss:GetBucketLifecycle
规则;要清空生命周期规则,您必须有oss:DeleteBucketLifecycle
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
设置生命周期规则
基于最后一次修改时间策略执行转换文件存储类型以及删除操作
以下代码用于为examplebucket设置基于最后一次修改时间策略执行转换文件存储类型及删除操作。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定生命周期规则1,并在规则中指定前缀为foo的文件在距离最后一次修改时间3天后过期。
rule1 := oss.BuildLifecycleRuleByDays("rule1", "foo/", true, 3)
// 在受版本控制状态下的Object仅有删除标记的情况下,自动删除删除标记。
deleteMark := true
expiration := oss.LifecycleExpiration{
ExpiredObjectDeleteMarker: &deleteMark,
}
// 非当前版本Object超过30天后过期删除。
versionExpiration := oss.LifecycleVersionExpiration{
NoncurrentDays: 30,
}
// 非当前版本Object超过10天后转为IA存储类型。
versionTransition := oss.LifecycleVersionTransition{
NoncurrentDays: 10,
StorageClass: "IA",
}
// 指定生命周期规则2。
rule2 := oss.LifecycleRule{
ID: "rule2",
Prefix: "yourObjectPrefix",
Status: "Enabled",
Expiration: &expiration,
NonVersionExpiration: &versionExpiration,
NonVersionTransition: &versionTransition,
}
// 指定生命周期规则3,对标签键为tag1、标签值为value1的文件,距文件最后一次修改时间3天后过期。
rule3 := oss.LifecycleRule{
ID: "rule3",
Prefix: "",
Status: "Enabled",
Tags: []oss.Tag{
oss.Tag{
Key: "tag1",
Value: "value1",
},
},
Expiration: &oss.LifecycleExpiration{Days: 3},
}
// 设置生命周期规则。
rules := []oss.LifecycleRule{rule1, rule2, rule3}
// 填写Bucket名称,例如examplebucket。
bucketName := "examplebucket"
err = client.SetBucketLifecycle(bucketName, rules)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
基于最后一次修改时间策略限制除指定前缀、标签以外的文件执行转换存储类型操作
以下代码用于通过filter节点下的Not元素指定examplebucket中除前缀为log、且包含key为key1,value为value1标签以外的文件在距离最后一次修改时间30天后转低频访问类型。
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"github.com/aliyun/aliyun-oss-go-sdk/sample"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填写Bucket名称,例如examplebucket。
bucketName := "examplebucket"
tag := oss.Tag{
Key: "key1",
Value: "value1",
}
filter := oss.LifecycleFilter{
Not: oss.LifecycleFilterNot{
Prefix: "log",
Tag: &tag,
},
}
rule1 := oss.LifecycleRule{
ID: "mtime transition1",
Prefix: "logs",
Status: "Enabled",
Transitions: []oss.LifecycleTransition{
{
Days: 30,
StorageClass: oss.StorageIA,
},
},
Filter:&filter,
}
var rules = []oss.LifecycleRule{rule1}
err = client.SetBucketLifecycle(bucketName, rules)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("%s\n", "set lifecycle successed")
}
基于最后一次访问时间策略转换文件存储类型
以下代码用于为examplebucket设置基于最后一次访问时间策略执行转换存储类型的操作。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填写Bucket名称,例如examplebucket。
bucketName := "examplebucket"
isTrue := true
isFalse := false
// 指定生命周期规则1。规则中指定前缀为logs,且小于等于64 KB的所有文件在距离最后一次访问时间30天后转为低频访问类型。且再次访问前缀为logs的文件时,这些文件仍保留为低频访问类型。
rule1 := oss.LifecycleRule{
ID: "rule1",
Prefix: "logs",
Status: "Enabled",
Transitions: []oss.LifecycleTransition{
{
Days: 30,
StorageClass: oss.StorageIA,
IsAccessTime: &isTrue,
ReturnToStdWhenVisit: &isFalse,
AllowSmallFile: &isTrue,
},
},
}
// 指定生命周期规则2。规则中指定前缀为dir,且大于64 KB的所有历史版本文件在距离最后一次访问时间10天后转为低频访问类型。且再次访问前缀为dir的文件时,这些文件将转为标准存储。
rule2 := oss.LifecycleRule{
ID: "rule2",
Prefix: "dir",
Status: "Enabled",
NonVersionTransitions:[]oss.LifecycleVersionTransition {
{
NoncurrentDays: 10,
StorageClass: oss.StorageIA,
IsAccessTime: &isTrue,
ReturnToStdWhenVisit: &isTrue,
AllowSmallFile: &isFalse,
},
},
}
// 设置生命周期规则。
var rules = []oss.LifecycleRule{rule1,rule2}
err = client.SetBucketLifecycle(bucketName, rules)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("%s\n", "set bucket life cycle success")
}
查看生命周期规则
以下代码用于查看examplebucket存储空间的生命周期规则。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填写Bucket名称,例如examplebucket。
bucketName := "examplebucket"
// 查看生命周期规则。
lcRes, err := client.GetBucketLifecycle(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
for _, rule := range lcRes.Rules {
fmt.Println("Lifecycle Rule Id:",rule.ID)
fmt.Println("Lifecycle Rule Prefix:",rule.Prefix)
fmt.Println("Lifecycle Rule Status:",rule.Status)
if rule.Expiration != nil {
fmt.Println("Lifecycle Rule Expiration Days:",rule.Expiration.Days)
fmt.Println("Lifecycle Rule Expiration Date:",rule.Expiration.Date)
fmt.Println("Lifecycle Rule Expiration Created Before Date:",rule.Expiration.CreatedBeforeDate)
if rule.Expiration.ExpiredObjectDeleteMarker != nil {
fmt.Println("Lifecycle Rule Expiration Expired Object DeleteMarker:", *rule.Expiration.ExpiredObjectDeleteMarker)
}
}
for _, tag := range rule.Tags {
fmt.Println("Lifecycle Rule Tag Key:",tag.Key)
fmt.Println("Lifecycle Rule Tag Value:",tag.Value)
}
for _, transition := range rule.Transitions {
fmt.Println("Lifecycle Rule Transition Days:",transition.Days)
fmt.Println("Lifecycle Rule Transition Created Before Date:",transition.CreatedBeforeDate)
fmt.Println("Lifecycle Rule Transition Storage Class:",transition.StorageClass)
if transition.IsAccessTime != nil {
fmt.Println("Lifecycle Rule Transition Is Access Time:",*transition.IsAccessTime)
}
if transition.ReturnToStdWhenVisit != nil {
fmt.Println("Lifecycle Rule Transition Return To Std When Visit:",*transition.ReturnToStdWhenVisit)
}
if transition.AllowSmallFile != nil {
fmt.Println("Lifecycle Rule Non Version Allow Small File:", *transition.AllowSmallFile)
}
}
if rule.AbortMultipartUpload != nil {
fmt.Println("Lifecycle Rule Abort Multipart Upload Days:",rule.AbortMultipartUpload.Days)
fmt.Println("Lifecycle Rule Abort Multipart Upload Created Before Date:",rule.AbortMultipartUpload.CreatedBeforeDate)
}
for _, nonVersionTransition := range rule.NonVersionTransitions {
fmt.Println("Lifecycle Rule Non Version Transitions Non current Days:",nonVersionTransition.NoncurrentDays)
fmt.Println("Lifecycle Rule Transition Storage Class:",nonVersionTransition.StorageClass)
if nonVersionTransition.IsAccessTime != nil {
fmt.Println("Lifecycle Rule Transition Is Access Time:",*nonVersionTransition.IsAccessTime)
}
if nonVersionTransition.ReturnToStdWhenVisit != nil {
fmt.Println("Lifecycle Rule Transition Return To Std When Visit:",*nonVersionTransition.ReturnToStdWhenVisit)
}
if nonVersionTransition.AllowSmallFile != nil {
fmt.Println("Lifecycle Rule Non Version Allow Small File:", *nonVersionTransition.AllowSmallFile)
}
if rule.Filter != nil {
fmt.Println("Lifecycle Rule Filter Not Prefix:", rule.Filter.Not.Prefix)
if rule.Filter.Not.Tag != nil {
fmt.Println("Lifecycle Rule Filter Not Tag Key:", rule.Filter.Not.Tag.Key)
fmt.Println("Lifecycle Rule Filter Not Tag Value:", rule.Filter.Not.Tag.Value)
}
}
}
}
}
清空生命周期规则
以下代码用于清空examplebucket存储空间的生命周期规则。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填写Bucket名称,例如examplebucket。
bucketName := "examplebucket"
// 清空生命周期规则。
err = client.DeleteBucketLifecycle(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
相关文档
- 关于生命周期规则的完整示例代码,请参见GitHub示例。
- 关于设置生命周期规则的API接口说明,请参见PutBucketLifecycle。
- 关于查看生命周期规则的API接口说明,请参见GetBucketLifecycle。
- 关于清空生命周期规则的API接口说明,请参见DeleteBucketLifecycle。