OSS支持设置生命周期(Lifecycle)规则,自动删除过期的文件(Object)和碎片,或将到期的文件转储为低频或归档存储类型,从而节省存储费用。本文介绍如何管理存储空间(Bucket)的生命周期规则。

设置生命周期规则

基于最后一次修改时间策略执行转换文件存储类型以及删除操作

以下代码用于为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天后转为低频访问类型。且再次访问前缀为logs的文件时,这些文件将转为标准存储。
    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)
 }            

相关文档