このトピックでは、Go SDK V2 を使用してバケットのライフサイクルルールを管理する方法について説明します。
背景情報
Object Storage Service (OSS) では、アップロードされたすべてのデータが頻繁なアクセスを必要とするわけではありません。しかし、一部のデータはコンプライアンスやアーカイブ目的でコールドストレージに保持する必要があります。ビジネス要件に基づき、以下のオプションから選択できます:
最終更新時刻に基づくライフサイクルルール:これらのルールを使用して、長期間変更されておらず不要になったデータを削除したり、コールドストレージクラスに移行してストレージ容量を解放したりできます。
最終アクセス時刻に基づくライフサイクルルール:これらのルールを有効にすると、OSS が自動的にデータアクセスパターンを監視します。OSS はアクセス頻度の低いデータを特定し、よりコスト効率の高いコールドストレージクラスに移行します。これにより、データを階層化し、ストレージコストを削減できます。
注意事項
最終更新時刻または最終アクセス時刻に基づいてライフサイクルルールを設定する前に、この機能を理解していることを確認してください。詳細については、「最終更新時刻に基づくライフサイクルルール」および「最終アクセス時刻に基づくライフサイクルルール」をご参照ください。
このトピックのサンプルコードでは、中国 (杭州) リージョン (
cn-hangzhou) を例として使用しています。デフォルトでは、パブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud サービスから 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 日後に低頻度アクセス (IA) ストレージクラスに移行します。
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)
}
最終更新時刻に基づくオブジェクトのフィルタリング
以下のコードは、最終更新時刻に基づくライフサイクルルールを作成する方法を示しています。このルールは、プレフィックスが logs/ で、サイズが 500 バイトから 1,000 バイトの間のバケット内のオブジェクトに適用されます。これらのオブジェクトは、最終更新時刻から 30 日後に低頻度アクセス (IA) ストレージクラスに移行されますが、プレフィックスが logs/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" を指定します。このルールは、オブジェクトを最終更新日から 30 日後に IA ストレージクラスに移行します。
// このルールは、プレフィックスが "logs/" で、サイズが 500 バイトから 1000 バイトの間のオブジェクトに適用されますが、
// プレフィックスが "logs/log" でタグが {key1: value1} のオブジェクトは除外されます。
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)),
Nots: []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{
{
// ライフサイクルルール "rule1" では、プレフィックスが "data/" のすべてのオブジェクトを、
// 最終アクセス日から 200 日後に低頻度アクセス (IA) ストレージクラスに移行します。
// これらのオブジェクトが再度アクセスされても、IA ストレージクラスに留まります。
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),
},
},
},
{
// ライフサイクルルール "rule2" では、プレフィックスが "log/" のすべてのオブジェクトを、
// 最終アクセス日から 120 日後に低頻度アクセス (IA) ストレージクラスに移行します。
// 同じルール内で、これらのオブジェクトを最終アクセス日から 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 len(rule.Filter.Nots) > 0 {
for _, not := range rule.Filter.Nots {
fmt.Println("Lifecycle Rule Filter Not Prefix:", not.Prefix)
if not.Tag != nil {
fmt.Println("Lifecycle Rule Filter Not Tag Key:", not.Tag.Key)
fmt.Println("Lifecycle Rule Filter Not Tag Value:", not.Tag.Value)
}
}
}
}
}
}
}
}
すべてのライフサイクルルールの削除
以下のコードは、バケットのすべてのライフサイクルルールを削除する方法を示しています。特定のライフサイクルルールを 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)
}
関連トピック
ライフサイクルルールの設定の詳細については、「PutBucketLifecycle」をご参照ください。
ライフサイクルルールの表示の詳細については、「GetBucketLifecycle」をご参照ください。
バケットのすべてのライフサイクルルールを削除する方法の詳細については、「DeleteBucketLifecycle」をご参照ください。