Tous les produits
Search
Centre de documentation

Object Storage Service:Politique de conservation au niveau du compartiment (BucketWorm)

Dernière mise à jour :Oct 09, 2026

BucketWorm applique un modèle Write Once, Read Many (WORM) à un compartiment OSS, rendant tous les objets immuables pendant une période de conservation spécifiée. Durant cette période, les objets peuvent être chargés et lus, mais aucun utilisateur, y compris le propriétaire du compartiment, ne peut les modifier ni les supprimer.

Cas d'utilisation

Les politiques de conservation OSS aident à satisfaire aux exigences réglementaires d'organismes tels que la SEC et la FINRA. Les cas d'utilisation typiques incluent l'archivage de conformité et les audits de données de journalisation dans les secteurs de la finance, de l'assurance, de la santé et des valeurs mobilières.

Remarque

OSS est accrédité par Cohasset Associates et répond aux exigences de conservation des dossiers électroniques, notamment la règle 17a-4(f) de la SEC, la règle 4511 de la FINRA et la règle 1,31 de la Commodity Futures Trading Commission (CFTC). Rapport d'évaluation Cohasset pour OSS.

Prérequis

Le versioning doit être activé ou désactivé pour le compartiment, et non suspendu. Versioning.

Notes d'utilisation

  • Vous ne pouvez pas activer OSS-HDFS et configurer une politique de conservation au niveau du compartiment pour le même compartiment.

  • Pendant la période de conservation, vous pouvez configurer une règle de cycle de vie pour faire passer les objets vers une classe de stockage différente, réduisant ainsi les coûts de stockage tout en maintenant la conformité.

  • Une politique de conservation au niveau du compartiment (BucketWorm) et une politique de conservation au niveau de l'objet (ObjectWorm) s'excluent mutuellement. Vous ne pouvez pas activer les deux pour le même compartiment.

Fonctionnement

  • Règle d'activation

    Lors de sa création, une politique de conservation entre dans l'état InProgress pendant 24 heures. Les ressources du compartiment sont protégées durant cette période.

    • Dans les 24 heures suivant la création

      • Si elle n'est pas verrouillée, le propriétaire du compartiment et les utilisateurs autorisés peuvent supprimer la politique.

      • Une fois verrouillée, la politique ne peut plus être supprimée ni raccourcie ; seule une extension est possible. Toute tentative de suppression ou de modification des données protégées renvoie l'erreur 409 FileImmutable.

    • Après 24 heures

      Si elle n'est pas verrouillée dans les 24 heures, la politique expire et peut être supprimée.

  • Règle de suppression

    • Une politique de conservation est un attribut des métadonnées du compartiment. La suppression du compartiment entraîne également la suppression de sa politique.

    • Si elle n'est pas verrouillée dans les 24 heures suivant sa création, le propriétaire du compartiment et les utilisateurs autorisés peuvent supprimer la politique.

    • Vous ne pouvez pas supprimer la politique ou le compartiment tant que des objets se trouvent encore dans leur période de conservation.

  • Exemple

    Supposons que vous créiez et verrouilliez une politique de conservation de 30 jours le 1er juin 2022, et que vous chargiez trois objets à différents moments :

    Nom de l'objet

    Heure de chargement

    Heure d'expiration

    file1.txt

    1er avril 2022

    30 avril 2022

    file2.txt

    1er juin 2022

    30 juin 2022

    file3.txt

    1er septembre 2022

    30 septembre 2022

Procédure

Console OSS

  1. Créez une politique de conservation.

    1. Connectez-vous à la console OSS.

    2. Dans le volet de navigation de gauche, cliquez sur Buckets. Sur la page Buckets, cliquez sur le nom du compartiment cible.

    3. Dans le volet de navigation de gauche, choisissez Content Security > Bucket-level Retention Policy.

    4. Sur la page Retention Policy, cliquez sur Create Policy.

    5. Dans la boîte de dialogue Create Policy, spécifiez la Retention Period.

      Remarque

      La période de conservation est mesurée en jours. Valeurs valides : 1 à 25 550.

    6. Cliquez sur OK.

      Remarque

      La politique entre dans l'état InProgress pendant 24 heures, durant lesquelles les ressources du compartiment sont protégées. Vous pouvez supprimer la politique durant cette fenêtre.

  2. Verrouillez la politique de conservation.

    1. Cliquez sur Lock.

    2. Dans la boîte de dialogue qui s'affiche, cliquez sur OK.

      Important

      Une fois verrouillée, la politique ne peut plus être modifiée ni supprimée, et les données du compartiment deviennent immuables pendant la période de conservation.

  3. (Facultatif) Modifiez la période de conservation.

    1. Cliquez sur Edit.

    2. Dans la boîte de dialogue qui s'affiche, modifiez la période de conservation.

      Important

      Vous ne pouvez qu'étendre la période de conservation, pas la raccourcir.

Kits SDK OSS

L'exemple de code suivant montre comment configurer des politiques de conservation à l'aide des kits SDK OSS pour les langages de programmation courants. Pour plus d'informations sur les exemples de code pour d'autres langages, consultez Introduction.

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.InitiateBucketWormRequest;
import com.aliyun.oss.model.InitiateBucketWormResult;

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 an InitiateBucketWormRequest object. 
            InitiateBucketWormRequest initiateBucketWormRequest = new InitiateBucketWormRequest(bucketName);
            // Set the retention period to 1 day. 
            initiateBucketWormRequest.setRetentionPeriodInDays(1);

            // Create a retention policy. 
            InitiateBucketWormResult initiateBucketWormResult = ossClient.initiateBucketWorm(initiateBucketWormRequest);

            // Display the ID of the retention policy. 
            String wormId = initiateBucketWormResult.getWormId();
            System.out.println(wormId);
        } 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

// Import the autoloader file to load dependencies.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Define command line argument descriptions.
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located', 'required' => True], // Required. The region where the bucket is located.
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS', 'required' => False], // Optional. The domain name that other services can use to access OSS.
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // Required. The name of the bucket.
];

// Generate a long options list to parse command line arguments.
$longopts = \array_map(function ($key) {
    return "$key:"; // Add a colon after each argument to indicate that a value is required.
}, array_keys($optsdesc));

// Parse the command line arguments.
$options = getopt("", $longopts); 

// Check if any required arguments 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"; // Prompt the user that a required argument is missing.
        exit(1); 
    }
}

// Get the command line argument values.
$region = $options["region"]; // The region where the bucket is located.
$bucket = $options["bucket"]; // The name of the bucket.

// Load credential information, such as AccessKey ID and AccessKey secret, from environment variables.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Use the default configurations of the software development kit (SDK).
$cfg = Oss\Config::loadDefault();

// Set the credential provider.
$cfg->setCredentialsProvider($credentialsProvider);

// Set the region.
$cfg->setRegion($region);

// If an endpoint is provided, set the endpoint.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// Create an OSS client instance.
$client = new Oss\Client($cfg);

// Create a request object to initialize the retention policy for the bucket. Set the retention period to 3 days.
$request = new Oss\Models\InitiateBucketWormRequest(
    bucket: $bucket, 
    initiateWormConfiguration: new Oss\Models\InitiateWormConfiguration(
        retentionPeriodInDays: 3 // The retention period in days.
));

// Call the initiateBucketWorm method to initialize the retention policy for the bucket.
$result = $client->initiateBucketWorm($request);

// Print the returned result.
printf(
    'status code:' . $result->statusCode . PHP_EOL . // The HTTP response status code.
    'request id:' . $result->requestId . PHP_EOL . // The unique ID of the request.
    'worm id:' . $result->wormId // The ID of the retention policy.
);

Node.js

const OSS = require('ali-oss');

const client = new OSS({
  // Set region to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set region to oss-cn-hangzhou.
  region: 'yourregion',
  // 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.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,  
  authorizationV4: true,
  // Set bucket to your bucket name.
  bucket: 'yourBucketName',
});
// Create a data retention policy.
async function initiateBucketWorm() {
 // Set bucket to your bucket name.
  const bucket = 'yourbucketname'
  // Specify the retention period in days.
  const days = '<Retention Days>'
    const res = await client.initiateBucketWorm(bucket, days)
  console.log(res.wormId)
}

initiateBucketWorm()

Python

import argparse
import alibabacloud_oss_v2 as oss

# Create a command-line argument parser and describe the script's purpose: This sample shows how to initialize the WORM configuration for an OSS bucket.
parser = argparse.ArgumentParser(description="initiate bucket worm sample")

# Add the --region command-line argument, which specifies the bucket region. 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 bucket name. 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')
# Add the --retention_period_in_days command-line argument, which specifies the retention period in days. This argument is required.
parser.add_argument('--retention_period_in_days', help='The number of days for which objects can be retained.', required=True)

def main():
    # Parse the command-line arguments to get the user-provided values.
    args = parser.parse_args()

    # Load the access credentials for OSS from environment variables for identity verification.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Create a configuration object using the SDK's default configurations and set the credentials provider.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # If a custom endpoint is provided, update the endpoint property in the configuration object.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Initialize the OSS client with the configuration to interact with OSS.
    client = oss.Client(cfg)

    # Send a request to initialize the WORM configuration for the specified bucket.
    result = client.initiate_bucket_worm(oss.InitiateBucketWormRequest(
        bucket=args.bucket,  # Bucket name.
        initiate_worm_configuration=oss.InitiateWormConfiguration(
            retention_period_in_days=int(args.retention_period_in_days),  # Retention period in days, converted to an integer.
        ),
    ))

    # Print the status code, request ID, and WORM ID of the operation to confirm the request status.
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' worm id: {result.worm_id}'
    )

# When this script is run directly, call the main function to start the processing logic.
if __name__ == "__main__":
    main()  # Script entry point, where the program flow starts.

Go

package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error creating credentials provider: %v", err)
	}

	// Create an OSSClient instance.
	// Set yourEndpoint to the Endpoint of the bucket. For example, for the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, use the actual Endpoint.
	// Set yourRegion to the region where the bucket is located. For example, for the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, use the actual region.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Set the signature version.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error creating OSS client: %v", err)
	}

	// Specify the name of the bucket for which you want to configure a retention policy.
	bucketName := "<yourBucketName>"

	// Set the retention period for objects to 60 days.
	result, err := client.InitiateBucketWorm(bucketName, 60)
	if err != nil {
		log.Fatalf("Error initiating bucket WORM: %v", err)
	}

	log.Println("WORM policy initiated successfully:", result)
}

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* Initialize the OSS account information. */
            
    /* Set Endpoint to the endpoint of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Set Region to the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set Region to cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Enter the bucket name. For example, examplebucket. */
    std::string BucketName = "examplebucket";

      /* Initialize resources such as the network. */
      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);
  
      /* Create a data retention policy and set the object protection period to 1 day. */
      auto outcome = client.InitiateBucketWorm(InitiateBucketWormRequest(BucketName, 1));

      if (outcome.isSuccess()) {      
            std::cout << " InitiateBucketWorm success " << std::endl;
            std::cout << "WormId:" << outcome.result().WormId() << std::endl;
      }
      else {
        /* Handle the exception. */
        std::cout << "InitiateBucketWorm fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
      }

      /* Release resources such as the network. */
      ShutdownSdk();
      return 0;
}

ossutil

Vous pouvez créer une politique WORM avec ossutil. Pour configurer l'outil, suivez les instructions de la rubrique Installation d'ossutil.

La commande suivante crée une politique WORM dans examplebucket avec une période de conservation de 365 jours.

ossutil api initiate-bucket-worm --bucket examplebucket --initiate-worm-configuration "{\"RetentionPeriodInDays\":\"365\"}"

Référence de la commande : initiate-bucket-worm.

Référence API

Pour une personnalisation avancée, appelez directement l'API REST. Cela nécessite un calcul manuel de la signature. InitiateBucketWorm.

Utilisation avec le versioning

Pour permettre des mises à jour continues des données tout en conservant toutes les versions historiques immuables — pratique courante dans la protection des sauvegardes, le suivi des actifs et la conformité financière — activez à la fois le versioning et une politique de conservation sur le même compartiment. Le versioning préserve les anciennes versions lorsque les objets sont écrasés ou supprimés ; la politique de conservation empêche toute modification ou suppression de version pendant la période de conservation.

Lorsque les deux fonctionnalités sont activées :

  • Ordre d'activation : Aucune contrainte d'ordre. Activez le versioning et les politiques de conservation dans n'importe quel ordre.

  • Contraintes de transition d'état :

    • Après l'activation d'une politique de conservation, vous ne pouvez pas modifier l'état du versioning de « activé » à « suspendu ».

    • Vous pouvez activer une politique de conservation pour un compartiment dont le versioning est suspendu. Après l'activation de la politique, vous pouvez modifier l'état du versioning pour le passer à « activé ».

  • Protection des versions d'objets :

    • Une politique de conservation protège toutes les versions d'un objet. Aucune version ne peut être supprimée ou modifiée pendant la période de conservation.

    • Vous pouvez charger un objet portant le même nom pour créer une nouvelle version. La nouvelle version est également protégée par la politique de conservation.

    • Une politique de conservation ne protège pas un marqueur de suppression, de sorte que sa suppression n'est pas restreinte par la politique.

  • Synergie avec la réplication des données :

    • Les compartiments source et destination prennent en charge des configurations indépendantes pour le versioning et les politiques de conservation.

    • Les informations de version sont transmises normalement lors de la réplication. Le compartiment de destination gère les versions en fonction de sa propre configuration.

    • La suppression d'une version dans le compartiment source n'est pas synchronisée avec un compartiment de destination ayant une politique de conservation activée.

FAQ

Suppression d'objets avec versioning

Lorsqu'une politique de conservation et le versioning sont tous deux activés, la suppression d'un objet a les effets suivants :

  • L'opération de suppression crée un marqueur de suppression mais ne supprime pas physiquement les versions historiques de l'objet.

  • Une politique de conservation ne protège pas les marqueurs de suppression, qui peuvent être supprimés normalement.

  • Aucune version d'objet ne peut être supprimée pendant la période de conservation, même si un marqueur de suppression existe.

  • La gestion du cycle de vie peut nettoyer les marqueurs de suppression orphelins, mais ne peut pas supprimer les versions d'objets protégées par une politique de conservation.

Modification de l'état du versioning

Après l'activation d'une politique de conservation, les contraintes suivantes s'appliquent à la modification de l'état du versioning :

  • Activé vers suspendu : Si l'état du versioning est activé, vous ne pouvez pas le passer à « suspendu » après le verrouillage de la politique de conservation.

  • Suspendu vers activé : Si l'état du versioning est suspendu, vous pouvez toujours le passer à « activé » après avoir activé la politique de conservation.

  • Désactivé vers activé : Pour un compartiment dont le versioning est désactivé, vous pouvez activer le versioning après avoir configuré une politique de conservation.

Coûts de stockage

Oui, de la manière suivante :

  • Toutes les versions d'objets sont conservées pendant la période de conservation et ne peuvent pas être supprimées par une règle de cycle de vie.

  • L'accumulation de versions peut augmenter considérablement l'utilisation du stockage, en particulier pour les objets fréquemment mis à jour.

  • Définissez une période de conservation raisonnable et utilisez des règles de cycle de vie pour faire évoluer les classes de stockage et réduire les coûts.

Avantages d'une politique de conservation

Une politique de conservation offre une immuabilité de niveau conformité. Les données protégées uniquement par une politique RAM ou une Bucket Policy peuvent toujours être modifiées ou supprimées.

Quand utiliser une politique de conservation

Activez une politique de conservation pour les données qui doivent rester inchangées à long terme, telles que les dossiers médicaux, les documents techniques ou les contrats.

Suppression d'une politique de conservation

La possibilité de supprimer une politique de conservation dépend de son état :

  • Non verrouillée : Le propriétaire du compartiment et les utilisateurs autorisés peuvent supprimer la politique.

  • Verrouillée : Aucun utilisateur ne peut supprimer la politique.

Politique au niveau de l'objet

BucketWorm s'applique à des compartiments entiers, et non à des répertoires ou à des objets individuels. Pour définir une conservation sur un seul objet, utilisez une politique de conservation au niveau de l'objet (ObjectWorm). BucketWorm et ObjectWorm s'excluent mutuellement sur le même compartiment.

Calcul du temps de conservation

Temps de conservation = heure de la dernière modification + période de conservation. Par exemple, avec une politique de 10 jours, un objet modifié pour la dernière fois le 15 février 2022 est conservé jusqu'au 25 février 2022.

Suppression d'un compartiment protégé

  • Si le compartiment ne contient aucun objet, vous pouvez le supprimer directement.

  • Si le compartiment contient des objets dont les périodes de conservation ont expiré, vous devez supprimer tous les objets avant de supprimer le compartiment.

  • Si le compartiment contient des objets qui sont encore dans leur période de conservation, vous ne pouvez pas supprimer le compartiment.

Paiements en retard et conservation des données

Important : Un paiement en retard peut amener Alibaba Cloud à supprimer des données conformément aux règles de suspension de service, même pour les objets protégés par une politique de conservation.

Autorisation des utilisateurs RAM

Oui. La gestion des politiques de conservation prend en charge l'autorisation RAM. Les utilisateurs RAM autorisés peuvent gérer les politiques via la console OSS, les API ou les SDK.