Todos os produtos
Search
Central de documentação

Object Storage Service:Política de retenção no nível do bucket (BucketWorm)

Última atualização: Oct 09, 2026

O BucketWorm aplica o modelo Write Once, Read Many (WORM) a um bucket do OSS, tornando todos os objetos imutáveis por um período de retenção especificado. Durante esse período, os objetos podem ser enviados e lidos, mas não modificados ou excluídos por nenhum usuário, incluindo o proprietário do bucket.

Casos de uso

As políticas de retenção do OSS ajudam a atender aos requisitos regulatórios de entidades como a SEC e a FINRA. Os casos de uso típicos incluem arquivamento de conformidade e auditorias de dados de registro em finanças, seguros, saúde e valores mobiliários.

Nota

O OSS é acreditado pela Cohasset Associates e atende aos requisitos de retenção de registros eletrônicos, incluindo a Regra 17a-4(f) da SEC, a Regra 4511 da FINRA e a Regra 1.31 da Commodity Futures Trading Commission (CFTC). Relatório de avaliação do OSS da Cohasset.

Pré-requisitos

O controle de versão deve estar ativado ou desativado para o bucket, não suspenso. Controle de versão.

Notas de uso

  • Você não pode ativar o OSS-HDFS e configurar uma política de retenção no nível do bucket para o mesmo bucket.

  • Durante o período de retenção, você pode configurar uma regra de ciclo de vida para transicionar objetos para uma classe de armazenamento diferente, reduzindo os custos de armazenamento e mantendo a conformidade.

  • Uma política de retenção no nível do bucket (BucketWorm) e uma política de retenção no nível do objeto (ObjectWorm) são mutuamente exclusivas. Você não pode ativar ambas para o mesmo bucket.

Como funciona

  • Regra de ativação

    Quando criada, uma política de retenção entra no estado InProgress por 24 horas. Os recursos do bucket são protegidos durante esse período.

    • Dentro de 24 horas após a criação

      • Se não estiver bloqueada, o proprietário do bucket e os usuários autorizados podem excluir a política.

      • Depois de bloqueada, a política não pode ser excluída ou reduzida, apenas estendida. Tentativas de excluir ou modificar dados protegidos retornam 409 FileImmutable.

    • Após 24 horas

      Se não for bloqueada dentro de 24 horas, a política expira e pode ser excluída.

  • Regra de exclusão

    • Uma política de retenção é um atributo de metadados do bucket. A exclusão do bucket também exclui sua política.

    • Se não estiver bloqueada dentro de 24 horas após a criação, o proprietário do bucket e os usuários autorizados podem excluir a política.

    • Você não pode excluir a política ou o bucket enquanto houver objetos dentro do período de retenção.

  • Exemplo

    Suponha que você crie e bloqueie uma política de retenção de 30 dias em 1º de junho de 2022 e envie três objetos em momentos diferentes:

    Nome do objeto

    Hora do envio

    Hora da expiração

    file1.txt

    1º de abril de 2022

    30 de abril de 2022

    file2.txt

    1º de junho de 2022

    30 de junho de 2022

    file3.txt

    1º de setembro de 2022

    30 de setembro de 2022

Procedimento

Console do OSS

  1. Crie uma política de retenção.

    1. Faça logon no console do OSS.

    2. No painel de navegação à esquerda, clique em Buckets. Na página Buckets, clique no nome do bucket de destino.

    3. No painel de navegação à esquerda, escolha Content Security > Bucket-level Retention Policy.

    4. Na página Retention Policy, clique em Create Policy.

    5. Na caixa de diálogo Create Policy, especifique o Retention Period.

      Nota

      O período de retenção é medido em dias. Valores válidos: 1 a 25.550.

    6. Clique em OK.

      Nota

      A política entra no estado InProgress por 24 horas, durante as quais os recursos do bucket são protegidos. Você pode excluir a política dentro dessa janela.

  2. Bloqueie a política de retenção.

    1. Clique em Lock.

    2. Na caixa de diálogo exibida, clique em OK.

      Importante

      Depois de bloqueada, a política não pode ser modificada ou excluída, e os dados no bucket são imutáveis durante o período de retenção.

  3. (Opcional) Modifique o período de retenção.

    1. Clique em Edit.

    2. Na caixa de diálogo exibida, modifique o período de retenção.

      Importante

      Você só pode estender o período de retenção, não reduzi-lo.

SDKs do OSS

O código de exemplo a seguir mostra como configurar políticas de retenção usando os SDKs do OSS para linguagens de programação comuns. Para obter mais informações sobre código de exemplo para outras linguagens de programação, consulte Introdução.

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

Você pode criar uma política WORM com o ossutil. Para configurar a ferramenta, siga Instalar o ossutil.

O comando a seguir cria uma política WORM em examplebucket com um período de retenção de 365 dias.

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

Referência do comando: initiate-bucket-worm.

Referência da API

Para personalização avançada, chame a API REST diretamente. Isso requer cálculo manual de assinatura. InitiateBucketWorm.

Trabalhando com controle de versão

Para permitir atualizações contínuas de dados enquanto mantém todas as versões históricas imutáveis — comum em proteção de backup, rastreamento de ativos e conformidade financeira — ative o controle de versão e uma política de retenção no mesmo bucket. O controle de versão preserva versões antigas quando os objetos são sobrescritos ou excluídos; a política de retenção impede que qualquer versão seja modificada ou excluída durante o período de retenção.

Quando ambos os recursos estão ativados:

  • Ordem de ativação: Nenhuma restrição de ordem. Ative o controle de versão e as políticas de retenção em qualquer ordem.

  • Restrições de transição de estado:

    • Depois que uma política de retenção é ativada, você não pode alterar o estado de controle de versão de ativado para suspenso.

    • Você pode ativar uma política de retenção para um bucket cujo controle de versão está suspenso. Depois que a política é ativada, você pode alterar o estado de controle de versão para ativado.

  • Proteção de versão de objeto:

    • Uma política de retenção protege todas as versões de um objeto. Nenhuma versão pode ser excluída ou modificada durante o período de retenção.

    • Você pode enviar um objeto com o mesmo nome para criar uma nova versão. A nova versão também é protegida pela política de retenção.

    • Uma política de retenção não protege um marcador de exclusão, portanto, sua exclusão não é restrita pela política.

  • Sinergia de replicação de dados:

    • Os buckets de origem e destino suportam configurações independentes para controle de versão e políticas de retenção.

    • As informações de versão são transmitidas normalmente durante a replicação. O bucket de destino gerencia versões com base em sua própria configuração.

    • A exclusão de uma versão no bucket de origem não é sincronizada com um bucket de destino que tenha uma política de retenção ativada.

Perguntas frequentes

Exclusão de objetos com controle de versão

Quando uma política de retenção e o controle de versão estão ambos ativados, a exclusão de um objeto tem os seguintes efeitos:

  • A operação de exclusão cria um marcador de exclusão, mas não exclui fisicamente as versões históricas do objeto.

  • Uma política de retenção não protege marcadores de exclusão, que podem ser excluídos normalmente.

  • Todas as versões de objeto não podem ser excluídas durante o período de retenção, mesmo que exista um marcador de exclusão.

  • O gerenciamento de ciclo de vida pode limpar marcadores de exclusão órfãos, mas não pode excluir versões de objeto protegidas por uma política de retenção.

Modificar o estado de controle de versão

Depois que uma política de retenção é ativada, as seguintes restrições se aplicam à modificação do estado de controle de versão:

  • Ativado para suspenso: Se o estado de controle de versão estiver ativado, você não pode alterá-lo para suspenso depois que a política de retenção for bloqueada.

  • Suspenso para ativado: Se o estado de controle de versão estiver suspenso, você ainda pode alterá-lo para ativado depois de ativar a política de retenção.

  • Desativado para ativado: Para um bucket com controle de versão desativado, você pode ativar o controle de versão depois de configurar uma política de retenção.

Custos de armazenamento

Sim, das seguintes formas:

  • Todas as versões de objeto são retidas durante o período de retenção e não podem ser excluídas por uma regra de ciclo de vida.

  • O acúmulo de versões pode aumentar significativamente o uso de armazenamento, especialmente para objetos atualizados com frequência.

  • Defina um período de retenção razoável e use regras de ciclo de vida para transicionar classes de armazenamento e reduzir custos.

Benefícios de uma política de retenção

Uma política de retenção fornece imutabilidade de nível de conformidade. Os dados protegidos apenas por uma política do RAM ou Bucket Policy ainda podem ser modificados ou excluídos.

Quando usar uma política de retenção

Ative uma política de retenção para dados que devem permanecer inalterados a longo prazo, como registros médicos, documentos técnicos ou contratos.

Excluir uma política de retenção

Se você pode excluir uma política de retenção depende de seu estado:

  • Não bloqueada: O proprietário do bucket e os usuários autorizados podem excluir a política.

  • Bloqueada: Nenhum usuário pode excluir a política.

Política no nível do objeto

O BucketWorm se aplica a buckets inteiros, não a diretórios ou objetos individuais. Para definir retenção em um único objeto, use uma política de retenção no nível do objeto (ObjectWorm). O BucketWorm e o ObjectWorm são mutuamente exclusivos no mesmo bucket.

Calcular o tempo de retenção

Tempo de retenção = hora da última modificação + período de retenção. Por exemplo, com uma política de 10 dias, um objeto modificado pela última vez em 15 de fevereiro de 2022 é retido até 25 de fevereiro de 2022.

Excluir um bucket protegido

  • Se o bucket não contiver objetos, você pode excluí-lo diretamente.

  • Se o bucket contiver objetos cujos períodos de retenção expiraram, você deve excluir todos os objetos antes de excluir o bucket.

  • Se o bucket contiver objetos que ainda estejam dentro do período de retenção, você não pode excluir o bucket.

Pagamentos em atraso e retenção de dados

Importante: Um pagamento em atraso pode fazer com que o Alibaba Cloud exclua dados conforme as regras de suspensão de serviço, mesmo para objetos protegidos por uma política de retenção.

Autorização de usuário do RAM

Sim. O gerenciamento de política de retenção suporta autorização do RAM. Usuários autorizados do RAM podem gerenciar políticas por meio do console do OSS, APIs ou SDKs.