Les règles de cycle de vie basées sur la dernière date de modification permettent de transférer automatiquement les objets vers des classes de stockage plus froides ou de les supprimer, ce qui réduit les coûts de stockage.
Cas d'utilisation
Un prestataire de soins de santé télécharge des dossiers médicaux dans OSS. Ces dossiers sont consultés occasionnellement au cours des six premiers mois, puis rarement par la suite. Une règle de cycle de vie permet de les transférer vers la classe de stockage Archive après 180 jours.
Une entreprise télécharge des enregistrements d'appels téléphoniques dans OSS. Les enregistrements sont activement utilisés pendant deux mois, consultés occasionnellement jusqu'à six mois, et ne sont plus nécessaires après deux ans. Une règle de cycle de vie permet de les transférer vers la classe de stockage Infrequent Access après 60 jours, vers Archive après 180 jours, et de les supprimer après 730 jours.
Pour supprimer tous les objets d'un bucket, configurez une règle de cycle de vie s'appliquant à l'intégralité du bucket et supprimant les objets après un jour.
Ces transitions utilisent les classes de stockage d'OSS.
Limitations
Conditions de correspondance
Les règles de cycle de vie ne prennent en charge la correspondance que sur la base des préfixes et des tags. La correspondance par caractères génériques, par suffixe ou par expression régulière n'est pas prise en charge.
Limitations relatives à l'expiration des parties
Vous ne pouvez pas configurer deux règles de cycle de vie ou plus contenant une politique de cycle de vie pour les parties, si les noms des objets concernés comportent des préfixes qui se chevauchent. Exemples :
-
Exemple 1
Si vous configurez une règle de cycle de vie contenant une politique relative aux parties pour un bucket, vous ne pouvez pas configurer une autre règle de cycle de vie contenant une politique relative aux parties pour les objets de ce bucket.
-
Exemple 2
Si vous configurez une règle de cycle de vie contenant une politique relative aux parties pour les objets dont le nom contient le préfixe dir1 dans un bucket, vous ne pouvez pas configurer une autre règle de cycle de vie contenant une politique relative aux parties pour les objets dont le nom contient des préfixes qui se chevauchent, tels que dir1/dir2.
Limitations relatives à la transition de classe de stockage
Considérations importantes
Limite de règles
Un bucket prend en charge jusqu'à 1 000 règles de cycle de vie. Une seule règle peut inclure des politiques basées à la fois sur la dernière date de modification et sur la dernière date d'accès.
Sémantique d'écrasement
L'opération PutBucketLifecycle écrase les configurations existantes d'une règle de cycle de vie d'un bucket. Par exemple, si une règle de cycle de vie nommée Rule1 est configurée pour un bucket et que vous souhaitez configurer une autre règle de cycle de vie nommée Rule2 pour ce même bucket, procédez comme suit :
Récupérez Rule1.
Combinez Rule1 et Rule2.
Mettez à jour la configuration avec les règles combinées (Rule1+Rule2).
Délai d'effet
Après la création d'une règle de cycle de vie, son statut dans la liste des règles de la console affiche Starting. Ce comportement est normal et le statut ne passe pas à Enabled. L'exécution des règles de cycle de vie ne fournit ni compteur de suppressions, ni journaux, ni notifications. Vous pouvez vérifier si les objets cibles existent toujours afin de confirmer l'exécution d'une règle.
OSS charge une règle de cycle de vie dans les 24 heures suivant sa création. Une fois la règle chargée, OSS l'exécute chaque jour à 08:00:00 (UTC+8).
Pour les règles basées sur un nombre de jours, assurez-vous qu'il y a au moins 24 heures entre la dernière date de modification de l'objet et l'heure de début d'exécution de la règle (08:00 UTC+8). Par exemple, si une règle supprime les objets un jour après leur téléchargement, OSS traite un objet téléchargé le 20 juillet 2020 de la manière suivante :
Les objets téléchargés avant 08:00:00 (UTC+8) le 20 juillet 2020 sont supprimés entre 08:00:00 (UTC+8) le 21 juillet 2020 et 08:00:00 (UTC+8) le 22 juillet 2020.
Les objets téléchargés après 08:00:00 (UTC+8) le 20 juillet 2020 sont supprimés entre 08:00:00 (UTC+8) le 22 juillet 2020 et 08:00:00 (UTC+8) le 23 juillet 2020.
La mise à jour d'une règle de cycle de vie peut interrompre la tâche de cycle de vie en cours d'exécution ce jour-là. Évitez les mises à jour fréquentes.
Vérification avant application en production
Avant d'appliquer une règle de cycle de vie à un bucket de production, configurez et testez cette règle dans un bucket de test. Une fois que vous avez confirmé que la règle fonctionne comme prévu, appliquez-la à votre bucket de production. La configuration directe d'une règle de cycle de vie dans un bucket de production sans vérification préalable peut entraîner la suppression involontaire de données.
Sauvegarde des données avant configuration
Avant de configurer une règle de cycle de vie, sauvegardez vos données importantes. Vous pouvez utiliser la réplication intra-région (SRR) ou la réplication inter-régions (CRR) pour sauvegarder vos données.
Délai d'achèvement de l'exécution
Une fois qu'une règle est active, les opérations de cycle de vie telles que la suppression d'objets, la transition de classe de stockage et l'expiration des parties de téléchargement multipartie sont généralement achevées dans un délai de 24 heures pour un maximum d'un milliard d'objets dans les régions Chine (Hangzhou), Chine (Shanghai), Chine (Pékin), Chine (Zhangjiakou), Chine (Ulanqab), Chine (Shenzhen) et Singapour. Dans les autres régions, ces opérations sont généralement achevées dans un délai de 24 heures pour un maximum de 100 millions d'objets.
-
L'exécution peut prendre plus de 24 heures, voire plusieurs jours ou semaines dans certains cas, si le nombre d'objets à analyser est élevé, si de nombreux objets correspondent à la règle de cycle de vie, s'il existe de nombreux tags, de nombreuses versions pour un seul objet, ou si un volume important de nouveaux objets est écrit pendant l'exécution de la tâche de cycle de vie.
RemarqueSi le versioning est activé pour le bucket, une opération effectuée sur chaque version d'un objet est comptabilisée comme une opération distincte.
Facturation
Les transitions de classe de stockage et les suppressions entraînent des frais de stockage et de requête. Consultez les Frais liés au cycle de vie.
Considérations spécifiques aux scénarios
Suppression des données source après réplication : La réplication des données et les opérations de cycle de vie sont asynchrones. La réplication peut prendre quelques minutes, plusieurs heures, voire plusieurs jours, selon la quantité de données à répliquer et la bande passante disponible. Avant de configurer une règle de cycle de vie pour supprimer les données répliquées du bucket source, vérifiez que les données ont bien été répliquées dans le bucket de destination. Définissez une période d'expiration appropriée. Sinon, la règle de cycle de vie risque de supprimer les données source avant la fin de la réplication, ce qui entraînerait une perte de données.
-
Buckets OSS-HDFS :
-
Règles de cycle de vie pour les fichiers OSS
Pour configurer ou modifier une règle de cycle de vie basée sur la dernière date de modification afin de cibler tous les objets d'un bucket pour lequel OSS-HDFS est activé, utilisez l'élément NOT pour exclure les objets stockés dans le répertoire
.dlsdata/. Cela empêche les actions de suppression d'objets ou de conversion de classe de stockage déclenchées par la règle de cycle de vie de s'appliquer aux données OSS-HDFS, évitant ainsi toute incidence sur les opérations de lecture et d'écriture des données OSS-HDFS. -
Règles de cycle de vie pour les fichiers HDFS
Pour hiérarchiser les données fréquemment accessibles en Standard et les données moins fréquemment accessibles en Infrequent Access, Archive ou Deep Archive, utilisez la fonctionnalité Utiliser le stockage hiérarchisé, qui repose sur des règles de cycle de vie.
-
Règles de cycle de vie avec versioning : Les transitions de classe de stockage via le cycle de vie ne créent pas de versions précédentes.
Composants
Conditions de filtrage
Correspondance par préfixe : Correspond aux objets et aux parties ayant un préfixe spécifié. Vous pouvez créer plusieurs règles avec des préfixes différents et non chevauchants. La dénomination des préfixes suit les règles de nommage des Objets.
-
Correspondance par tag : Correspond aux objets selon des tags clé-valeur spécifiés. Une seule règle peut contenir plusieurs tags ; la règle s'applique uniquement aux objets contenant tous les tags spécifiés.
Tags de règle de cycle de vie
Tags d'objet
Correspondance
a:1,b:2
a:1
Non
a:1,b:3
Non
a:1,b:2
Oui
a:1,b:2,c:3
Oui
RemarqueLes règles basées sur des tags ne s'appliquent pas aux parties.
Correspondance par préfixe et tags : Correspond aux objets répondant aux filtres de préfixe et de tags spécifiés.
Application à l'intégralité du bucket : Correspond à tous les objets et parties du bucket.
-
Élément NOT : Exclut des objets spécifiques d'une règle de cycle de vie qui correspondrait autrement à un préfixe et à des tags. Spécifiez les préfixes et les tags à exclure. Consultez les exemples d'élément NOT.
ImportantLes règles de cycle de vie peuvent inclure plusieurs éléments NOT. Cette fonctionnalité est en aperçu sur invitation uniquement. Contactez le support technique pour demander l'accès.
Un seul bucket prend en charge jusqu'à 1 000 éléments NOT. Une seule règle prend en charge jusqu'à 100 éléments NOT. Le nombre total d'éléments Prefix dans toutes les règles est limité à 2 000.
Après avoir configuré plusieurs éléments NOT, utilisez la console pour gérer vos règles de cycle de vie.
Si la fonctionnalité permettant d'utiliser plusieurs éléments NOT n'est pas activée, ne créez pas plusieurs règles excluant chacune un sous-répertoire différent. Les éléments NOT de différentes règles fonctionnent de manière indépendante. Par exemple, si rule1 exclut uniquement dir/p1/, dir/p2/ est toujours mis en correspondance et supprimé par rule1. Si rule2 exclut uniquement dir/p2/, dir/p1/ est toujours mis en correspondance et supprimé par rule2. Il en résulte la suppression de tous les fichiers sous le préfixe dir/.
Expiration des objets et actions
Expiration en jours : L'action spécifiée s'exécute N jours après la dernière date de modification de l'objet. S'applique à tous les objets d'un bucket sans versioning et aux versions actuelles d'un bucket avec versioning.
Expiration à une date : Tous les objets dont la dernière modification est antérieure à la date spécifiée expirent et l'action s'exécute. S'applique à tous les objets d'un bucket sans versioning et aux versions actuelles d'un bucket avec versioning.
Jours depuis le passage en non-current : Une version non current expire N jours après son passage en non-current, et l'action s'exécute.
Effectuez la transition ou supprimez les objets expirés comme indiqué dans les Éléments de configuration du cycle de vie.
Expiration des parties et actions
Expiration en jours : Une partie est supprimée un nombre spécifié de jours (N) après sa dernière date de modification.
Expiration à une date : Toutes les parties dont la dernière modification est antérieure à une date spécifiée sont supprimées.
Fonctionnement des règles
Préfixes différents
Par exemple, un bucket contient les objets suivants :
logs/programl/log1.txt
logs/program2/log2.txt
logs/program3/log3.txt
doc/readme.txt
Si une règle de cycle de vie spécifie le préfixe logs/, elle s'applique uniquement aux objets commençant par logs/. Si le préfixe est doc/readme.txt, la règle s'applique uniquement à l'objet doc/readme.txt.
Vous pouvez spécifier un préfixe contenant des caractères chinois pour une règle de cycle de vie.
Lorsque vous effectuez une opération GET ou HEAD sur un objet correspondant à une politique d'expiration, OSS ajoute l'en-tête de réponse x-oss-expiration. expiry-date indique la date d'expiration de l'objet, et rule-id indique l'ID de la règle correspondante.
Même préfixe et mêmes tags
Lorsque plusieurs règles ayant le même préfixe et les mêmes tags s'appliquent à un objet, la suppression est prioritaire sur la transition de classe de stockage. Par exemple, si rule1 supprime les objets avec le préfixe abc et le tag a=1 après 20 jours, la transition de classe de stockage de rule2 ne prend pas effet.
|
Règle |
Préfixe |
Tag |
Action |
|
rule1 |
abc |
a=1 |
Suppression après 20 jours |
|
rule2 |
abc |
a=1 |
Transition vers Archive Storage après 20 jours |
Préfixes qui se chevauchent
rule1 transfère tous les objets avec le tag a=1 vers Infrequent Access (IA) après 10 jours. rule2 supprime les objets avec le préfixe abc et le tag a=1 après 120 jours.
|
Règle |
Préfixe |
Tag |
Action |
|
rule1 |
- |
a=1 |
Transition vers IA après 10 jours |
|
rule2 |
abc |
a=1 |
Suppression après 120 jours |
rule3 transfère tous les objets avec le tag a=1 vers Archive après 20 jours. Étant donné que les objets en Archive ne peuvent pas être transférés vers Infrequent Access (IA), rule4, qui transfère les objets avec le préfixe abc et le tag a=1 vers IA après 30 jours, ne prend pas effet.
|
Règle |
Préfixe |
Tag |
Action |
|
rule3 |
- |
a=1 |
Transition vers Archive Storage après 20 jours |
|
rule4 |
abc |
a=1 |
Transition vers IA après 30 jours |
Élément NOT
Si vous configurez plusieurs règles de cycle de vie pour le même bucket et que l'une d'elles inclut un élément NOT, la logique NOT s'applique uniquement au sein de cette règle spécifique. Exemples :
-
Exemple 1
La règle de cycle de vie 1 supprime les objets avec le préfixe dir/ dans examplebucket après 100 jours.
La règle de cycle de vie 2 utilise un élément NOT pour supprimer tous les objets dans examplebucket, à l'exception de ceux avec le préfixe dir/, après 50 jours.
Une fois ces règles de cycle de vie actives, les objets dans examplebucket sont supprimés comme suit :
Objet
Comportement de suppression
Objets avec le préfixe dir/
Suppression après 100 jours
Objets sans le préfixe dir/
Suppression après 50 jours
-
Exemple 2
La règle de cycle de vie 1 utilise un élément NOT pour supprimer tous les objets dans examplebucket, à l'exception de ceux avec le tag (key1:value1), après 30 jours.
La règle de cycle de vie 2 supprime tous les objets dans examplebucket avec le tag (key2:value2) après 50 jours.
Une fois ces règles de cycle de vie actives, les objets dans examplebucket sont supprimés comme suit :
Objet
Comportement de suppression
Objets sans les tags key1:value1 ou key2:value2
Suppression après 30 jours
Objets avec uniquement le tag key1:value1
Non supprimés
Objets avec uniquement le tag key2:value2
Suppression après 30 jours
Objets avec les tags key1:value1 et key2:value2
Suppression après 50 jours
Procédure
Console OSS
Connectez-vous à la console OSS.
Dans le volet de navigation de gauche, cliquez sur Buckets. Sur la page qui s'affiche, cliquez sur le nom du bucket cible.
Dans le volet de navigation de gauche, choisissez .
-
Sur la page Lifecycle, cliquez sur Create Rule.
RemarqueLe commutateur Enable Access Tracking sur la page Lifecycle n'est pas requis pour les règles basées uniquement sur la dernière date de modification. Il s'applique uniquement aux règles de cycle de vie basées sur la dernière date d'accès et entraîne des frais supplémentaires.
-
Dans le panneau Create Lifecycle Rule, configurez la règle à l'aide des tableaux suivants.
-
Si le versioning est désactivé pour le bucket :
Section
Paramètre
Description
Basic Settings
Status
L'état de la règle. Valeurs valides : Start et Disable.
Si elle est activée, OSS effectue la transition ou supprime les objets en fonction de la règle.
Si elle est désactivée, la tâche de cycle de vie est suspendue.
Applied To
La portée de la règle. Sélectionnez Object Prefix ou Whole Bucket.
RemarqueSi vous sélectionnez By Prefix, vous devez saisir le préfixe complet. Par exemple, pour appliquer la règle à tous les objets du répertoire
src/dir1/, définissez le préfixe sursrc/dir1/. Un préfixedir1ne correspondrait pas à ces objets comme prévu. Le préfixe ne peut pas commencer par une barre oblique (/) ou une barre oblique inverse (\). Par exemple,/prodet/prod/sont des préfixes invalides. Utilisez plutôtprod/ouprod.Allow Overlapped Prefixes
Par défaut, OSS vérifie si les préfixes des règles de cycle de vie se chevauchent. Par exemple, vous configurez les deux règles suivantes avec des préfixes qui se chevauchent :
Règle 1
Supprime tous les objets dont le préfixe est dir1/ 180 jours après leur dernière date de modification.
Règle 2
Fait passer tous les objets dont le préfixe est dir1/dir2/ vers la classe de stockage Infrequent Access 30 jours après leur dernière date de modification, et les supprime 60 jours après leur dernière date de modification.
Si vous ne sélectionnez pas cette option lors de la configuration de la règle 2, OSS détecte que les objets du répertoire dir1/dir2/ correspondent à deux règles de suppression. Par conséquent, OSS rejette la règle 2 et signale une erreur Overlap for same action type Expiration..
Si vous sélectionnez cette option lors de la configuration de la règle 2, les objets du répertoire dir1/dir2/ passent à la classe de stockage Infrequent Access 30 jours après leur dernière date de modification et sont supprimés 60 jours après leur dernière date de modification. Les autres objets du répertoire dir1/ sont supprimés 180 jours après leur dernière date de modification.
RemarqueSi vous configurez plusieurs règles et que l'une d'entre elles s'applique à l'ensemble du bucket, cela est considéré comme un cas de chevauchement de préfixes.
Prefix
Le préfixe d'objet auquel la règle s'applique.
Si vous définissez le préfixe sur img, la règle s'applique à tous les objets dont le nom commence par
img, tels queimgtest.pngetimg/example.jpg.Si vous définissez le préfixe sur img/, la règle s'applique à tous les objets dont le nom commence par
img/, tels queimg/example.jpgetimg/test.jpg.
Le préfixe prend en charge uniquement la correspondance exacte de chaîne et ne prend pas en charge les variables dynamiques ; consultez Longest prefix match et Prefixes do not support dynamic variables dans la description de l'option Allow Overlapped Prefixes pour plus de détails.
Tag
Applique la règle uniquement aux objets dotés du tag spécifié.
Si vous ne définissez pas de préfixe mais spécifiez un tag avec key=a et value=1, la règle s'applique à tous les objets du bucket portant le tag a=1.
Si vous définissez le préfixe sur
imget spécifiez un tag avec key=a et value=1, la règle s'applique à tous les objets du bucket dont le nom commence parimget qui portent le tag a=1.
NOT
L'option NOT exclut les objets dotés d'un préfixe et d'un tag spécifiques de la règle de cycle de vie.
ImportantLorsque vous activez l'option NOT, vous devez spécifier au moins un préfixe ou un tag.
La clé d'un tag spécifié dans la condition NOT ne peut pas être identique à une clé définie dans la condition Tag.
Vous ne pouvez pas configurer de politique d'expiration partielle lorsque l'option NOT est activée.
Object Size
Applique la règle aux objets situés dans une plage de taille spécifiée.
Minimum Size : La règle de cycle de vie s'applique aux objets dont la taille est supérieure à cette valeur. La valeur doit être supérieure à 0 o et inférieure à 5 To.
Maximum Size : La règle de cycle de vie s'applique aux objets dont la taille est inférieure à cette valeur. La valeur doit être supérieure à 0 o et inférieure ou égale à 5 To.
ImportantSi vous spécifiez à la fois une taille minimale et une taille maximale d'objet dans la même règle de cycle de vie :
Assurez-vous que la taille maximale est supérieure à la taille minimale.
Une politique d'expiration partielle ne peut pas être configurée.
Vous ne pouvez pas configurer de politique de nettoyage des marqueurs de suppression.
Policy for Objects
Object Lifecycle
Sélectionnez une politique d'expiration pour les objets. Choisissez By Days, By Date ou Disabled. Si vous sélectionnez Disabled, la politique d'expiration des objets ne prend pas effet.
Lifecycle-based Rules
Configurez des règles pour faire passer la classe de stockage des objets ou supprimer les objets expirés. Sélectionnez Infrequent Access, Archive, Cold Archive, Deep Cold Archive ou Data Deletion.
Par exemple, si vous définissez Object Lifecycle sur By Date et spécifiez le 24 septembre 2023, les objets modifiés pour la dernière fois avant cette date sont automatiquement supprimés et ne peuvent pas être récupérés.
Policy for Parts
Part Lifecycle
Configurez une politique d'expiration pour les parties. Cette option n'est pas disponible si vous avez sélectionné Tag. Définissez la politique d'expiration des parties sur By Days ou By Date, ou sélectionnez Disabled. Si vous sélectionnez Disabled, la politique d'expiration des parties ne prend pas effet.
ImportantUne règle de cycle de vie doit inclure au moins une politique d'expiration d'objet ou une politique d'expiration de partie.
Rules for Parts
Spécifie quand les parties expirent en fonction du nombre de jours ou de la date sélectionnée dans la politique d'expiration des parties. Les parties expirées sont automatiquement supprimées et ne peuvent pas être récupérées.
-
Si le versioning est activé pour le bucket :
Les paramètres des sections Basic Settings et Policy for Parts sont configurés de la même manière que pour les buckets sans versioning. Le tableau suivant décrit uniquement les paramètres qui diffèrent.
ImportantAvant de configurer une règle de cycle de vie, notez que si le versioning est activé sur un bucket servant de destination pour la réplication inter-régions, les marqueurs de suppression synchronisés depuis le bucket source transforment les versions actuelles des objets portant le même nom dans le bucket de destination en versions non actuelles. Par conséquent, configurez soigneusement les règles de nettoyage des versions non actuelles afin d'éviter toute suppression involontaire de données.
Section
Paramètre
Description
Policy for Current Versions
Clean up expired object delete marker
Si le versioning est activé, l'option Clean Up Expired Object Delete Marker est ajoutée à la politique d'expiration. Les autres options sont identiques à celles des buckets pour lesquels le versioning est désactivé.
Si vous sélectionnez cette option, OSS supprime le marqueur de suppression d'un objet expiré s'il s'agit de la seule version de l'objet. Si l'objet possède plusieurs versions et que la dernière version est un marqueur de suppression, OSS conserve le marqueur de suppression. Marqueurs de suppression.
ImportantCette règle ne nettoie pas les marqueurs de suppression si des versions non actuelles existent. Nous vous recommandons de nettoyer rapidement les marqueurs de suppression et les versions non actuelles inutiles. Sinon, un nombre excessif de marqueurs de suppression peut dégrader les performances des opérations de liste.
Policy for Previous Versions
Object Lifecycle
Définissez la politique d'expiration pour les versions non actuelles. Sélectionnez By Days ou Disabled. Si vous sélectionnez Disabled, la politique d'expiration ne prend pas effet.
Lifecycle-based Rules
Spécifiez un nombre de jours (N). Une version non actuelle expire N jours après qu'elle soit devenue non actuelle, et l'action spécifiée est effectuée le jour suivant l'expiration. Par exemple, si vous définissez la valeur sur 30, un objet qui devient une version non actuelle le 1er septembre 2023 passe à la classe de stockage spécifiée ou est supprimé le 1er octobre 2023.
ImportantVous pouvez déterminer quand un objet est devenu une version non actuelle en consultant la dernière date de modification de la version suivante de l'objet.
-
-
Cliquez sur OK.
Une fois la règle de cycle de vie enregistrée, vous pouvez la consulter dans la liste des règles.
SDK
Les exemples suivants configurent des règles de cycle de vie à l'aide de SDK courants. Pour tous les SDK pris en charge, consultez la présentation des SDK.
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.common.utils.DateUtil;
import com.aliyun.oss.model.LifecycleRule;
import com.aliyun.oss.model.SetBucketLifecycleRequest;
import com.aliyun.oss.model.StorageClass;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
public static void main(String[] args) throws Exception {
// In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Specify the name of the bucket. Example: examplebucket.
String bucketName = "examplebucket";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
String region = "cn-hangzhou";
// Create an OSSClient instance.
// Call the shutdown method to release resources when the OSSClient is no longer in use.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Create a request by using SetBucketLifecycleRequest.
SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName);
// Specify the ID of the lifecycle rule.
String ruleId0 = "rule0";
// Specify the prefix that you want the lifecycle rule to match.
String matchPrefix0 = "A0/";
// Specify the tag that you want the lifecycle rule to match.
Map<String, String> matchTags0 = new HashMap<String, String>();
// Specify the key and value of the tag. In the example, the key is set to owner and the value is set to John.
matchTags0.put("owner", "John");
String ruleId1 = "rule1";
String matchPrefix1 = "A1/";
Map<String, String> matchTags1 = new HashMap<String, String>();
matchTags1.put("type", "document");
String ruleId2 = "rule2";
String matchPrefix2 = "A2/";
String ruleId3 = "rule3";
String matchPrefix3 = "A3/";
String ruleId4 = "rule4";
String matchPrefix4 = "A4/";
String ruleId5 = "rule5";
String matchPrefix5 = "A5/";
String ruleId6 = "rule6";
String matchPrefix6 = "A6/";
// Set the expiration time to three days after the last modified time.
LifecycleRule rule = new LifecycleRule(ruleId0, matchPrefix0, LifecycleRule.RuleStatus.Enabled, 3);
rule.setTags(matchTags0);
request.AddLifecycleRule(rule);
// Specify that objects that are created before the specified date expire.
rule = new LifecycleRule(ruleId1, matchPrefix1, LifecycleRule.RuleStatus.Enabled);
rule.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
rule.setTags(matchTags1);
request.AddLifecycleRule(rule);
// Specify that parts expire three days after they are last modified.
rule = new LifecycleRule(ruleId2, matchPrefix2, LifecycleRule.RuleStatus.Enabled);
LifecycleRule.AbortMultipartUpload abortMultipartUpload = new LifecycleRule.AbortMultipartUpload();
abortMultipartUpload.setExpirationDays(3);
rule.setAbortMultipartUpload(abortMultipartUpload);
request.AddLifecycleRule(rule);
// Specify that parts that are created before the specific date expire.
rule = new LifecycleRule(ruleId3, matchPrefix3, LifecycleRule.RuleStatus.Enabled);
abortMultipartUpload = new LifecycleRule.AbortMultipartUpload();
abortMultipartUpload.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
rule.setAbortMultipartUpload(abortMultipartUpload);
request.AddLifecycleRule(rule);
// Specify that the storage classes of objects are changed to IA 10 days after they are last modified, and to Archive 30 days after they are last modified.
rule = new LifecycleRule(ruleId4, matchPrefix4, LifecycleRule.RuleStatus.Enabled);
List<LifecycleRule.StorageTransition> storageTransitions = new ArrayList<LifecycleRule.StorageTransition>();
LifecycleRule.StorageTransition storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.IA);
storageTransition.setExpirationDays(10);
storageTransitions.add(storageTransition);
storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.Archive);
storageTransition.setExpirationDays(30);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
request.AddLifecycleRule(rule);
// Specify that the storage classes of objects that are last modified before October 12, 2022 are changed to Archive.
rule = new LifecycleRule(ruleId5, matchPrefix5, LifecycleRule.RuleStatus.Enabled);
storageTransitions = new ArrayList<LifecycleRule.StorageTransition>();
storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
storageTransition.setStorageClass(StorageClass.Archive);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
request.AddLifecycleRule(rule);
// Specify that rule6 is configured for versioning-enabled buckets.
rule = new LifecycleRule(ruleId6, matchPrefix6, LifecycleRule.RuleStatus.Enabled);
// Specify that the storage classes of objects are changed to Archive 365 days after the objects are last modified.
storageTransitions = new ArrayList<LifecycleRule.StorageTransition>();
storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.Archive);
storageTransition.setExpirationDays(365);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
// Configure the lifecycle rule to automatically delete expired delete markers.
rule.setExpiredDeleteMarker(true);
// Specify that the storage classes of the previous versions of objects are changed to IA 10 days after the objects are last modified.
LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition =
new LifecycleRule.NoncurrentVersionStorageTransition().withNoncurrentDays(10).withStrorageClass(StorageClass.IA);
// Specify that the storage classes of the previous versions of objects are changed to Archive 20 days after the objects are last modified.
LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition2 =
new LifecycleRule.NoncurrentVersionStorageTransition().withNoncurrentDays(20).withStrorageClass(StorageClass.Archive);
// Specify that the previous versions of objects are deleted 30 days after the objects are last modified.
LifecycleRule.NoncurrentVersionExpiration noncurrentVersionExpiration = new LifecycleRule.NoncurrentVersionExpiration().withNoncurrentDays(30);
List<LifecycleRule.NoncurrentVersionStorageTransition> noncurrentVersionStorageTransitions = new ArrayList<LifecycleRule.NoncurrentVersionStorageTransition>();
noncurrentVersionStorageTransitions.add(noncurrentVersionStorageTransition2);
rule.setStorageTransition(storageTransitions);
rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
rule.setNoncurrentVersionStorageTransitions(noncurrentVersionStorageTransitions);
request.AddLifecycleRule(rule);
// Initiate a request to configure lifecycle rules.
ossClient.setBucketLifecycle(request);
// Query the lifecycle rules that are configured for the bucket.
List<LifecycleRule> listRules = ossClient.getBucketLifecycle(bucketName);
for(LifecycleRule rules : listRules){
System.out.println("ruleId="+rules.getId()+", matchPrefix="+rules.getPrefix());
}
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
PHP
<?php
// Include the autoload file to load dependencies.
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
// Describe command-line parameters.
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located', 'required' => True], // (Required) Specify the region in which the bucket is located.
"endpoint" => ['help' => 'The domain names that other services can use to access OSS', 'required' => False], // (Optional) Specify the OSS endpoint.
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // (Required) Specify the name of the bucket.
];
// Generate a long options list to parse the command-line parameters.
$longopts = \array_map(function ($key) {
return "$key:"; // Add a colon (:) to the end of each parameter to indicate that a value is required.
}, array_keys($optsdesc));
// Parse the command-line parameters.
$options = getopt("", $longopts);
// Check whether the required parameters are missing.
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help"; // Display the required but missing parameters.
exit(1);
}
}
// Obtain the values of the command-line parameters and assign the values to variables.
$region = $options["region"]; // The region in which the bucket is located.
$bucket = $options["bucket"]; // The name of the bucket.
// Load the AccessKey ID and AccessKey secret from environment variables.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// Use the default configuration of the SDK.
$cfg = Oss\Config::loadDefault();
// Specify the credential provider.
$cfg->setCredentialsProvider($credentialsProvider);
// Specify the region.
$cfg->setRegion($region);
// If an endpoint is provided, specify the endpoint.
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
// Create an OSS client instance.
$client = new Oss\Client($cfg);
// Define a lifecycle rule that moves objects whose names are prefixed with "log/" to IA 30 days after they were last modified.
$lifecycleRule = new Oss\Models\LifecycleRule(
prefix: 'log/', // The prefix of object names.
transitions: array(
new Oss\Models\LifecycleRuleTransition(
days: 30, // Specify the days.
storageClass: 'IA' // Change to IA.
)
),
id: 'rule', // The rule ID.
status: 'Enabled' // Enable the rule.
);
// Create a lifecycle configuration and add lifecycle rules to the configuration.
$lifecycleConfiguration = new LifecycleConfiguration(
rules: array($lifecycleRule)
);
// Create a request to set a lifecycle configuration and pass the lifecycle configuration.
$request = new Oss\Models\PutBucketLifecycleRequest(
bucket: $bucket,
lifecycleConfiguration: $lifecycleConfiguration
);
// Call the putBucketLifecycle method to configure the lifecycle rules.
$result = $client->putBucketLifecycle($request);
// Display the result.
printf(
'status code:' . $result->statusCode . PHP_EOL . // The HTTP response status code.
'request id:' . $result->requestId . PHP_EOL // The request ID.
);
Node.js
const OSS = require('ali-oss')
const client = new OSS({
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou.
region: 'yourregion',
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Specify the name of the bucket.
bucket: 'yourbucketname'
});
async function putBucketLifecycle(lifecycle) {
try {
const result = await client.putBucketLifecycle('yourbucketname', [
lifecycle
]);
console.log(result);
} catch (e) {
console.log(e);
}
}
const lifecycle1 = {
id: 'rule1',
status: 'Enabled',
prefix: 'foo/',
expiration: {
// Specify that the current versions of objects expire three days after the objects are last modified.
days: 3
}
}
putBucketLifecycle(lifecycle1)
const lifecycle2 = {
id: 'rule2',
status: 'Enabled',
prefix: 'foo/',
expiration: {
// Specify that the objects that are created before the specified date expire.
createdBeforeDate: '2020-02-18T00:00:00.000Z'
},
}
putBucketLifecycle(lifecycle2)
const lifecycle3 = {
id: 'rule3',
status: 'Enabled',
prefix: 'foo/',
abortMultipartUpload: {
// Specify that parts expire in three days.
days: 3
},
}
putBucketLifecycle(lifecycle3)
const lifecycle4 = {
id: 'rule4',
status: 'Enabled',
prefix: 'foo/',
abortMultipartUpload: {
// Specify that parts created before the specified date expire.
createdBeforeDate: '2020-02-18T00:00:00.000Z'
},
}
putBucketLifecycle(lifecycle4)
const lifecycle5 = {
id: 'rule5',
status: 'Enabled',
prefix: 'foo/',
transition: {
// Specify that the storage classes of the current versions of objects are changed to Archive 20 days after the objects are last modified.
days: 20,
storageClass: 'Archive'
},
expiration: {
// Specify that the current versions of objects expire 21 days after the objects are last modified.
days: 21
},
}
putBucketLifecycle(lifecycle5)
const lifecycle6 = {
id: 'rule6',
status: 'Enabled',
prefix: 'foo/',
transition: {
//Specify that the storage classes of the objects that are created before the specified date are changed to Archive.
createdBeforeDate: '2023-02-19T00:00:00.000Z',
storageClass: 'Archive'
},
expiration: {
// Specify that objects created before the specified date are deleted.
createdBeforeDate: '2023-01-18T00:00:00.000Z'
},
}
putBucketLifecycle(lifecycle6)
const lifecycle7 = {
id: 'rule7',
status: 'Enabled',
prefix: 'foo/',
expiration: {
// Specify that delete markers are automatically removed when they expire.
expiredObjectDeleteMarker: true
}
}
putBucketLifecycle(lifecycle7)
const lifecycle8 = {
id: 'rule8',
status: 'Enabled',
prefix: 'foo/',
// Specify that the storage classes of the previous versions of objects are changed to IA 10 days after the objects are last modified.
noncurrentVersionTransition: {
noncurrentDays: '10',
storageClass: 'IA'
}
}
putBucketLifecycle(lifecycle8)
const lifecycle9 = {
id: 'rule9',
status: 'Enabled',
prefix: 'foo/',
// Specify that the storage classes of the previous versions of objects are changed to IA 10 days after the objects are last modified.
noncurrentVersionTransition: {
noncurrentDays: '10',
storageClass: 'IA'
},
// Specify the tags for objects that you want to match the rules.
tag: [{
key: 'key1',
value: 'value1'
},
{
key: 'key2',
value: 'value2'
}]
}
putBucketLifecycle(lifecycle9)
Python
import argparse
import alibabacloud_oss_v2 as oss
# Create a command-line argument parser to receive user-entered parameters.
parser = argparse.ArgumentParser(description="put bucket lifecycle sample")
# Add the --region command-line argument, which specifies the region where the bucket is located. This argument is required.
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# Add the --bucket command-line argument, which specifies the name of the bucket. This argument is required.
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# Add the --endpoint command-line argument, which specifies the domain name that other services can use to access OSS. This argument is optional.
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
def main():
# Parse command-line arguments.
args = parser.parse_args()
# Load credentials (AccessKey ID and AccessKey secret) from environment variables.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Load the default configurations of the SDK.
cfg = oss.config.load_default()
# Set the credentials provider.
cfg.credentials_provider = credentials_provider
# Set the region where the bucket is located.
cfg.region = args.region
# If a custom endpoint is provided by the user, set it in the configuration.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Initialize the OSS client using the configuration object.
client = oss.Client(cfg)
result = client.put_bucket_lifecycle(oss.PutBucketLifecycleRequest(
bucket=args.bucket,
lifecycle_configuration=oss.LifecycleConfiguration(
rules=[oss.LifecycleRule(
# Specify lifecycle rule rule1. In this rule, objects that have the prefix foo/ and the tag k1:v1 are converted to the Infrequent Access (IA) storage class 30 days after they are last modified.
id='rule1',
status='Enabled',
prefix='foo/',
transitions=[oss.LifecycleRuleTransition(
days=30,
storage_class=oss.StorageClassType.IA,
is_access_time=False, # Set to false, which indicates that the policy is based on the last modified time.
)],
tags=[oss.Tag(
key='k1',
value='v1',
)],
), oss.LifecycleRule(
# Specify lifecycle rule rule2. In this rule, for objects that have the prefix dir/, delete markers are automatically deleted if the objects are in a versioning-enabled bucket and have only delete markers. Non-current versions of objects expire and are deleted after 30 days. Non-current versions of objects are converted to the IA storage class after 10 days.
id='rule2',
status='Enabled',
prefix='dir/',
expiration=oss.LifecycleRuleExpiration(
expired_object_delete_marker=True
),
noncurrent_version_expiration=oss.NoncurrentVersionExpiration(
noncurrent_days=30,
),
noncurrent_version_transitions=[oss.NoncurrentVersionTransition(
noncurrent_days=10,
storage_class=oss.StorageClassType.IA,
is_access_time=False,
)],
)]
),
))
# Print the status code and request ID of the operation.
print(f'status code: {result.status_code}, ' # The HTTP status code, which indicates whether the request is successful.
f'request id: {result.request_id}') # The request ID, which is used to track request logs and for debugging.
if __name__ == "__main__":
# The program entry point that calls the main function to execute the logic.
main()
C#
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Specify the bucket name. Example: examplebucket.
var bucketName = "examplebucket";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
const string region = "cn-hangzhou";
// Create a ClientConfiguration instance and modify the default parameters based on your requirements.
var conf = new ClientConfiguration();
// Use the signature algorithm V4.
conf.SignatureVersion = SignatureVersion.V4;
// Create an OSSClient instance.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var setBucketLifecycleRequest = new SetBucketLifecycleRequest(bucketName);
// Create the first lifecycle rule.
LifecycleRule lcr1 = new LifecycleRule()
{
ID = "delete obsoleted files",
Prefix = "obsoleted/",
Status = RuleStatus.Enabled,
ExpriationDays = 3,
Tags = new Tag[1]
};
// Specify a tag for the rule.
var tag1 = new Tag
{
Key = "project",
Value = "projectone"
};
lcr1.Tags[0] = tag1;
// Create the second lifecycle rule.
LifecycleRule lcr2 = new LifecycleRule()
{
ID = "delete temporary files",
Prefix = "temporary/",
Status = RuleStatus.Enabled,
ExpriationDays = 20,
Tags = new Tag[1]
};
// Specify a tag for the rule.
var tag2 = new Tag
{
Key = "user",
Value = "jsmith"
};
lcr2.Tags[0] = tag2;
// Specify that parts expire 30 days after they are last modified.
lcr2.AbortMultipartUpload = new LifecycleRule.LifeCycleExpiration()
{
Days = 30
};
LifecycleRule lcr3 = new LifecycleRule();
lcr3.ID = "only NoncurrentVersionTransition";
lcr3.Prefix = "test1";
lcr3.Status = RuleStatus.Enabled;
lcr3.NoncurrentVersionTransitions = new LifecycleRule.LifeCycleNoncurrentVersionTransition[2]
{
// Specify that the storage classes of the previous versions of objects are converted to IA 90 days after they are last modified.
new LifecycleRule.LifeCycleNoncurrentVersionTransition(){
StorageClass = StorageClass.IA,
NoncurrentDays = 90
},
// Specify that the storage classes of the previous versions of objects are converted to Archive 180 days after they are last modified.
new LifecycleRule.LifeCycleNoncurrentVersionTransition(){
StorageClass = StorageClass.Archive,
NoncurrentDays = 180
}
};
setBucketLifecycleRequest.AddLifecycleRule(lcr1);
setBucketLifecycleRequest.AddLifecycleRule(lcr2);
setBucketLifecycleRequest.AddLifecycleRule(lcr3);
// Configure lifecycle rules.
client.SetBucketLifecycle(setBucketLifecycleRequest);
Console.WriteLine("Set bucket:{0} Lifecycle succeeded ", bucketName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
Android
PutBucketLifecycleRequest request = new PutBucketLifecycleRequest();
request.setBucketName("examplebucket");
BucketLifecycleRule rule1 = new BucketLifecycleRule();
// Set the rule ID and file prefix.
rule1.setIdentifier("1");
rule1.setPrefix("A");
// Specify whether to execute the lifecycle rule. If the value is true, OSS periodically executes the rule. If the value is false, OSS ignores the rule.
rule1.setStatus(true);
// Expire objects 200 days after the last modified time.
rule1.setDays("200");
// Transition objects to the Archive storage class after 30 days.
rule1.setArchiveDays("30");
// Expire incomplete multipart uploads after 3 days.
rule1.setMultipartDays("3");
// Transition objects to the Infrequent Access (IA) storage class after 15 days.
rule1.setIADays("15");
BucketLifecycleRule rule2 = new BucketLifecycleRule();
rule2.setIdentifier("2");
rule2.setPrefix("B");
rule2.setStatus(true);
rule2.setDays("300");
rule2.setArchiveDays("30");
rule2.setMultipartDays("3");
rule2.setIADays("15");
ArrayList<BucketLifecycleRule> lifecycleRules = new ArrayList<BucketLifecycleRule>();
lifecycleRules.add(rule1);
lifecycleRules.add(rule2);
request.setLifecycleRules(lifecycleRules);
OSSAsyncTask task = oss.asyncPutBucketLifecycle(request, new OSSCompletedCallback<PutBucketLifecycleRequest, PutBucketLifecycleResult>() {
@Override
public void onSuccess(PutBucketLifecycleRequest request, PutBucketLifecycleResult result) {
OSSLog.logInfo("code::"+result.getStatusCode());
}
@Override
public void onFailure(PutBucketLifecycleRequest request, ClientException clientException, ServiceException serviceException) {
OSSLog.logError("error: "+serviceException.getRawMessage());
}
});
task.waitUntilFinished();
C++
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize the OSS account information. */
/* Set yourEndpoint to the Endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Specify the bucket name. For example, examplebucket. */
std::string BucketName = "examplebucket";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
SetBucketLifecycleRequest request(BucketName);
std::string date("2022-10-12T00:00:00.000Z");
/* Set tags. */
Tagging tagging;
tagging.addTag(Tag("key1", "value1"));
tagging.addTag(Tag("key2", "value2"));
/* Specify a lifecycle rule. */
auto rule1 = LifecycleRule();
rule1.setID("rule1");
rule1.setPrefix("test1/");
rule1.setStatus(RuleStatus::Enabled);
rule1.setExpiration(3);
rule1.setTags(tagging.Tags());
/* Specify the expiration time. */
auto rule2 = LifecycleRule();
rule2.setID("rule2");
rule2.setPrefix("test2/");
rule2.setStatus(RuleStatus::Disabled);
rule2.setExpiration(date);
/* rule3 is a lifecycle rule for a bucket with versioning enabled. */
auto rule3 = LifecycleRule();
rule3.setID("rule3");
rule3.setPrefix("test3/");
rule3.setStatus(RuleStatus::Disabled);
/* Transition objects to the Archive storage class 365 days after they are last modified. */
auto transition = LifeCycleTransition();
transition.Expiration().setDays(365);
transition.setStorageClass(StorageClass::Archive);
rule3.addTransition(transition);
/* Automatically remove expired delete markers. */
rule3.setExpiredObjectDeleteMarker(true);
/* Transition noncurrent versions of objects to the Infrequent Access storage class 10 days after they become noncurrent. */
auto transition1 = LifeCycleTransition();
transition1.Expiration().setDays(10);
transition1.setStorageClass(StorageClass::IA);
/* Transition noncurrent versions of objects to the Archive storage class 20 days after they become noncurrent. */
auto transition2 = LifeCycleTransition();
transition2.Expiration().setDays(20);
transition2.setStorageClass(StorageClass::Archive);
/* Delete objects 30 days after they become noncurrent versions. */
auto expiration = LifeCycleExpiration(30);
rule3.setNoncurrentVersionExpiration(expiration);
LifeCycleTransitionList noncurrentVersionStorageTransitions{transition1, transition2};
rule3.setNoncurrentVersionTransitionList(noncurrentVersionStorageTransitions);
/* Set the lifecycle rules. */
LifecycleRuleList list{rule1, rule2, rule3};
request.setLifecycleRules(list);
auto outcome = client.SetBucketLifecycle(request);
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "SetBucketLifecycle fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
C
#include "oss_api.h"
#include "aos_http_io.h"
/* Replace yourEndpoint with the Endpoint of the region where your bucket is located. For example, for the China (Hangzhou) region, the Endpoint is https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Replace with your bucket name. For example, examplebucket. */
const char *bucket_name = "examplebucket";
/* Replace yourRegion with the ID of the region where your bucket is located. For example, for the China (Hangzhou) region, the region ID is cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Initialize an aos_string_t variable with a char* string. */
aos_str_set(&options->config->endpoint, endpoint);
/* Obtain access credentials from environment variables. Before you run this sample code, make sure the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// You must also configure the following two parameters.
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* Specify whether to use a CNAME to access OSS. A value of 0 means that a CNAME is not used. */
options->config->is_cname = 0;
/* Set network parameters, such as the timeout period. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Call the aos_http_io_initialize method at the program entry point to initialize global resources, such as the network and memory. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* The memory pool (pool) for memory management is equivalent to apr_pool_t. The implementation is in the apr library. */
aos_pool_t *pool;
/* Create a memory pool. The second parameter is NULL, which indicates that the new memory pool does not inherit from another memory pool. */
aos_pool_create(&pool, NULL);
/* Create and initialize options. This parameter includes global configurations, such as endpoint, access_key_id, access_key_secret, is_cname, and curl. */
oss_request_options_t *oss_client_options;
/* Allocate memory for options in the memory pool. */
oss_client_options = oss_request_options_create(pool);
/* Initialize the client options, oss_client_options. */
init_options(oss_client_options);
/* Initialize parameters. */
aos_string_t bucket;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_list_t lifecycle_rule_list;
aos_str_set(&bucket, bucket_name);
aos_list_init(&lifecycle_rule_list);
/* Specify the expiration in days. */
oss_lifecycle_rule_content_t *rule_content_days = oss_create_lifecycle_rule_content(pool);
aos_str_set(&rule_content_days->id, "rule-1");
/* Set the object prefix. */
aos_str_set(&rule_content_days->prefix, "dir1");
aos_str_set(&rule_content_days->status, "Enabled");
rule_content_days->days = 3;
aos_list_add_tail(&rule_content_days->node, &lifecycle_rule_list);
/* Specify the expiration date. */
oss_lifecycle_rule_content_t *rule_content_date = oss_create_lifecycle_rule_content(pool);
aos_str_set(&rule_content_date->id, "rule-2");
aos_str_set(&rule_content_date->prefix, "dir2");
aos_str_set(&rule_content_date->status, "Enabled");
/* The expiration date must be in UTC format.
aos_str_set(&rule_content_date->date, "2023-10-11T00:00:00.000Z");
aos_list_add_tail(&rule_content_date->node, &lifecycle_rule_list);
/* Set the lifecycle rule. */
resp_status = oss_put_bucket_lifecycle(oss_client_options, &bucket, &lifecycle_rule_list, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("put bucket lifecycle succeeded\n");
} else {
printf("put bucket lifecycle failed, code:%d, error_code:%s, error_msg:%s, request_id:%s\n",
resp_status->code, resp_status->error_code, resp_status->error_msg, resp_status->req_id);
}
/* Release the memory pool. This releases the memory allocated to resources during the request. */
aos_pool_destroy(pool);
/* Release the previously allocated global resources. */
aos_http_io_deinitialize();
return 0;
}
Ruby
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# The China (Hangzhou) Endpoint is used as an example. Replace it with the actual Endpoint.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Specify the bucket name.
bucket = client.get_bucket('examplebucket')
# Set the lifecycle rules.
bucket.lifecycle = [
Aliyun::OSS::LifeCycleRule.new(
:id => 'rule1', :enable => true, :prefix => 'foo/', :expiry => 3),
Aliyun::OSS::LifeCycleRule.new(
:id => 'rule2', :enable => false, :prefix => 'bar/', :expiry => Date.new(2016, 1, 1))
]
Go
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 expires current versions 10 days after they are last modified, 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)),
},
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)
}
ossutil
Configurez les règles de cycle de vie avec ossutil (Installez ossutil).
L'exemple suivant définit une règle de cycle de vie pour le compartiment examplebucket.
ossutil api put-bucket-lifecycle --bucket examplebucket --lifecycle-configuration "{\"Rule\":{\"ID\":\"rule1\",\"Prefix\":\"tmp/\",\"Status\":\"Enabled\",\"Expiration\":{\"Days\":\"10\"},\"Transition\":{\"Days\":\"5\",\"StorageClass\":\"IA\"},\"AbortMultipartUpload\":{\"Days\":\"10\"}}}"
API associée
Pour configurer les règles de cycle de vie via l'API REST (nécessite le calcul de signature), utilisez PutBucketLifecycle.
FAQ
Comment supprimer rapidement tous les objets d'un compartiment à l'aide de stratégies de cycle de vie
Compartiments sans versioning
Accédez à la page Buckets de la console OSS et cliquez sur le nom du compartiment.
-
Dans le volet de navigation de gauche, choisissez et vérifiez si le versioning est activé.

-
Dans le volet de navigation de gauche, choisissez . Configurez une règle de cycle de vie pour supprimer automatiquement tous les objets du compartiment un jour après leur dernière modification, et pour supprimer les parties générées il y a plus d'un jour.

Compartiments avec versioning
Vous pouvez configurer une règle de cycle de vie pour supprimer automatiquement tous les objets et les parties issues des tâches de téléchargement en plusieurs parties incomplètes dans les compartiments sans versioning.
Accédez à la page Buckets de la console OSS et cliquez sur le nom du compartiment.
-
Dans le volet de navigation de gauche, choisissez et vérifiez si le versioning est activé.

-
Dans le volet de navigation de gauche, choisissez . Configurez une règle de cycle de vie pour supprimer automatiquement tous les objets du compartiment un jour après leur dernière modification, et pour supprimer les parties générées il y a plus d'un jour.

Erreur : Set bucket lifecycle error, InvalidArgument, Days in the Transition action for StorageClass Archive must be more than the Transition action for StorageClass IA
Les périodes de transition sont ordonnées incorrectement. Elles doivent suivre l'ordre suivant : Infrequent Access < Archive < Cold Archive < Deep Cold Archive.
Règles de cycle de vie et objets existants
Les règles de cycle de vie s'appliquent aux objets existants ainsi qu'aux nouveaux objets téléversés. Par exemple, si vous configurez une règle le 7 octobre pour supprimer les objets après 30 jours, un objet téléversé le 5 octobre sera supprimé le 5 novembre, tandis qu'un objet téléversé le 8 octobre sera supprimé le 8 novembre.
Modifier les règles de cycle de vie
Pour modifier une règle de cycle de vie spécifique (par exemple, Rule1) lorsque plusieurs règles existent :
Appelez l'opération GetBucketLifecycle pour récupérer toutes les règles de cycle de vie actuelles du compartiment.
Modifiez les paramètres de Rule1.
Appelez l'opération PutBucketLifecycle pour remplacer la configuration existante en soumettant à la fois la Rule1 modifiée et la Rule2 d'origine.
Supprimer les règles de cycle de vie
DeleteBucketLifecycle supprime toutes les règles de cycle de vie d'un compartiment. Pour supprimer une seule règle (par exemple, Rule1) tout en conservant les autres (par exemple, Rule2), remplacez l'intégralité de la configuration :
Appelez l'opération GetBucketLifecycle pour récupérer toutes les règles de cycle de vie actuelles du compartiment.
Supprimez Rule1.
Appelez l'opération PutBucketLifecycle pour remplacer la configuration existante en ne soumettant que Rule2.
Journalisation des opérations de cycle de vie
Oui. Toutes les transitions et expirations réussies déclenchées par les règles de cycle de vie sont journalisées. Champs de journal pertinents :
-
Operation
CommitTransition : Indique une transition de classe de stockage.
ExpireObject : Indique la suppression d'un objet expiré.
-
Sync Request
lifecycle : La transition ou la suppression a été déclenchée par une règle de cycle de vie.
Champs de journal décrit le schéma complet. Règles de facturation couvre les coûts de requête de journal.
Nettoyer les marqueurs de suppression et les versions actuelles
Oui. Une seule règle de cycle de vie peut faire expirer les versions actuelles des objets et nettoyer les marqueurs de suppression expirés.
Transition d'Infrequent Access vers Standard
Non. Utilisez l'une des méthodes suivantes pour faire passer les objets d'Infrequent Access à Standard :
-
Utilisation de l'opération CopyObject
Appelez CopyObject pour faire passer un objet d'Infrequent Access à Standard.
-
Utilisation de l'outil ossutil
Utilisez la commande ossutil set-meta avec l'option X-Oss-Storage-Class pour faire passer les objets d'Infrequent Access à Standard. Définir ou mettre à jour les métadonnées.
OSS stocke-t-il les objets téléversés en tant que Standard, ou la règle de cycle de vie les fait-elle passer directement vers une classe de stockage moins coûteuse ?
Les objets sont stockés dans la classe de stockage Standard par défaut lors de leur téléversement, indépendamment de la configuration d'une règle de cycle de vie. La règle de cycle de vie s'exécute de manière asynchrone en arrière-plan et fait passer les objets répondant aux conditions spécifiées vers la classe de stockage cible chaque jour à 08:00:00 (UTC+8). La règle ne prend pas effet au moment du téléversement.
Pour spécifier une classe de stockage au moment du téléversement, définissez l'en-tête de requête x-oss-storage-class. Par exemple, pour téléverser un objet directement en tant que stockage Infrequent Access (IA) à l'aide d'ossutil :
ossutil cp test.txt oss://bucket/ --meta x-oss-storage-class:IA
Documents connexes
Par défaut, OSS utilise l'heure de téléversement d'un objet comme heure
LastModified. Les transitions de cycle de vie ne mettent pas à jourLastModified. Quelles sont les opérations qui affectent l'attribut LastModified des objets OSS ?Si vous faites la transition ou supprimez un objet
Infrequent Access,Archive,Cold ArchiveouDeep Cold Archiveavant sa durée de stockage minimale, des frais de suppression anticipée s'appliquent. Comment suis-je facturé pour les objets dont la durée de stockage est inférieure à la durée de stockage minimale ?Les règles de cycle de vie prennent en charge les transitions ou suppressions par lot uniquement pour un compartiment entier ou pour les objets correspondant à un préfixe. Pour supprimer par lot des objets avec un suffixe spécifique, utilisez la commande ossutil rm.
Pour qu'OSS surveille automatiquement les modèles d'accès et fasse passer les objets froids, configurez des règles de cycle de vie basées sur la dernière date d'accès.
Pour afficher la classe de stockage de tous les objets d'un compartiment, utilisez Lister les objets.