Uma 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. Ao contrário da bucket-level retention policy (BucketWorm), que protege uniformemente todos os objetos em um bucket, o ObjectWorm permite que você defina um modo de retenção e uma data de retenção exclusivos por objeto para atender a requisitos granulares de conformidade em setores como finanças, saúde e similares.
Este recurso está disponível atualmente apenas por convite. Para solicitar acesso, entre em contato com o suporte técnico.
Visão geral
Após a ativação do ObjectWorm em um bucket, os novos objetos herdam automaticamente uma política de retenção padrão, e você pode definir uma política separada para cada objeto existente. A política no nível do objeto tem precedência sobre o padrão do bucket.
Atualmente, apenas o modo de conformidade tem suporte. No modo de conformidade, nenhum usuário — incluindo o usuário raiz — pode excluir ou sobrescrever uma versão de objeto protegida durante seu período de retenção. A data de retenção só pode ser estendida, e não reduzida.
BucketWorm vs. ObjectWorm
|
Item |
BucketWorm |
ObjectWorm |
|
Escopo de proteção |
Todos os objetos no bucket. |
Objetos individuais. |
|
Método de configuração |
Uma opção no nível do bucket aplicada uniformemente a todos os objetos (existentes e novos) do bucket. |
Os novos objetos herdam a política padrão. Defina uma política de maior prioridade para objetos específicos. |
|
Tempo de retenção |
Período relativo em dias a partir da última modificação do objeto. |
Data absoluta de retenção, com precisão de segundos. |
|
Exclusão mútua |
BucketWorm e ObjectWorm são mutuamente exclusivos. |
|
Pré-requisitos
O Versioning deve estar ativado no bucket. Após a ativação do ObjectWorm, não é possível desativar o versionamento.
A bucket-level retention policy (BucketWorm) não deve estar ativada no bucket. ObjectWorm e BucketWorm são mutuamente exclusivos.
Ative o ObjectWorm e configure uma política de retenção
Ative o ObjectWorm em um bucket para impedir que objetos sejam excluídos ou sobrescritos por um período que você especifique. Depois, configure uma política de retenção específica para cada objeto novo ou existente.
Esta ação é irreversível. Após a ativação, não é possível desativar o ObjectWorm nem o versionamento do bucket.
Console
Faça logon no console do OSS.
No painel de navegação à esquerda, clique em Buckets e, em seguida, no nome do bucket de destino.
No painel de navegação à esquerda, escolha Data Protection > Object-Level Retention Policy.
clique em Enable.
-
Configure a política de retenção padrão:
Not Set: Nenhuma política de retenção padrão é aplicada. Os objetos carregados não são protegidos automaticamente.
-
Compliance Mode: Nenhum usuário — incluindo o usuário raiz — 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.
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 um período de 1 dia.
Use 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>
Comando de exemplo:
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(®ion, "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 a API 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>
Configure uma política de retenção de objeto
Defina um modo e uma data de retenção 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 a partir da lista de arquivos ou da página de detalhes do arquivo.
Faça logon no console do OSS.
No painel de navegação à esquerda, clique em Buckets e, em seguida, no nome do bucket de destino.
No painel de navegação à esquerda, clique em Object Management e localize o objeto de destino.
À direita do objeto de destino, escolha .
No painel de configurações, configure o Default Retention Pattern e o Retention Period e, em seguida, clique em OK.
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 no examplebucket, com data de retenção até 2026-12-31T00:00:00.000Z.
Use 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>
Comando de exemplo:
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(®ion, "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 a API PutObjectRetention e defina uma política de retenção para um objeto. Exemplo de requisiçã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>
Configure a retenção durante o upload
Defina uma política de retenção nos cabeçalhos da requisição ao carregar um objeto. Isso elimina uma chamada separada para PutObjectRetention. Há suporte para esse recurso em PutObject, CopyObject e InitiateMultipartUpload.
Console
Faça logon no console do OSS e acesse a página de Object Management do bucket de destino.
clique em Upload Object.
No painel de upload, expanda Advanced Settings e localize a configuração Default Retention Policy.
-
Selecione {policyType}, configure o Retention Pattern e o Retention Period e, em seguida, carregue o arquivo.
NotaSe você selecionar {policyType}, o objeto carregado 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 e defina 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 a API PutObject para carregar 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 a API PutObject para carregar um objeto e definir sua política de retenção nos cabeçalhos da requisiçã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]
Notas de uso
Restrições de cabeçalho: Quando o ObjectWorm não está ativado, as requisições de API não devem incluir os seguintes cabeçalhos:
x-oss-bypass-governance-retentionoux-amz-bypass-governance-retention.Recurso irreversível: Após a ativação, não é possível desativar o ObjectWorm. Avalie as necessidades do seu negócio antes de ativar esse recurso.
Escopo da política padrão: A política de retenção padrão aplica-se apenas a novos objetos, e não aos existentes. Use a operação PutObjectRetention e defina a retenção de objetos existentes individualmente.
Precedência da política do objeto: A política de retenção do próprio objeto tem precedência sobre o padrão do bucket.
Extensão do período de retenção: No modo de conformidade, a data de retenção existente só pode ser estendida, e não reduzida.
Exclusão de objetos: Não exclua objetos protegidos durante o período de retenção.
Marcadores de exclusão: O ObjectWorm não protege marcadores de exclusão — crie e limpe-os normalmente. No entanto, você não pode excluir uma versão do objeto dentro do seu período de retenção.
Partes: O ObjectWorm não protege partes geradas por uploads de múltiplas partes.
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 fazer a transição de objetos para outras classes de armazenamento. No entanto, os objetos dentro do período de retenção não são excluídos por regras de expiração.
Envio de logs: Evite enviar arquivos de log para um bucket com o ObjectWorm ativado. Arquivos de log bloqueados não podem ser excluídos automaticamente, o que aumenta os custos de armazenamento.
Append Object: A operação Append Object não tem suporte em buckets com uma política de retenção padrão no nível do objeto.
ACL do objeto: Não é possível definir ACLs para objetos dentro do período de retenção do ObjectWorm.