このトピックでは、Go SDK V2 を使用してバケットのライフサイクル機能を管理する方法について説明します。
背景情報
OSS では、アップロードされたすべてのデータが頻繁なアクセスを必要とするわけではありません。 データコンプライアンスやアーカイブの目的で、一部のデータをコールドストレージに移動する必要があります。 必要に応じて、次のいずれかのルールタイプを選択できます。
最終更新時刻に基づくライフサイクルルール: データが長期間変更されず、保持する必要がなくなった場合、このルールを使用してデータを一括で削除したり、コールドストレージタイプに変換してストレージスペースを解放したりできます。
最終アクセス時刻に基づくライフサイクルルール: このルールを有効にすると、OSS は自動的にデータアクセスパターンを監視し、コールドデータを識別し、そのストレージタイプを動的に変換します。 OSS は、長期間アクセスされていないデータを識別し、よりコスト効率の高いコールドストレージタイプに変換します。 これにより、自動ストレージ階層化が可能になり、ストレージコストが削減されます。
注意
オブジェクトの最終更新時刻または最終アクセス時刻に基づいてライフサイクルルールを設定する前に、この機能に精通していることを確認してください。 詳細については、「最終更新時刻に基づくライフサイクルルール」および「最終アクセス時刻に基づくライフサイクルルール」をご参照ください。
このトピックのサンプルコードでは、中国 (杭州) リージョン (リージョン ID:
cn-hangzhou) を例として使用しています。 デフォルトでは、パブリックエンドポイントが使用されます。 同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用できます。 OSS リージョンとエンドポイント間のマッピングの詳細については、「OSS リージョンとエンドポイント」をご参照ください。このトピックでは、環境変数からアクセス資格情報を読み取る方法の例を示します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
ライフサイクルルールを設定するには、
oss:PutBucketLifecycle権限が必要です。 ライフサイクルルールをクエリするには、oss:GetBucketLifecycle権限が必要です。 すべてのライフサイクルルールを削除するには、oss:DeleteBucketLifecycle権限が必要です。 詳細については、「RAM ユーザーへのカスタムポリシーの付与」をご参照ください。
ライフサイクルルールの設定
次のコードは、最終更新時刻と最終アクセス時刻に基づいてライフサイクルルールを設定する方法の例を示しています。 ルールを設定した後、1 つ以上のルールを変更する場合は、「1 つ以上のライフサイクルルール設定を変更するにはどうすればよいですか?」をご参照ください。
最終更新時刻のポリシーに基づいてファイルのストレージタイプを変換する
次のコードは、バケットにライフサイクルルールを設定して、最終更新時刻に基づいてファイルのストレージタイプを変換する方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのライフサイクルルールを設定するリクエストを作成します。
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
// ライフサイクルルール rule1 を指定します。 このルールでは、プレフィックスが foo で、タグキーが k1、タグ値が v1 のファイルは、最終更新から 30 日後に低頻度アクセスストレージタイプに変換されます。
Status: oss.Ptr("Enabled"),
ID: oss.Ptr("rule1"),
Prefix: oss.Ptr("foo/"),
Transitions: []oss.LifecycleRuleTransition{
{
Days: oss.Ptr(int32(30)),
StorageClass: oss.StorageClassIA,
IsAccessTime: oss.Ptr(false), // 値を false に設定します。 ポリシーは最終更新時刻に基づいています。
},
},
Tags: []oss.Tag{
{
Key: oss.Ptr("k1"),
Value: oss.Ptr("v1"),
},
},
},
{
// ライフサイクルルール rule2 を指定します。 このルールでは、バージョン管理が有効なバケット内のプレフィックスが dir のオブジェクトについて、オブジェクトに削除マーカーしかない場合、削除マーカーは自動的に削除されます。 オブジェクトの現行バージョンでないものは 30 日後に有効期限が切れて削除されます。 オブジェクトの現行バージョンでないものは 10 日後に IA ストレージタイプに変換されます。
ID: oss.Ptr("rule2"),
Prefix: oss.Ptr("dir/"),
Status: oss.Ptr("Enabled"),
Expiration: &oss.LifecycleRuleExpiration{
Days: oss.Ptr(int32(10)),
ExpiredObjectDeleteMarker: oss.Ptr(true),
},
NoncurrentVersionExpiration: &oss.NoncurrentVersionExpiration{
NoncurrentDays: oss.Ptr(int32(30)),
},
NoncurrentVersionTransitions: []oss.NoncurrentVersionTransition{{
NoncurrentDays: oss.Ptr(int32(10)),
StorageClass: oss.StorageClassIA,
IsAccessTime: oss.Ptr(false), // 値を false に設定します。 ポリシーは最終更新時刻に基づいています。
}},
},
},
},
}
// バケットのライフサイクルルールを設定します。
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)
}
指定されたプレフィックスとタグを持つファイルを除き、最終更新時刻のポリシーに基づいてファイルのストレージタイプを変換する
次のコードは、バケット内のファイルのストレージタイプを、最終更新から 30 日後に低頻度アクセスに変換する方法の例を示しています。 このルールは、プレフィックスが log でなく、キーが key1 で値が value1 のタグを持たず、指定されたサイズ条件を満たすファイルに適用されます。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのライフサイクルルールを設定するリクエストを作成します。
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName),
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
// ライフサイクルルール rule1 を指定します。 このルールでは、プレフィックスが log、キーが key1、値が value1 のタグを持ち、指定されたサイズ条件を満たすファイルを除き、ファイルのストレージタイプを最終更新から 30 日後に低頻度アクセスに変換します。
ID: oss.Ptr("rule1"),
Status: oss.Ptr("Enabled"),
Prefix: oss.Ptr("logs/"),
Transitions: []oss.LifecycleRuleTransition{
{
Days: oss.Ptr(int32(30)),
StorageClass: oss.StorageClassIA,
IsAccessTime: oss.Ptr(false), // 値を false に設定します。 ポリシーは最終更新時刻に基づいています。
},
},
Filter: &oss.LifecycleRuleFilter{
ObjectSizeGreaterThan: oss.Ptr(int64(500)),
ObjectSizeLessThan: oss.Ptr(int64(1000)),
Not: &oss.LifecycleRuleNot{
Prefix: oss.Ptr("logs/log"),
Tag: &oss.Tag{
Key: oss.Ptr("key1"),
Value: oss.Ptr("value1"),
},
},
},
},
},
},
}
// バケットのライフサイクルルールを設定します。
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)
}
最終アクセス時刻のポリシーに基づいてファイルのストレージタイプを変換する
次のコードは、バケットにライフサイクルルールを設定して、最終アクセス時刻に基づいてファイルのストレージタイプを変換する方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのライフサイクルルールを設定するリクエストを作成します。
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
// ライフサイクルルール 1 では、プレフィックスが data/ のすべてのファイルが、最終アクセスから 200 日後に低頻度アクセスストレージタイプに変換されるように指定します。 プレフィックスが data/ のファイルに再度アクセスしても、低頻度アクセスストレージタイプに保持されます。
ID: oss.Ptr("rule1"),
Status: oss.Ptr("Enabled"),
Prefix: oss.Ptr("data/"),
Transitions: []oss.LifecycleRuleTransition{
{
Days: oss.Ptr(int32(200)),
StorageClass: oss.StorageClassIA,
IsAccessTime: oss.Ptr(true), // 値を true に設定します。 ポリシーは最終アクセス時刻に基づいています。
ReturnToStdWhenVisit: oss.Ptr(false),
},
},
},
{
// ライフサイクルルール 2 では、プレフィックスが log/ のすべてのファイルが、最終アクセスから 120 日後に低頻度アクセスストレージタイプに変換されるように指定します。 プレフィックスが log/ のファイルに再度アクセスしても、低頻度アクセスストレージタイプに保持されます。
// 同じルールで、プレフィックスが log/ のすべてのファイルが、最終アクセスから 250 日後にアーカイブストレージタイプに変換されるように指定します。
ID: oss.Ptr("rule2"),
Status: oss.Ptr("Enabled"),
Prefix: oss.Ptr("log/"),
Transitions: []oss.LifecycleRuleTransition{
{
Days: oss.Ptr(int32(120)),
StorageClass: oss.StorageClassIA,
IsAccessTime: oss.Ptr(true), // 値を true に設定します。 ポリシーは最終アクセス時刻に基づいています。
ReturnToStdWhenVisit: oss.Ptr(false),
},
{
Days: oss.Ptr(int32(250)),
StorageClass: oss.StorageClassArchive,
IsAccessTime: oss.Ptr(true),
ReturnToStdWhenVisit: oss.Ptr(false),
},
},
},
},
},
}
// バケットのライフサイクルルールを設定します。
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)
}
ライフサイクルルールのクエリ
次のコードは、ライフサイクルルールをクエリする方法の例を示しています。
package main
import (
"context"
"flag"
"fmt"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのライフサイクル設定を取得するリクエストを作成します。
request := &oss.GetBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
}
// バケットのライフサイクル設定を取得し、結果を処理します。
result, err := client.GetBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket lifecycle %v", err)
}
// ライフサイクルルールに含まれる情報を出力します。
for _, rule := range result.LifecycleConfiguration.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 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 Transition 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)
}
if rule.NoncurrentVersionTransitions != nil {
for _, nonVersionTransition := range rule.NoncurrentVersionTransitions {
fmt.Println("Lifecycle Rule Non Version Transitions Non current Days:", nonVersionTransition.NoncurrentDays)
fmt.Println("Lifecycle Rule Non Version Transition Storage Class:", nonVersionTransition.StorageClass)
if nonVersionTransition.IsAccessTime != nil {
fmt.Println("Lifecycle Rule Non Version Transition Is Access Time:", *nonVersionTransition.IsAccessTime)
}
if nonVersionTransition.ReturnToStdWhenVisit != nil {
fmt.Println("Lifecycle Rule Non Version 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 {
if rule.Filter.ObjectSizeGreaterThan != nil {
fmt.Println("Lifecycle Rule Filter Object Size Greater Than:", *rule.Filter.ObjectSizeGreaterThan)
}
if rule.Filter.ObjectSizeLessThan != nil {
fmt.Println("Lifecycle Rule Filter Object Size Less Than:", *rule.Filter.ObjectSizeLessThan)
}
if rule.Filter.Not != 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 バケットからすべてのライフサイクルルールを削除する方法の例を示しています。 1 つ以上のライフサイクルルールを削除する場合は、「1 つ以上のライフサイクルルールを削除するにはどうすればよいですか?」をご参照ください。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を定義します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
)
// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// バケットのすべてのライフサイクルルールを削除するリクエストを作成します。
request := &oss.DeleteBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
}
// バケットのすべてのライフサイクルルールを削除します。
result, err := client.DeleteBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to delete bucket lifecycle %v", err)
}
// バケットのすべてのライフサイクルルールを削除した結果を出力します。
log.Printf("delete bucket lifecycle result:%#v\n", result)
}
関連ドキュメント
ライフサイクルルールを設定する API 操作の詳細については、「PutBucketLifecycle」をご参照ください。
ライフサイクルルールをクエリする API 操作の詳細については、「GetBucketLifecycle」をご参照ください。
すべてのライフサイクルルールを削除する API 操作の詳細については、「DeleteBucketLifecycle」をご参照ください。