Todos os produtos
Search
Central de documentação

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

Última atualização: Jul 03, 2026

A política de retenção no nível do objeto (ObjectWorm) oferece retenção de conformidade WORM (Write Once, Read Many) no nível do objeto. Diferentemente da política de retenção no nível do bucket (BucketWorm), que protege uniformemente todos os objetos em um bucket, o ObjectWorm permite definir um modo de retenção e uma data limite exclusiva para cada objeto. Isso atende a requisitos granulares de conformidade em setores como finanças e saúde.

Importante

Este recurso está disponível atualmente apenas mediante convite. Para solicitar acesso, entre em contato com o suporte técnico.

Visão geral

Ao ativar o ObjectWorm para um bucket, novos objetos herdam automaticamente uma política de retenção padrão. Você também pode definir uma política separada para objetos existentes individuais. A política no nível do objeto tem precedência sobre o padrão do bucket.

Atualmente, há suporte apenas ao modo de conformidade. Nesse modo, nenhum usuário (incluindo o usuário root) pode excluir ou sobrescrever uma versão protegida do objeto durante seu período de retenção. A data limite de retenção só pode ser estendida, nunca reduzida.

BucketWorm vs. ObjectWorm

Item

BucketWorm

ObjectWorm

Escopo de proteção

Todos os objetos no bucket.

Objetos individuais.

Método de configuração

Opção no nível do bucket aplicada uniformemente a todos os objetos (existentes e novos).

Novos objetos herdam a política padrão. É possível definir uma política de maior prioridade para objetos individuais.

Tempo de retenção

Período relativo em dias contados a partir da última modificação do objeto.

Data limite absoluta de retenção, com precisão de segundos.

Exclusão mútua

BucketWorm e ObjectWorm são mutuamente exclusivos.

Pré-requisitos

Ativar o ObjectWorm e configurar uma política de retenção

Ative o ObjectWorm em um bucket para impedir a exclusão ou sobrescrita de objetos por um período especificado. Em seguida, configure uma política de retenção separada para cada objeto novo ou existente.

Aviso

Esta ação é irreversível. Após a ativação, não é possível desativar o ObjectWorm nem o versionamento do bucket.

Console

  1. Faça login no console do OSS.

  2. No painel de navegação à esquerda, clique em Buckets e, em seguida, clique no nome do bucket de destino.

  3. No painel de navegação à esquerda, escolha Data Protection > Object-Level Retention Policy.

  4. Clique em Enable.

  5. Configure a política de retenção padrão:

    • Not Set: Nenhuma política de retenção padrão é aplicada. Os objetos enviados não recebem proteção automática.

    • Compliance Mode: Nenhum usuário (incluindo o usuário root) pode excluir ou sobrescrever um objeto protegido durante o período de retenção.

      • Retention Period: Defina a duração da retenção e selecione Days ou Year como unidade.

  6. Clique em Save e confirme inserindo o texto necessário na caixa de diálogo.

ossutil

Ative o ObjectWorm para o bucket examplebucket e defina uma política de retenção de conformidade padrão com período de 1 dia.

Utilize um arquivo de configuração XML chamado object-worm-configuration.xml com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<ObjectWormConfiguration>
  <ObjectWormEnabled>Enabled</ObjectWormEnabled>
  <Rule>
    <DefaultRetention>
      <Mode>COMPLIANCE</Mode>
      <Days>1</Days>
    </DefaultRetention>
  </Rule>
</ObjectWormConfiguration>

Exemplo de comando:

ossutil api put-bucket-object-worm-configuration --bucket examplebucket --object-worm-configuration file://object-worm-configuration.xml

SDK

Os exemplos a seguir ativam o ObjectWorm e configuram uma política de retenção padrão usando um SDK.

Python

import argparse
import alibabacloud_oss_v2 as oss

parser = argparse.ArgumentParser(description="put bucket object worm configuration sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The OSS endpoint. If not specified, the SDK determines the endpoint based on the region.')
parser.add_argument('--mode', help='The retention mode. Valid values: GOVERNANCE, COMPLIANCE', default='GOVERNANCE')
parser.add_argument('--days', help='Object-level retention policy days (max 36500)', type=int)
parser.add_argument('--years', help='Bucket object level retention policy years (max 100)', type=int)

def main():

    args = parser.parse_args()

    # Loading credentials from the environment variables
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Using the SDK's default configuration
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss.Client(cfg)

    # Create a default retention rule
    default_retention = oss.ObjectWormConfigurationRuleDefaultRetention(
        mode=args.mode,
        days=args.days,
        # Specify either days or years, but not both.
        # years=args.years,
    )

    # Create the rule
    rule = oss.ObjectWormConfigurationRule(
        default_retention=default_retention,
    )

    # Create the WORM configuration
    config = oss.ObjectWormConfiguration(
        object_worm_enabled='Enabled',
        rule=rule,
    )

    result = client.put_bucket_object_worm_configuration(oss.PutBucketObjectWormConfigurationRequest(
        bucket=args.bucket,
        object_worm_configuration=config,
    ))

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
    )

if __name__ == "__main__":
    main()

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"
)

var (
	region     string
	bucketName string
)

func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}

func main() {
	flag.Parse()
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg)

	request := &oss.PutBucketObjectWormConfigurationRequest{
		Bucket: oss.Ptr(bucketName),
		ObjectWormConfiguration: &oss.ObjectWormConfiguration{
			ObjectWormEnabled: oss.Ptr("Enabled"),
			Rule: &oss.ObjectWormRule{
				DefaultRetention: &oss.ObjectWormDefaultRetention{
					Mode: oss.Ptr("COMPLIANCE"),
					Days: oss.Ptr(int32(1)),
				},
			},
		},
	}

	result, err := client.PutBucketObjectWormConfiguration(context.TODO(), request)
	if err != nil {
		log.Fatalf("Failed to put bucket Object WORM configuration: %v", err)
	}
	log.Printf("Put bucket Object WORM configuration result: %#v\n", result)
}

Java

import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.OSSClientBuilder;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;

public class PutBucketObjectWormConfigurationDemo {

    public static void main(String[] args) {

        CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
        OSSClient client = OSSClient.newBuilder()
                .credentialsProvider(provider)
                .region("cn-hangzhou")
                .build();

        try {
            ObjectWormConfigurationDefaultRetention defaultRetention = ObjectWormConfigurationDefaultRetention.newBuilder()
                    .mode("COMPLIANCE")
                    .days(1)
                    .build();

            ObjectWormConfigurationRule rule = ObjectWormConfigurationRule.newBuilder()
                    .defaultRetention(defaultRetention)
                    .build();

            ObjectWormConfiguration objectWormConfiguration = ObjectWormConfiguration.newBuilder()
                    .objectWormEnabled("Enabled")
                    .rule(rule)
                    .build();

            PutBucketObjectWormConfigurationRequest request = PutBucketObjectWormConfigurationRequest.newBuilder()
                    .bucket("examplebucket")
                    .objectWormConfiguration(objectWormConfiguration)
                    .build();

            PutBucketObjectWormConfigurationResult result = client.putBucketObjectWormConfiguration(request);

            System.out.printf("Status code:%d, request id:%s%n",
                    result.statusCode(), result.requestId());

        } catch (Exception e) {
            System.out.printf("error: %s%n", e);
        } finally {
            client.close();
        }
    }
}

API

Chame PutBucketObjectWormConfiguration para ativar o ObjectWorm. O exemplo a seguir ativa o ObjectWorm para um bucket com uma política de retenção de conformidade padrão de 1 dia.

PUT /?objectWorm HTTP/1.1
Date: Thu, 17 Mar 2026 11:18:32 GMT
Content-Length: 188
Content-Type: application/xml
Content-MD5: B2M2Y8AsgTpgAmY7PhC****
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20260317/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d****

<?xml version="1.0" encoding="UTF-8"?>
<ObjectWormConfiguration>
  <ObjectWormEnabled>Enabled</ObjectWormEnabled>
  <Rule>
    <DefaultRetention>
      <Mode>COMPLIANCE</Mode>
      <Days>1</Days>
    </DefaultRetention>
  </Rule>
</ObjectWormConfiguration>

Configurar uma política de retenção de objeto

Defina um modo de retenção e uma data limite para uma versão específica do objeto. A política no nível do objeto tem precedência sobre o padrão do bucket.

Console

Configure uma política de retenção para um objeto existente na lista de arquivos ou na página de detalhes do arquivo.

  1. Faça login no console do OSS.

  2. No painel de navegação à esquerda, clique em Buckets e, em seguida, clique no nome do bucket de destino.

  3. No painel de navegação à esquerda, clique em Object Management e localize o objeto de destino.

  4. À direita do objeto de destino, escolha More > Object-Level Retention Policy.

  5. No painel de configurações, configure o Default Retention Pattern e o Retention Period e, em seguida, clique em OK.

Nota

No modo de conformidade, você só pode estender um período de retenção existente, não reduzi-lo.

ossutil

Defina uma política de retenção de conformidade para exampleobject em examplebucket, com data limite de 2026-12-31T00:00:00.000Z.

Utilize um arquivo de configuração XML chamado retention.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Retention>
  <Mode>COMPLIANCE</Mode>
  <RetainUntilDate>2026-12-31T00:00:00.000Z</RetainUntilDate>
</Retention>

Exemplo de comando:

ossutil api put-object-retention --bucket examplebucket --key exampleobject --retention file://retention.xml

SDK

Os exemplos a seguir configuram uma política de retenção para um objeto usando um SDK.

Python

import argparse
import alibabacloud_oss_v2 as oss
from datetime import datetime, timedelta, timezone

parser = argparse.ArgumentParser(description="put object retention sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The OSS endpoint. If not specified, the SDK determines the endpoint based on the region.')
parser.add_argument('--key', help='The object key.', required=True)

def main():

    args = parser.parse_args()

    # Loading credentials from the environment variables
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Using the SDK's default configuration
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss.Client(cfg)

    # Calculate retain until date (1 day from now) in ISO 8601 format
    # Use UTC time (recommended for OSS)
    retain_until_date = datetime.now(timezone.utc) + timedelta(days=1)
    retain_until_iso = retain_until_date.strftime('%Y-%m-%dT%H:%M:%S.000Z')

    # Create retention configuration
    retention_config = oss.Retention(
        mode=oss.ObjectRetentionModeType.COMPLIANCE,
        retain_until_date=retain_until_iso,
    )

    # Set object retention
    result = client.put_object_retention(oss.PutObjectRetentionRequest(
        bucket=args.bucket,
        key=args.key,
        retention=retention_config,
    ))

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id}')

if __name__ == "__main__":
    main()

Go

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

var (
	region     string
	bucketName string
	objectName string
)

func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	flag.Parse()
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	client := oss.NewClient(cfg)

	date := time.Now().UTC().Add(5 * time.Hour).Format("2006-01-02T15:04:05.000Z")
	putRequest := &oss.PutObjectRetentionRequest{
		Bucket: oss.Ptr(bucketName),
		Key:    oss.Ptr(objectName),
		Retention: &oss.ObjectWormRetention{
			Mode:            oss.Ptr("COMPLIANCE"),
			RetainUntilDate: oss.Ptr(date),
		},
	}
	putResult, err := client.PutObjectRetention(context.TODO(), putRequest)
	if err != nil {
		log.Fatalf("Failed to put object retention policy: %v", err)
	}
	log.Printf("Put object retention policy result: %#v\n", putResult)
}

Java

import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.OSSClientBuilder;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;

public class PutObjectRetentionDemo {

    public static void main(String[] args) {

        CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
        OSSClient client = OSSClient.newBuilder()
                .credentialsProvider(provider)
                .region("cn-hangzhou")
                .build();

        try {
            Retention retention = Retention.newBuilder()
                    .mode("COMPLIANCE")
                    .retainUntilDate("2026-12-31T00:00:00.000Z")
                    .build();

            PutObjectRetentionRequest request = PutObjectRetentionRequest.newBuilder()
                    .bucket("examplebucket")
                    .key("exampleobject")
                    .retention(retention)
                    .build();

            PutObjectRetentionResult result = client.putObjectRetention(request);

            System.out.printf("Status code:%d, request id:%s%n",
                    result.statusCode(), result.requestId());

        } catch (Exception e) {
            System.out.printf("error: %s%n", e);
        } finally {
            client.close();
        }
    }
}

API

Chame PutObjectRetention para definir uma política de retenção para um objeto. Exemplo de solicitação:

PUT /exampleobject?retention&versionId=CAEQNhiBgMDJgZCA0BYiIDc4MGZj**** HTTP/1.1
Date: Thu, 17 Mar 2026 11:18:32 GMT
Content-MD5: B2M2Y8AsgTpgAmY7PhC****
Content-Type: application/xml
Content-Length: 162
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20260317/cn-hangzhou/oss/aliyun_v4_request,Signature=****

<Retention>
  <Mode>COMPLIANCE</Mode>
  <RetainUntilDate>2026-10-11T00:00:00.000Z</RetainUntilDate>
</Retention>

Configurar retenção durante o upload

Defina uma política de retenção nos cabeçalhos da solicitação ao enviar um objeto para eliminar uma chamada separada para PutObjectRetention. Há suporte a esse recurso para PutObject, CopyObject e InitiateMultipartUpload.

Console

  1. Faça login no console do OSS e acesse a página Object Management do bucket de destino.

  2. Clique em Upload Object.

  3. No painel Upload, expanda Advanced Settings e localize a configuração Default Retention Policy.

  4. Selecione {policyType}, configure o Retention Pattern e o Retention Period e, em seguida, envie o arquivo.

    Nota

    Se você selecionar {policyType}, o objeto enviado herdará automaticamente a política de retenção padrão do bucket.

ossutil

Use o comando put-object com --object-worm-mode e --object-worm-retain-until-date para definir uma política de retenção durante o upload.

ossutil api put-object --bucket examplebucket --key exampleobject --body file://localfile.txt --object-worm-mode COMPLIANCE --object-worm-retain-until-date 2026-10-11T00:00:00.000Z

SDK

O exemplo a seguir define uma política de retenção ao chamar PutObject para enviar um objeto.

import alibabacloud_oss_v2 as oss

credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = 'cn-hangzhou'
client = oss.Client(cfg)

# Upload the object and set a retention policy: compliance mode, retain until October 11, 2026.
result = client.put_object(oss.PutObjectRequest(
    bucket='examplebucket',
    key='exampleobject',
    body='Hello OSS',
    object_worm_mode='COMPLIANCE',
    object_worm_retain_until_date='2026-10-11T00:00:00.000Z',
))
print(f'status code: {result.status_code}')
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;
import com.aliyun.sdk.service.oss2.transport.BinaryData;

public class UploadWithRetention {
    public static void main(String[] args) {
        OSSClient client = OSSClient.newBuilder()
            .credentialsProvider(new EnvironmentVariableCredentialsProvider())
            .region("cn-hangzhou")
            .build();

        try {
            // Upload the object and set a retention policy: compliance mode, retain until October 11, 2026.
            PutObjectResult result = client.putObject(PutObjectRequest.newBuilder()
                .bucket("examplebucket")
                .key("exampleobject")
                .body(BinaryData.fromString("Hello OSS"))
                .header("x-oss-object-worm-mode", "COMPLIANCE")
                .header("x-oss-object-worm-retain-until-date", "2026-10-11T00:00:00.000Z")
                .build());

            System.out.printf("status code: %d%n", result.statusCode());
        } finally {
            client.close();
        }
    }
}
package main

import (
	"context"
	"fmt"
	"strings"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

func main() {
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion("cn-hangzhou")
	client := oss.NewClient(cfg)

	// Upload the object and set a retention policy: compliance mode, retain until October 11, 2026.
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr("examplebucket"),
		Key:    oss.Ptr("exampleobject"),
		Body:   strings.NewReader("Hello OSS"),
		RequestCommon: oss.RequestCommon{
			Headers: map[string]string{
				"x-oss-object-worm-mode":              "COMPLIANCE",
				"x-oss-object-worm-retain-until-date": "2026-10-11T00:00:00.000Z",
			},
		},
	}
	_, err := client.PutObject(context.TODO(), request)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Object uploaded with retention successfully")
}

API

Chame PutObject para enviar um objeto e definir sua política de retenção nos cabeçalhos da solicitação.

PUT /exampleobject HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
x-oss-object-worm-mode: COMPLIANCE
x-oss-object-worm-retain-until-date: 2026-10-11T00:00:00.000Z
Content-MD5: B2M2Y8AsgTpgAmY7PhC****
Authorization: SignatureValue

[Object Content]

Observações de uso

  • Restrições de cabeçalho: Se o ObjectWorm não estiver ativado, as solicitações de API não devem incluir estes cabeçalhos: x-oss-bypass-governance-retention ou x-amz-bypass-governance-retention.

  • Recurso irreversível: Após a ativação, não é possível desativar o ObjectWorm. Avalie suas necessidades de negócios antes de ativar este recurso.

  • Escopo da política padrão: A política de retenção padrão aplica-se apenas a novos objetos, não aos existentes. Use a operação PutObjectRetention para definir a retenção de objetos existentes individualmente.

  • Precedência da política do objeto: A política de retenção própria de um objeto tem precedência sobre o padrão do bucket.

  • Extensão do período de retenção: No modo de conformidade, só é possível estender uma data limite de retenção existente, não reduzi-la.

  • Exclusão de objetos: Não é possível excluir objetos protegidos durante o período de retenção.

  • Marcadores de exclusão: O ObjectWorm não protege marcadores de exclusão. Eles podem ser criados e limpos normalmente. No entanto, não é possível excluir uma versão do objeto dentro do seu período de retenção.

  • Partes: O ObjectWorm não protege partes geradas por uploads multipart.

  • Replicação de dados: A replicação não copia as configurações do ObjectWorm. O objeto de destino segue a configuração do ObjectWorm do bucket de destino, que deve ser definida separadamente.

  • Gerenciamento de ciclo de vida: As regras de ciclo de vida ainda podem mover objetos para outras classes de armazenamento. No entanto, as regras de expiração não excluem objetos dentro do período de retenção.

  • Envio de logs: Evite enviar arquivos de log para um bucket com ObjectWorm ativado. Arquivos de log bloqueados não podem ser excluídos automaticamente, o que aumenta os custos de armazenamento.

  • Append Object: Não há suporte à operação Append Object em buckets com uma política de retenção no nível do objeto padrão.

  • ACL de objeto: Não é possível definir ACLs de objeto para objetos dentro do período de retenção do ObjectWorm.