Cette rubrique explique comment gérer les règles de cycle de vie d'un bucket à l'aide du SDK Go V2.
Contexte
Dans OSS, toutes les données téléchargées ne nécessitent pas un accès fréquent. Toutefois, certaines données doivent être conservées dans un stockage froid pour des raisons de conformité ou d'archivage. Selon vos besoins métier, vous pouvez choisir parmi les options suivantes :
Règles de cycle de vie basées sur la dernière date de modification : utilisez ces règles pour supprimer les données qui n'ont pas été modifiées depuis longtemps et qui ne sont plus nécessaires, ou pour les transférer vers une classe de stockage froid afin de libérer de l'espace de stockage.
Règles de cycle de vie basées sur la dernière date d'accès : activez ces règles pour permettre à OSS de surveiller automatiquement les modèles d'accès aux données. OSS identifie les données rarement consultées et les transfère vers une classe de stockage froid plus économique. Cette approche vous aide à hiérarchiser vos données et à réduire les coûts de stockage.
Notes
Avant de configurer des règles de cycle de vie basées sur la dernière date de modification ou la dernière date d'accès, assurez-vous de bien comprendre cette fonctionnalité. Pour plus d'informations, consultez Règles de cycle de vie basées sur la dernière date de modification et Règles de cycle de vie basées sur la dernière date d'accès.
L'exemple de code de cette rubrique utilise la région Chine (Hangzhou) (
cn-hangzhou) à titre d'exemple. Par défaut, un endpoint public est utilisé. Si vous accédez à OSS depuis d'autres services Alibaba Cloud situés dans la même région, utilisez un endpoint interne. Pour plus d'informations sur les régions et les endpoints OSS, consultez Régions et endpoints.L'exemple de code montre comment obtenir les identifiants d'accès à partir des variables d'environnement. Pour plus d'informations sur la configuration des identifiants d'accès, consultez Configurer les identifiants d'accès.
La définition d'une règle de cycle de vie nécessite l'autorisation
oss:PutBucketLifecycle. La consultation des règles de cycle de vie nécessite l'autorisationoss:GetBucketLifecycle. La suppression de toutes les règles de cycle de vie d'un bucket nécessite l'autorisationoss:DeleteBucketLifecycle. Pour plus d'informations sur l'attribution des autorisations, consultez Attribuer des stratégies d'autorisations personnalisées aux utilisateurs RAM.
Définir des règles de cycle de vie
Le code suivant montre comment définir des règles de cycle de vie basées sur la dernière date de modification et la dernière date d'accès. Après avoir défini les règles, si vous souhaitez en modifier une ou plusieurs, consultez Comment modifier une ou plusieurs configurations de règles de cycle de vie ?.
Transférer des objets en fonction de la dernière date de modification
Le code suivant montre comment définir une règle de cycle de vie qui transfère les objets vers une classe de stockage différente en fonction de leur dernière date de modification.
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"
)
// Define global variables.
var (
region string // The region where the bucket is located.
bucketName string // The name of the bucket.
)
// The init function initializes command-line arguments.
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() {
// Parse command-line arguments.
flag.Parse()
// Check if the bucket name is provided.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Check if the region is provided.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Load the default configuration, and set the credentials provider and region.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Create an OSS client.
client := oss.NewClient(cfg)
// Create a request to set lifecycle rules for the bucket.
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // The name of the bucket.
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
// Specify lifecycle rule "rule1".
// This rule transitions objects with the prefix "foo/" and the tag {k1: v1}
// to the Infrequent Access (IA) storage class 30 days after they are last modified.
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), // Set to false for a rule based on last modified time.
},
},
Tags: []oss.Tag{
{
Key: oss.Ptr("k1"),
Value: oss.Ptr("v1"),
},
},
},
{
// Specify lifecycle rule "rule2". This rule applies to objects with the prefix "dir/".
// It automatically removes expired object delete markers, deletes non-current versions after 30 days,
// and transitions non-current versions to the IA storage class 10 days after they become non-current.
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), // Set to false for a rule based on last modified time.
}},
},
},
},
}
// Set the lifecycle rules for the bucket.
result, err := client.PutBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket lifecycle %v", err)
}
// Print the result of setting the lifecycle rules.
log.Printf("put bucket lifecycle result:%#v\n", result)
}
Filtrer des objets en fonction de la dernière date de modification
Le code suivant montre comment créer une règle de cycle de vie basée sur la dernière date de modification. Cette règle s'applique aux objets d'un bucket dont le préfixe est logs/ et dont la taille est comprise entre 500 et 1 000 octets. Elle transfère ces objets vers la classe de stockage Infrequent Access (IA) 30 jours après leur dernière modification, mais exclut les objets qui possèdent également le préfixe logs/log et le tag {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"
)
// Define global variables.
var (
region string // The region where the bucket is located.
bucketName string // The name of the bucket.
)
// The init function initializes command-line arguments.
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() {
// Parse command-line arguments.
flag.Parse()
// Check if the bucket name is provided.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Check if the region is provided.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Load the default configuration, and set the credentials provider and region.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Create an OSS client.
client := oss.NewClient(cfg)
// Create a request to set lifecycle rules for the bucket.
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName),
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
// Specify lifecycle rule "rule1". This rule transitions objects to the IA storage class
// 30 days after they are last modified. The rule applies to objects with the prefix "logs/",
// sizes between 500 and 1000 bytes, but excludes those with the prefix "logs/log" and tag {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), // Set to false for a rule based on last modified time.
},
},
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"),
},
},
},
},
},
},
},
}
// Set the lifecycle rules for the bucket.
result, err := client.PutBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket lifecycle %v", err)
}
// Print the result of setting the lifecycle rules.
log.Printf("put bucket lifecycle result:%#v\n", result)
}
Transférer des objets en fonction de la dernière date d'accès
Le code suivant montre comment définir une règle de cycle de vie qui transfère les objets vers une classe de stockage différente en fonction de leur dernière date d'accès.
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"
)
// Define global variables.
var (
region string // The region where the bucket is located.
bucketName string // The name of the bucket.
)
// The init function initializes command-line arguments.
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() {
// Parse command-line arguments.
flag.Parse()
// Check if the bucket name is provided.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Check if the region is provided.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Load the default configuration, and set the credentials provider and region.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Create an OSS client.
client := oss.NewClient(cfg)
// Create a request to set lifecycle rules for the bucket.
request := &oss.PutBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // The name of the bucket.
LifecycleConfiguration: &oss.LifecycleConfiguration{
Rules: []oss.LifecycleRule{
{
// In lifecycle rule "rule1", transition all objects with the prefix "data/"
// to the Infrequent Access (IA) storage class 200 days after they are last accessed.
// When these objects are accessed again, they remain in the IA storage class.
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), // Set to true for a rule based on last access time.
ReturnToStdWhenVisit: oss.Ptr(false),
},
},
},
{
// In lifecycle rule "rule2", transition all objects with the prefix "log/"
// to the Infrequent Access (IA) storage class 120 days after they are last accessed.
// In the same rule, transition these objects to the Archive storage class 250 days after they are last accessed.
// When these objects are accessed again, they remain in their current storage class.
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), // Set to true for a rule based on last access time.
ReturnToStdWhenVisit: oss.Ptr(false),
},
{
Days: oss.Ptr(int32(250)),
StorageClass: oss.StorageClassArchive,
IsAccessTime: oss.Ptr(true),
ReturnToStdWhenVisit: oss.Ptr(false),
},
},
},
},
},
}
// Set the lifecycle rules for the bucket.
result, err := client.PutBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put bucket lifecycle %v", err)
}
// Print the result of setting the lifecycle rules.
log.Printf("put bucket lifecycle result:%#v\n", result)
}
Consulter les règles de cycle de vie
Le code suivant montre comment consulter les règles de cycle de vie d'un bucket.
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"
)
// Define global variables.
var (
region string // The region where the bucket is located.
bucketName string // The name of the bucket.
)
// The init function initializes command-line arguments.
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() {
// Parse command-line arguments.
flag.Parse()
// Check if the bucket name is provided.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Check if the region is provided.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Load the default configuration, and set the credentials provider and region.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Create an OSS client.
client := oss.NewClient(cfg)
// Create a request to get the lifecycle configuration for the bucket.
request := &oss.GetBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // The name of the bucket.
}
// Get the lifecycle configuration and handle the result.
result, err := client.GetBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get bucket lifecycle %v", err)
}
// Print the information contained in the lifecycle rules.
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)
}
}
}
}
}
}
}
}
Supprimer toutes les règles de cycle de vie
Le code suivant montre comment supprimer toutes les règles de cycle de vie d'un bucket. Pour supprimer une ou plusieurs règles de cycle de vie spécifiques, consultez Comment supprimer une ou plusieurs règles de cycle de vie ?.
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"
)
// Define global variables.
var (
region string // The region where the bucket is located.
bucketName string // The name of the bucket.
)
// The init function initializes command-line arguments.
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() {
// Parse command-line arguments.
flag.Parse()
// Check if the bucket name is provided.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Check if the region is provided.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Load the default configuration, and set the credentials provider and region.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Create an OSS client.
client := oss.NewClient(cfg)
// Create a request to delete all lifecycle rules for the bucket.
request := &oss.DeleteBucketLifecycleRequest{
Bucket: oss.Ptr(bucketName), // The name of the bucket.
}
// Delete all lifecycle rules for the bucket.
result, err := client.DeleteBucketLifecycle(context.TODO(), request)
if err != nil {
log.Fatalf("failed to delete bucket lifecycle %v", err)
}
// Print the result of deleting the lifecycle rules.
log.Printf("delete bucket lifecycle result:%#v\n", result)
}
Rubriques connexes
Pour plus d'informations sur la définition des règles de cycle de vie, consultez PutBucketLifecycle.
Pour plus d'informations sur la consultation des règles de cycle de vie, consultez GetBucketLifecycle.
Pour plus d'informations sur la suppression de toutes les règles de cycle de vie d'un bucket, consultez DeleteBucketLifecycle.