

# Reter várias versões de objetos com o Versionamento do S3
<a name="Versioning"></a>

Versionamento no Amazon S3 é um meio de manter diversas variantes de um objeto no mesmo bucket. Você pode usar o recurso S3 Versioning para preservar, recuperar e restaurar todas as versões de cada objeto armazenado em seus buckets. Com o versionamento, você pode se recuperar mais facilmente de ações não intencionais do usuário e de falhas da aplicação. Depois de habilitar o versionamento para um bucket, se o Amazon S3 receber várias solicitações de gravação do mesmo objeto simultaneamente, ele armazenará todos esses objetos.

Buckets com versionamento habilitado podem ajudar a recuperar objetos de uma exclusão ou substituição acidental. Por exemplo, se você excluir um objeto, o Amazon S3 inserirá um marcador de exclusão em vez de remover o objeto permanentemente. O marcador de exclusão se torna a versão atual do objeto. Se você substituir um objeto, isso criará uma nova versão do objeto no bucket. Você sempre pode restaurar a versão anterior. Para obter mais informações, consulte [Excluir versões de objetos de um bucket com versionamento habilitado](DeletingObjectVersions.md). 

Por padrão, o Versionamento do S3 está desativado em buckets e você deve ativá-lo explicitamente. Para obter mais informações, consulte [Habilitar o versionamento em buckets](manage-versioning-examples.md).

**nota**  
A API SOAP não é compatível com o versionamento do S3. O suporte de SOAP via HTTP está obsoleto, mas continua disponível via HTTPS. Os novos recursos do Amazon S3 não são compatíveis com SOAP.
As taxas normais do Amazon S3 se aplicam a cada versão de um objeto armazenado e transferido. Cada versão de um objeto é um objeto inteiro; não é apenas um diff da versão anterior. Assim, se você tiver três versões de um objeto armazenado, será cobrado pelos três objetos. 

## Buckets não versionados, habilitados para versão e suspensos de versão
<a name="versioning-states"></a>

Os buckets podem estar em um dos três estados: 
+ Não versionado (o padrão)
+ Habilitado para versão
+ Com versionamento suspenso

Você habilita e suspende o versionamento no nível do bucket. Depois que um bucket é habilitado para versionamento, ele nunca pode voltar a um estado sem versionamento. Mas você pode *suspender* o versionamento nesse bucket.

O estado de versionamento aplica-se a todos (nunca alguns) os objetos nesse bucket. Quando você habilita o versionamento em um bucket, todos os novos objetos são versionados e recebem um ID de versão exclusivo. Os objetos que já existiam no bucket no momento em que o versionamento foi ativado serão *sempre* versionados e receberão um ID de versão exclusivo quando forem modificados por solicitações futuras. Observe o seguinte: 
+ Os objetos que são armazenados em seu bucket antes da habilitação do versionamento têm um ID de versão `null`. Quando você habilita o versionamento, os objetos existentes em seu bucket não são alterados. O que muda é como o Amazon S3 trata os objetos em solicitações futuras. Para obter mais informações, consulte [Trabalhar com objetos em um bucket com versionamento habilitado](manage-objects-versioned-bucket.md).
+ O proprietário do bucket (ou qualquer usuário com as devidas permissões) pode suspender o versionamento para interromper o acúmulo de versões de objetos. Quando você suspende o versionamento, os objetos existentes em seu bucket não são alterados. O que muda é como o Amazon S3 trata os objetos em solicitações futuras. Para obter mais informações, consulte [Trabalhar com objetos em um bucket com versionamento suspenso](VersionSuspendedBehavior.md).

## Usando o versionamento do S3 com o ciclo de vida do S3
<a name="versioning-lifecycle"></a>

Para personalizar sua abordagem de retenção de dados e controlar os custos de armazenamento, use o versionamento de objetos com o S3 Lifecycle. Para obter mais informações, consulte [Gerenciar o ciclo de vida dos objetos](object-lifecycle-mgmt.md). Para ter informações sobre como criar configurações de ciclo de vida do S3 usando o Console de gerenciamento da AWS, a AWS CLI, os AWS SDKs ou a API REST, consulte [Definir uma configuração do Ciclo de Vida do S3 em um bucket](how-to-set-lifecycle-configuration-intro.md).

**Importante**  
Se você tem uma configuração de ciclo de vida de expiração do objeto em seu bucket sem versionamento e quiser manter o mesmo comportamento de exclusão permanente quando ativar o versionamento, precisará adicionar uma configuração de expiração de versão não corrente. A política de validade do ciclo de vida não atual gerencia as exclusões de versões de objeto não atuais no bucket habilitado para versionamento. (Um bucket habilitado para versionamento mantém uma versão atual e zero ou mais versões desatualizadas de objetos.) Para obter mais informações, consulte [Definir uma configuração do Ciclo de Vida do S3 em um bucket](how-to-set-lifecycle-configuration-intro.md).

Para obter informações sobre como trabalhar com o Versionamento do S3, consulte os tópicos a seguir.

**Topics**
+ [Buckets não versionados, habilitados para versão e suspensos de versão](#versioning-states)
+ [Usando o versionamento do S3 com o ciclo de vida do S3](#versioning-lifecycle)
+ [Como funciona o Versionamento do S3](versioning-workflows.md)
+ [Habilitar o versionamento em buckets](manage-versioning-examples.md)
+ [Configurando a exclusão de MFA](MultiFactorAuthenticationDelete.md)
+ [Trabalhar com objetos em um bucket com versionamento habilitado](manage-objects-versioned-bucket.md)
+ [Trabalhar com objetos em um bucket com versionamento suspenso](VersionSuspendedBehavior.md)
+ [Solucionar problemas de versionamento](troubleshooting-versioning.md)

# Como funciona o Versionamento do S3
<a name="versioning-workflows"></a>

Você pode usar o versionamento do S3 para manter várias versões de um objeto em um bucket com o intuito de restaurar objetos excluídos ou substituídos acidentalmente. Por exemplo, se você aplicar o versionamento do S3 a um bucket, as seguintes alterações ocorrerão: 
+ Se você excluir um objeto em vez de removê-lo permanentemente, o Amazon S3 inserirá um marcador de exclusão, o que se torna a versão atual do objeto. Você pode então restaurar a versão anterior. Para obter mais informações, consulte [Excluir versões de objetos de um bucket com versionamento habilitado](DeletingObjectVersions.md).
+ Se você substituir um objeto, o Amazon S3 adicionará uma nova versão do objeto no bucket. A versão anterior permanecerá no bucket e se tornará uma versão desatualizada. Você poderá restaurar a versão anterior.

**nota**  
As taxas normais do Amazon S3 se aplicam a cada versão de um objeto armazenado e transferido. Cada versão de um objeto é um objeto inteiro, e não um diff da versão anterior. Assim, se você tiver três versões de um objeto armazenado, será cobrado pelos três objetos.

Cada bucket do S3 que você cria tem um sub-recurso de *versionamento* associado a ele. (Para obter mais informações, consulte [Opções de configuração de buckets de uso geral](UsingBucket.md#bucket-config-options-intro).) Por padrão, seu bucket *não está habilitado para versionamento* e o sub-recurso de versionamento armazena uma configuração vazia de versionamento, como mostrado a seguir.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

Para habilitar o versionamento, você pode enviar uma solicitação ao Amazon S3 com uma configuração de versionamento que inclui um status `Enabled`. 

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

Para suspender o versionamento, você define o valor do status como `Suspended`.

**nota**  
Quando você habilitar o versionamento em um bucket pela primeira vez, poderá levar um curto período para que a alteração seja totalmente propagada. Enquanto essa alteração está se propagando, você pode encontrar erros `HTTP 404 NoSuchKey` intermitentes nas solicitações de objetos criados ou atualizados após a habilitação do versionamento. Recomendamos que você aguarde 15 minutos depois de habilitar o versionamento para emitir operações de gravação (`PUT` ou `DELETE`) em objetos no bucket. 

O proprietário do bucket e todos os usuários autorizados do AWS Identity and Access Management (IAM) podem habilitar o versionamento. O proprietário do bucket é a Conta da AWS que criou o bucket. Para obter mais informações sobre permissões, consulte [Gerenciamento de identidade e acesso para o Amazon S3](security-iam.md).

Para obter mais informações sobre como habilitar e desabilitar o versionamento do S3 usando o Console de gerenciamento da AWS, a AWS Command Line Interface (AWS CLI) ou a API REST, consulte [Habilitar o versionamento em buckets](manage-versioning-examples.md).

**Topics**
+ [IDs de versão](#version-ids)
+ [Fluxos de trabalho de versionamento](#versioning-workflows-examples)

## IDs de versão
<a name="version-ids"></a>

Se o versionamento estiver habilitado para um bucket, o Amazon S3 gerará um ID de versão exclusivo automaticamente para o objeto que está sendo armazenado. Por exemplo, em um bucket, você pode ter dois objetos com a mesma chave (nome do objeto), mas diferentes IDs de versão, como `photo.gif` (versão 111111) e `photo.gif` (versão 121212).

![\[Diagrama que retrata um bucket com versionamento habilitado que tem dois objetos com a mesma chave e IDs de versão diferentes.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_Enabled.png)


Cada objeto tem um ID de versão, mesmo que o versionamento do S3 não esteja habilitado. Se o versionamento do S3 não estiver habilitado, o Amazon S3 definirá o valor do ID da versão como `null`. Se o S3 Versioning for habilitado, o Amazon S3 atribuirá um valor de ID de versão para o objeto. Esse valor o distingue de outras versões da mesma chave.

Quando você habilita o S3 Versioning em um bucket existente, os objetos que já estão armazenados no bucket permanecem inalterados. Os IDs de versão (`null`), o conteúdo e as permissões continuarão os mesmos. Depois que habilitar o versionamento do S3, cada objeto adicionado ao bucket obterá um ID de versão, que o distinguirá de outras versões da mesma chave. 

Somente o Amazon S3 gera IDs de versão, e eles não podem ser editados. Os IDs de versão são strings opacas Unicode, com codificação UTF-8 e prontas para URL que não têm mais de 1.024 bytes de comprimento. Veja um exemplo a seguir:

`3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`

**nota**  
Por simplicidade, os outros exemplos neste tópico usam IDs muito mais curtos.



## Fluxos de trabalho de versionamento
<a name="versioning-workflows-examples"></a>

Quando você `PUT` um objeto em um bucket com versionamento ativado, a versão desatualizada não é substituída. Conforme mostrado na seguinte figura, quando uma nova versão de `photo.gif` é `PUT` em um bucket que já contém um objeto com o mesmo nome, o seguinte comportamento ocorre:
+ O objeto original (ID = 111111) permanece no bucket.
+ O Amazon S3 gera um novo ID de versão (121212) e adiciona essa versão mais recente do objeto ao bucket.

![\[Diagrama que mostra como o versionamento do S3 funciona quando você aplica PUT em um objeto em um bucket com versionamento habilitado.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled3.png)


Com essa funcionalidade, você poderá recuperar uma versão anterior de um objeto se um objeto tiver sido sobrescrito ou excluído acidentalmente.

Quando você aplica `DELETE` em um objeto, todas as versões permanecem no bucket e o Amazon S3 insere um marcador de exclusão, conforme exibido na figura a seguir.

![\[Ilustração da inserção de um marcador de exclusão.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)


O marcador de exclusão torna-se a versão atual de objeto. Por padrão, o `GET` requisita a recuperação da versão armazenada mais recente. A execução de uma solicitação `GET Object` quando a versão atual é um marcador de exclusão retorna um erro `404 Not Found`, conforme exibido na figura a seguir.

![\[Ilustração de uma chamada GetObject para um marcador de exclusão que retorna um erro 404 (não encontrado).\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


Você pode, contudo, fazer uma solicitação `GET` de uma versão desatualizada de um objeto por especificar seu ID de versão. Na figura a seguir, você faz uma solicitação `GET` de uma versão específica de objeto, 111111. O Amazon S3 retorna a versão desse objeto, apesar de não ser a versão atual.

Para obter mais informações, consulte [Recuperando versões de objeto de um bucket habilitado para versionamento](RetrievingObjectVersions.md).

![\[Diagrama que mostra como o versionamento do S3 funciona quando você aplica GET em uma versão desatualizada em um bucket com versionamento habilitado.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_GET_Versioned3.png)


Você pode excluir permanentemente um objeto, especificando a versão que deseja excluir. Somente o proprietário de um bucket do Amazon S3 ou um usuário do IAM autorizado pode excluir uma versão permanentemente. Se a operação `DELETE` especificar o `versionId`, essa versão do objeto será excluída permanentemente e o Amazon S3 não inserirá um marcador de exclusão.

![\[Diagrama que mostra como DELETE versionId exclui permanentemente uma versão específica do objeto.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


Você pode obter segurança adicional configurando um bucket para habilitar a exclusão com autenticação multifator (MFA). Quando você habilita a exclusão com MFA para um bucket, o proprietário do bucket precisa incluir dois formulários de autenticação em qualquer solicitação para excluir uma versão ou modificar o estado de versionamento do bucket. Para obter mais informações, consulte [Configurando a exclusão de MFA](MultiFactorAuthenticationDelete.md).

### Quando novas versões são criadas para um objeto?
<a name="versioning-workflows-new-versions"></a>

Novas versões de objetos são criadas somente quando você aplica `PUT` em um novo objeto. Esteja ciente de que certas ações como `CopyObject` funcionam implementando uma operação `PUT`.

Algumas ações que modificam o objeto atual não criam uma versão porque elas não aplicam `PUT` em um novo objeto. Isso inclui ações como alterar as tags em um objeto. 

**Importante**  
Se você perceber um aumento significativo do número de respostas HTTP 503 (Serviço indisponível) recebidas para solicitações PUT ou DELETE de objetos do Amazon S3 a um bucket que tenha o versionamento do S3 habilitado, talvez tenha um ou mais objetos no bucket para os quais há milhões de versões. Para ter mais informações, consulte a seção Versionamento do S3 de [Solucionar problemas de versionamento](troubleshooting-versioning.md).

# Habilitar o versionamento em buckets
<a name="manage-versioning-examples"></a>

Use o S3 Versioning para manter várias versões de um objeto em um bucket. Esta seção fornece exemplos de como habilitar o versionamento em um bucket usando o console, a API REST, os AWS SDKs e a AWS Command Line Interface (AWS CLI). 

**nota**  
Ao habilitar o versionamento em um bucket pela primeira vez, poderá levar até 15 minutos para que a alteração seja totalmente propagada no sistema do S3. Durante esse período, as solicitações `GET` de objetos criados ou atualizados após a habilitação do versionamento podem gerar erros `HTTP 404 NoSuchKey`. Recomendamos aguardar 15 minutos depois de habilitar o versionamento para executar quaisquer operações de gravação (`PUT` ou `DELETE`) em objetos no bucket. Esse período de espera ajuda a evitar possíveis problemas com a visibilidade de objetos e o rastreamento de versões.

Para obter mais informações sobre o S3 Versioning, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md). Para obter informações sobre como trabalhar com objetos que estão em buckets habilitados para versão, consulte [Trabalhar com objetos em um bucket com versionamento habilitado](manage-objects-versioned-bucket.md).

Para saber mais sobre como usar o Versionamento do S3 para proteger dados, consulte [Tutorial: Protecting data on Amazon S3 against accidental deletion or application bugs using S3 Versioning, S3 Object Lock, and S3 Replication](https://aws.amazon.com/getting-started/hands-on/protect-data-on-amazon-s3/?ref=docs_gateway/amazons3/manage-versioning-examples.html) (Tutorial: Proteção de dados no Amazon S3 contra exclusão acidental ou bugs de aplicações usando o Versionamento do S3, o Bloqueio de Objeto do S3 e a Replicação do S3.

Cada bucket do S3 que você cria tem um sub-recurso de *versionamento* associado a ele. (Para obter mais informações, consulte [Opções de configuração de buckets de uso geral](UsingBucket.md#bucket-config-options-intro).) Por padrão, seu bucket *não está habilitado para versionamento* e o sub-recurso de versionamento armazena uma configuração vazia de versionamento, como mostrado a seguir.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

Para habilitar o versionamento, você pode enviar uma solicitação ao Amazon S3 com uma configuração de versionamento que inclui um status. 

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

Para suspender o versionamento, você define o valor do status como `Suspended`.

O proprietário do bucket e todos os usuários autorizados podem habilitar o versionamento. O proprietário do bucket é a Conta da AWS que criou o bucket (a conta root). Para obter mais informações sobre permissões, consulte [Gerenciamento de identidade e acesso para o Amazon S3](security-iam.md).

As seções a seguir fornecem mais detalhes sobre como ativar o versionamento do S3 usando o console, a AWS CLI e os AWS SDKs.

## Uso do console do S3
<a name="enable-versioning"></a>

Siga estas etapas para usar o Console de gerenciamento da AWS para habilitar o versionamento em um bucket do S3.

**Como habilitar ou desabilitar o versionamento em um bucket de uso geral do S3**

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. No painel de navegação à esquerda, escolha **Buckets de uso geral**.

1. Na lista de buckets, escolha o nome do bucket para o qual você deseja habilitar o versionamento.

1. Escolha **Properties (Propriedades)**.

1. Em **Bucket Versioning (Versionamento de bucket)**, escolha **Edit (Editar)**.

1. Escolha **Suspend (Suspender)** ou **Enable (Ativar)**, e selecione **Save changes (Salvar alterações)**.

**nota**  
Você pode usar a autenticação multifator (MFA) da AWS com versionamento. Ao usar a MFA com versionamento, você deve fornecer as chaves de acesso da sua Conta da AWS e um código válido do dispositivo MFA da conta para excluir permanentemente uma versão de objeto ou suspender ou reativar o versionamento.   
Para usar a MFA com versionamento, você habilita `MFA Delete`. No entanto, não é possível habilitar o `MFA Delete` usando o Console de gerenciamento da AWS. É necessário usar a AWS Command Line Interface (AWS CLI) ou API. Para obter mais informações, consulte [Configurando a exclusão de MFA](MultiFactorAuthenticationDelete.md).

## Usar a AWS CLI
<a name="manage-versioning-examples-cli"></a>

O exemplo a seguir habilita o versionamento em um bucket de uso geral do S3. 

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled
```

O exemplo a seguir habilita o versionamento do S3 e a exclusão da autenticação multifator (MFA) em um bucket para um dispositivo de MFA físico. Para dispositivos de MFA físicos, no parâmetro `--mfa`, envie uma concatenação do número de série do dispositivo de MFA, um caractere de espaço e o valor exibido em seu dispositivo de autenticação.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

O exemplo a seguir habilita o versionamento do S3 e a exclusão da autenticação multifator (MFA) em um bucket para um dispositivo de MFA virtual. Para dispositivos de MFA virtuais, no parâmetro `--mfa`, passe uma concatenação do ARN do dispositivo de MFA, um caractere de espaço e o valor exibido em seu dispositivo de autenticação.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

**nota**  
O uso da exclusão de MFA requer um dispositivo de autenticação física ou virtual aprovado. Para obter mais informações sobre como usar exclusão de MFA no Amazon S3, consulte [Configurando a exclusão de MFA](MultiFactorAuthenticationDelete.md).

Para obter mais informações sobre como ativar o versionamento usando a AWS CLI, consulte [put-bucket-versioning](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-versioning.html) na *Referência de comandos da AWS CLI*.

## Uso da SDKs AWS
<a name="manage-versioning-examples-sdk"></a>

Os exemplos a seguir permitem o versionamento em um bucket e, em seguida, recuperam o status do versionamento usando o AWS SDK para Java e o AWS SDK para .NET. Para obter informações sobre o uso de outros AWS SDKs, consulte o [Centro do Desenvolvedor da AWS](https://aws.amazon.com/code/).

------
#### [ .NET ]

Para obter informações sobre como configurar e executar exemplos de código, consulte [Conceitos básicos do AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) no *Guia do desenvolvedor do AWS SDK for .NET*. 

```
using System;
using Amazon.S3;
using Amazon.S3.Model;

namespace s3.amazon.com.rproxy.goskope.com.docsamples
{
    class BucketVersioningConfiguration
    {
        static string bucketName = "*** bucket name ***";

        public static void Main(string[] args)
        {
            using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
            {
                try
                {
                    EnableVersioningOnBucket(client);
                    string bucketVersioningStatus = RetrieveBucketVersioningConfiguration(client);
                }
                catch (AmazonS3Exception amazonS3Exception)
                {
                    if (amazonS3Exception.ErrorCode != null &&
                        (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                        ||
                        amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
                    {
                        Console.WriteLine("Check the provided AWS Credentials.");
                        Console.WriteLine(
                        "To sign up for service, go to http://aws.amazon.com/s3");
                    }
                    else
                    {
                        Console.WriteLine(
                         "Error occurred. Message:'{0}' when listing objects",
                         amazonS3Exception.Message);
                    }
                }
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }

        static void EnableVersioningOnBucket(IAmazonS3 client)
        {

                PutBucketVersioningRequest request = new PutBucketVersioningRequest
                {
                    BucketName = bucketName,
                    VersioningConfig = new S3BucketVersioningConfig 
                    {
                        Status = VersionStatus.Enabled
                    }
                };

                PutBucketVersioningResponse response = client.PutBucketVersioning(request);
        }


        static string RetrieveBucketVersioningConfiguration(IAmazonS3 client)
        {
                GetBucketVersioningRequest request = new GetBucketVersioningRequest
                {
                    BucketName = bucketName
                };
 
                GetBucketVersioningResponse response = client.GetBucketVersioning(request);
                return response.VersioningConfig.Status;
            }
    }
}
```

------
#### [ Java ]

Consulte instruções sobre como criar e testar uma amostra funcional em [Getting Started](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) no Guia do desenvolvedor do AWS SDK para Java.

```
import java.io.IOException;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.BucketVersioningConfiguration;
import com.amazonaws.services.s3.model.SetBucketVersioningConfigurationRequest;

public class BucketVersioningConfigurationExample {
    public static String bucketName = "*** bucket name ***"; 
    public static AmazonS3Client s3Client;

    public static void main(String[] args) throws IOException {
        s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
        s3Client.setRegion(Region.getRegion(Regions.US_EAST_1));
        try {

            // 1. Enable versioning on the bucket.
        	BucketVersioningConfiguration configuration = 
        			new BucketVersioningConfiguration().withStatus("Enabled");
            
			SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = 
					new SetBucketVersioningConfigurationRequest(bucketName,configuration);
			
			s3Client.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest);
			
			// 2. Get bucket versioning configuration information.
			BucketVersioningConfiguration conf = s3Client.getBucketVersioningConfiguration(bucketName);
			 System.out.println("bucket versioning configuration status:    " + conf.getStatus());

        } catch (AmazonS3Exception amazonS3Exception) {
            System.out.format("An Amazon S3 error occurred. Exception: %s", amazonS3Exception.toString());
        } catch (Exception ex) {
            System.out.format("Exception: %s", ex.toString());
        }        
    }
}
```

------
#### [ Python ]

O exemplo de código Python a seguir cria um bucket do Amazon S3 bucket, habilita-o para versionamento e configura um ciclo de vida que faz com que versões não atuais de objetos expirem após 7 dias.

```
def create_versioned_bucket(bucket_name, prefix):
    """
    Creates an Amazon S3 bucket, enables it for versioning, and configures a lifecycle
    that expires noncurrent object versions after 7 days.

    Adding a lifecycle configuration to a versioned bucket is a best practice.
    It helps prevent objects in the bucket from accumulating a large number of
    noncurrent versions, which can slow down request performance.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket_name: The name of the bucket to create.
    :param prefix: Identifies which objects are automatically expired under the
                   configured lifecycle rules.
    :return: The newly created bucket.
    """
    try:
        bucket = s3.create_bucket(
            Bucket=bucket_name,
            CreateBucketConfiguration={
                "LocationConstraint": s3.meta.client.meta.region_name
            },
        )
        logger.info("Created bucket %s.", bucket.name)
    except ClientError as error:
        if error.response["Error"]["Code"] == "BucketAlreadyOwnedByYou":
            logger.warning("Bucket %s already exists! Using it.", bucket_name)
            bucket = s3.Bucket(bucket_name)
        else:
            logger.exception("Couldn't create bucket %s.", bucket_name)
            raise

    try:
        bucket.Versioning().enable()
        logger.info("Enabled versioning on bucket %s.", bucket.name)
    except ClientError:
        logger.exception("Couldn't enable versioning on bucket %s.", bucket.name)
        raise

    try:
        expiration = 7
        bucket.LifecycleConfiguration().put(
            LifecycleConfiguration={
                "Rules": [
                    {
                        "Status": "Enabled",
                        "Prefix": prefix,
                        "NoncurrentVersionExpiration": {"NoncurrentDays": expiration},
                    }
                ]
            }
        )
        logger.info(
            "Configured lifecycle to expire noncurrent versions after %s days "
            "on bucket %s.",
            expiration,
            bucket.name,
        )
    except ClientError as error:
        logger.warning(
            "Couldn't configure lifecycle on bucket %s because %s. "
            "Continuing anyway.",
            bucket.name,
            error,
        )

    return bucket
```

------

# Configurando a exclusão de MFA
<a name="MultiFactorAuthenticationDelete"></a>

Ao trabalhar com o Versionamento do S3 em buckets do Amazon S3, você pode, opcionalmente, adicionar outra camada de segurança configurando um bucket para habilitar a *exclusão de MFA (autenticação multifator)*. Quando você faz isso, o proprietário do bucket precisa incluir dois formulários de autenticação em qualquer solicitação para excluir uma versão ou modificar o estado de versionamento do bucket.

A exclusão de MFA requer autenticação adicional para uma das seguintes operações:
+ Alterar o estado de versionamento de seu bucket
+ Excluir, permanentemente, uma versão de objeto

A exclusão de MFA exige duas formas de autenticação:
+ Suas credenciais de segurança
+ A concatenação de um número serial válido, um espaço e o código de seis dígitos exibidos em um dispositivo de autenticação aprovado

A exclusão de MFA oferece segurança adicional se, por exemplo, suas credenciais de segurança forem comprometidas. A exclusão de MFA pode ajudar a evitar exclusões acidentais de bucket exigindo que o usuário que inicia a ação de exclusão para provar a posse física de um dispositivo MFA com um código MFA e adicionando uma camada extra de atrito e segurança à ação de exclusão.

Para identificar buckets que têm exclusão de MFA habilitada, você pode usar as métricas da Lente de Armazenamento do Amazon S3. A Lente de Armazenamento do S3 é um recurso de análise de armazenamento em nuvem que você pode usar para obter visibilidade em toda a organização sobre o uso e a atividade do armazenamento de objetos. Para obter mais informações, consulte [ Avaliar a atividade e o uso do armazenamento com o S3 Storage Lens](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html). Para obter uma lista completa de métricas, consulte o [Glossário de métricas da Lente de Armazenamento do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html).

O proprietário do bucket, a Conta da AWS que criou o bucket (conta raiz) e todos os usuários autorizados podem habilitar o versionamento. No entanto, somente o proprietário do bucket (conta raiz) pode habilitar a exclusão de MFA. Para obter mais informações, consulte a publicação [Proteção do acesso à AWS usando MFA](https://aws.amazon.com/blogs/security/securing-access-to-aws-using-mfa-part-3/) no Blog de segurança da AWS.

**nota**  
Para usar a exclusão de MFA com versionamento, habilite `MFA Delete`. No entanto, não é possível habilitar o `MFA Delete` usando o Console de gerenciamento da AWS. É necessário usar a AWS Command Line Interface (AWS CLI) ou API.   
Para obter exemplos de como usar a exclusão de MFA com versionamento, consulte a seção de exemplos no tópico [Habilitar o versionamento em buckets](manage-versioning-examples.md).  
Não é possível usar a exclusão de MFA com configurações de ciclo de vida. Para obter mais informações sobre as configurações de ciclo de vida e como elas interagem com outras configurações, consulte [Como o Ciclo de Vida do S3 interage com outras configurações de bucket](lifecycle-and-other-bucket-config.md).

Para ativar ou desativar a exclusão de MFA, use a mesma API usada para configurar o versionamento em um bucket. O Amazon S3 armazena a configuração de exclusão de MFA no mesmo sub-recurso de *versionamento* que armazena o status de versionamento do bucket.

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>VersioningState</Status>
  <MfaDelete>MfaDeleteState</MfaDelete>  
</VersioningConfiguration>
```

Para usar a exclusão de MFA, você pode usar um dispositivo de hardware ou MFA virtual para gerar um código de autenticação. O exemplo a seguir mostra um código de autenticação gerado exibido em um dispositivo de hardware.

![\[Um exemplo de um código de autenticação gerado que é exibido em um dispositivo de hardware.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/MFADevice.png)


A exclusão de MFA e o acesso à API protegido por MFA são recursos que visam fornecer proteção para diferentes cenários. Você configura a exclusão de MFA em um bucket para ajudar a garantir que os dados em seu bucket não sejam excluídos acidentalmente. O acesso à API protegido por MFA é usado para impor outro fator de autenticação (código MFA) ao acessar recursos confidenciais do Amazon S3. Você pode exigir que qualquer operação nesses recursos do Amazon S3 seja feita com credenciais temporárias criadas usando a MFA. Para ver um exemplo, consulte [Exigir MFA](example-bucket-policies.md#example-bucket-policies-MFA). 

Para obter mais informações sobre como comprar e ativar um dispositivo de autenticação, consulte [Autenticação multifator](https://aws.amazon.com/iam/details/mfa/).

## Como ativar o versionamento do S3 e configurar a exclusão de MFA
<a name="enable-versioning-mfa-delete"></a>

### Como usar o AWS CLI
<a name="enable-versioning-mfa-delete-cli"></a>

O número de série é o número que identifica exclusivamente o dispositivo de MFA. Para dispositivos físicos de MFA, esse é o número de série exclusivo fornecido com o dispositivo. Para dispositivos de MFA virtuais, o número de série é o respectivo ARN. Para usar os comandos a seguir, substitua os *espaços reservados para entrada do usuário* por suas próprias informações.

O exemplo a seguir habilita o versionamento do S3 e a exclusão da autenticação multifator (MFA) em um bucket para um dispositivo de MFA físico. Para dispositivos de MFA físicos, no parâmetro `--mfa`, envie uma concatenação do número de série do dispositivo de MFA, um caractere de espaço e o valor exibido em seu dispositivo de autenticação.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

O exemplo a seguir habilita o versionamento do S3 e a exclusão da autenticação multifator (MFA) em um bucket para um dispositivo de MFA virtual. Para dispositivos de MFA virtuais, no parâmetro `--mfa`, envie uma concatenação do ARN do dispositivo de MFA, um caractere de espaço e o valor exibido em seu dispositivo de autenticação.

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

Para ter mais informações, consulte o artigo do AWS rePost [Como faço para ativar a exclusão com MFA para meu bucket do Amazon S3?](https://repost.aws/knowledge-center/s3-bucket-mfa-delete).

### Uso da API REST
<a name="enable-versioning-mfa-delete-rest-api"></a>

Para obter mais informações sobre como especificar a exclusão de MFA usando a API REST do Amazon S3, consulte [PutBucketVersioning](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html) na *Referência de API do Amazon Simple Storage Service*.

# Trabalhar com objetos em um bucket com versionamento habilitado
<a name="manage-objects-versioned-bucket"></a>

Os objetos que são armazenados em um bucket do Amazon S3 antes da habilitação do versionamento têm um ID de versão `null`. Quando você habilita o versionamento, os objetos existentes em seu bucket não são alterados. O que muda é como o Amazon S3 trata os objetos em solicitações futuras.

**Fazer a transição de versões de objeto**  
Você pode definir as regras de configuração de ciclo de vida de objetos que têm ciclo de vida bem definido para fazer a transição de versões de objeto para a classe de armazenamento S3 Glacier Flexible Retrieval em um momento específico no ciclo de vida do objeto. Para obter mais informações, consulte [Gerenciar o ciclo de vida dos objetos](object-lifecycle-mgmt.md).

Os tópicos nesta seção explicam várias operações de objeto em um bucket com versionamento ativado. Para obter mais informações sobre versionamento, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md).

**Topics**
+ [Adicionar objetos a buckets com versionamento habilitado](AddingObjectstoVersioningEnabledBuckets.md)
+ [Listar objetos em um bucket com versionamento habilitado](list-obj-version-enabled-bucket.md)
+ [Recuperando versões de objeto de um bucket habilitado para versionamento](RetrievingObjectVersions.md)
+ [Excluir versões de objetos de um bucket com versionamento habilitado](DeletingObjectVersions.md)
+ [Configurando permissões de objeto com versão](VersionedObjectPermissionsandACLs.md)

# Adicionar objetos a buckets com versionamento habilitado
<a name="AddingObjectstoVersioningEnabledBuckets"></a>

Depois que você habilita o versionamento em um bucket, o Amazon S3 adiciona automaticamente um ID de versão exclusivo a cada objeto armazenado (usando `PUT`, `POST` ou `CopyObject`) no bucket. 

A figura a seguir mostra que o Amazon S3 adiciona um ID de versão exclusivo a um objeto quando ele é adicionado a um bucket com versionamento habilitado. 

![\[Ilustração de um ID de versão único adicionado a um objeto quando ele é colocado em um bucket com versionamento habilitado.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled.png)


**nota**  
Os valores de ID de versão que o Amazon S3 atribui são seguros para URL (podem ser incluídos como parte de um URI).

Para obter mais informações sobre versionamento, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md). Você pode adicionar versões de objeto a um bucket habilitado para versionamento usando o console, os AWS SDKs e a API REST.

## Usar o console do
<a name="add-obj-versioning-enabled-bucket-console"></a>

Para obter instruções, consulte [Fazer upload de objetos](upload-objects.md). 

## Uso da SDKs AWS
<a name="add-obj-versioning-enabled-bucket-sdk"></a>

Para ver exemplos de upload de objetos usando os AWS SDKs para Java, .NET e PHP, consulte [Fazer upload de objetos](upload-objects.md). Os exemplos de upload de objetos em buckets com e sem versionamento habilitado são os mesmos, embora o Amazon S3 atribua um número de versão para buckets com versionamento habilitado. Caso contrário, o número de versão é nulo. 

Para obter informações sobre o uso de outros AWS SDKs, consulte o [Centro do Desenvolvedor da AWS](https://aws.amazon.com/code/). 

## Uso dos REST API
<a name="add-obj-versioning-enabled-bucket-rest"></a>

**Para adicionar objetos a buckets com versionamento habilitado**

1. Ative o versionamento de um bucket usando uma solicitação `PutBucketVersioning`.

   Para obter mais informações, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html) na *Referência da API do Amazon Simple Storage Service*.

1. Envie uma solicitação `PUT`, `POST` ou `CopyObject` para armazenar um objeto no bucket.

Quando você adiciona um objeto a um bucket habilitado para versionamento, o Amazon S3 retorna o ID da versão do objeto no cabeçalho de resposta `x-amz-version-id`, como mostrado no exemplo a seguir.

```
1. x-amz-version-id: 3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY
```

# Listar objetos em um bucket com versionamento habilitado
<a name="list-obj-version-enabled-bucket"></a>

Esta seção fornece exemplos de como listar versões de objetos de um bucket com versionamento habilitado. O Amazon S3 armazena as informações de versão do objeto no sub-recurso *versões* associado ao bucket. Para obter mais informações, consulte [Opções de configuração de buckets de uso geral](UsingBucket.md#bucket-config-options-intro). Para listar os objetos em um bucket do com versionamento habilitado, a permissão `ListBucketVersions` é necessária.

## Usar o console do S3
<a name="view-object-versions"></a>

Siga estas etapas para usar o console do Amazon S3 para ver as diferentes versões de um objeto.

**Para ver várias versões de um objeto**

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Na lista **Buckets**, escolha o nome do bucket que contém o objeto.

1. Para ver uma lista das versões dos objetos no bucket, escolha a opção **Show versions** (Mostrar versões). 

   Para cada versão do objeto, o console exibe um ID de versão exclusivo, a data e a hora em que a versão do objeto foi criada e outras propriedades. (Os objetos armazenados em seu bucket antes da habilitação do versionamento têm um ID de versão **null [nulo]**.)

   Para listar os objetos sem as versões, escolha a opção **List versions (Listar versões)** .

Você também pode visualizar, fazer download e excluir versões do objeto no painel de visão geral do objeto no console. Para obter mais informações, consulte [Exibir propriedades do objeto no console do Amazon S3](view-object-properties.md).

**nota**  
 Para acessar versões de objetos anteriores a 300 versões, use a AWS CLI ou o URL do objeto.

**Importante**  
Você pode cancelar a exclusão de um objeto somente se ele foi excluído como a versão mais recente (atual). Não é possível cancelar a exclusão de uma versão anterior de um objeto que foi excluído. Para obter mais informações, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md).

## Uso da SDKs AWS
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

Os exemplos nesta seção mostram como recuperar uma listagem de objetos de um bucket com versionamento ativado. Cada solicitação retorna até 1.000 versões, a menos que você especifique um número menor. Se o bucket contiver mais versões que esse limite, envie uma série de solicitações para recuperar a lista de todas as versões. Esse processo de retornar resultados em “páginas” é chamado *paginação*.

Para mostrar como a paginação funciona, os exemplos limitam cada resposta a duas versões de objeto. Depois de recuperar a primeira página de resultados, cada exemplo verifica se a lista de versões foi truncada. Em caso afirmativo, o exemplo continua a recuperar páginas até que todas as versões tenham sido recuperadas. 

**nota**  
Os exemplos a seguir também funcionam com bucket sem versionamento, ou para objetos sem versões individuais. Nesses casos, o Amazon S3 retorna a listagem de objetos com um ID de versão `null`.

 Para obter informações sobre o uso de outros AWS SDKs, consulte o [Centro do Desenvolvedor da AWS](https://aws.amazon.com/code/). 

------
#### [ Java ]

Consulte instruções sobre como criar e testar uma amostra funcional em [Getting Started](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html) no Guia do desenvolvedor do AWS SDK para Java.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

Para obter informações sobre como configurar e executar exemplos de código, consulte [Conceitos básicos do AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) no *Guia do desenvolvedor do AWS SDK for .NET*. 

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## Uso da API REST
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example — Listar todas as versões de objeto em um bucket**  
Para listar todas as versões de todos os objetos em um bucket, você usa o sub-recurso `versions` em uma solicitação `GET Bucket`. O Amazon S3 pode recuperar no máximo 1.000 objetos, e cada versão de objeto conta como um objeto completo. Portanto, se um bucket contiver duas chaves (por exemplo, `photo.gif` e `picture.jpg`) e a primeira chave tiver 990 versões e a segunda chave tiver 400 versões, uma solicitação única recuperará as 990 versões de `photo.gif` e apenas as 10 versões mais recentes de `picture.jpg`.  
O Amazon S3 retorna as versões de objetos na ordem em que foram armazenadas, com as armazenadas mais recentemente sendo retornadas primeiro.  
Em uma solicitação `GET Bucket`, inclua o sub-recurso `versions`.  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example — Recuperar todas as versões de uma chave**  
 Para recuperar um subconjunto de versões de objeto, use os parâmetros de solicitação para `GET Bucket`. Para obter mais informações, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html).   

1. Defina o parâmetro `prefix` como a chave do objeto que você deseja recuperar.

1. Envie uma solicitação `GET Bucket` usando o sub-recurso `versions` e `prefix`.

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example — Recuperar objetos usando um prefixo**  
O exemplo a seguir recupera objetos cuja chave é ou começa com `myObject`.  

```
1. GET /?versions&prefix=myObject HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```
Você pode usar os outros parâmetros de solicitação para recuperar um subconjunto de todas as versões do objeto. Para obter mais informações, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) na *Referência da API do Amazon Simple Storage Service*.

**Example — Recuperar uma listagem de objetos adicionais se a resposta estiver truncada**  
Se o número de objetos que podem ser retornados em uma solicitação `GET` exceder o valor de `max-keys`, a resposta conterá `<isTruncated>true</isTruncated>` e incluirá a primeira chave (em `NextKeyMarker`) e o primeiro ID de versão (em `NextVersionIdMarker`) que satisfazem a solicitação, mas que não foram retornados. Você usa esses valores retornados como a posição de início em uma solicitação subsequente para recuperar os objetos adicionais que satisfazem a solicitação `GET`.   
Use o seguinte processo para recuperar os objetos adicionais que satisfazem a solicitação `GET Bucket versions` original de um bucket. Para obter mais informações sobre `key-marker`, `version-id-marker`, `NextKeyMarker` e `NextVersionIdMarker`, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) na *Referência da API do Amazon Simple Storage Service*.  
A seguir estão as respostas adicionais que atendem à solicitação `GET` original:  
+ Defina o valor de `key-marker` como a chave retornada em `NextKeyMarker` na resposta anterior.
+ Defina o valor de `version-id-marker` como o ID de versão retornado em `NextVersionIdMarker` na resposta anterior.
+ Envie uma solicitação `GET Bucket versions` usando `key-marker` e `version-id-marker`.

**Example — Recuperar objetos que começam com a chave e o ID de versão especificados**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

## Como usar o AWS CLI
<a name="list-obj-version-enabled-bucket-cli"></a>

O comando a seguir retorna os metadados de todas as versões dos objetos em um bucket. 

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

Para obter mais informações sobre `list-object-versions`, consulte [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html) na *Referência de comandos de AWS CLI*.

# Recuperando versões de objeto de um bucket habilitado para versionamento
<a name="RetrievingObjectVersions"></a>

O versionamento no Amazon S3 é uma maneira de manter várias variantes de um objeto no mesmo bucket. Uma solicitação `GET` simples recupera a versão atual de um objeto. A figura a seguir mostra como o `GET` retorna a versão atual do objeto, `photo.gif`.

![\[Ilustração de como GET retorna a versão atual do objeto.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_GET_NoVersionID.png)


Para recuperar uma versão específica, você tem que especificar seu ID de versão. A figura a seguir mostra que a solicitação `GET versionId` recupera a versão especificada do objeto (não necessariamente a versão atual).

![\[Ilustração de como a solicitação GET versionId recupera a versão especificada do objeto.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_GET_Versioned.png)


Você pode recuperar versões de objeto no Amazon S3 usando o console, os AWS SDKs ou a API REST.

**nota**  
 Para acessar versões de objetos anteriores a 300 versões, use a AWS CLI ou o URL do objeto.

## Usar o console do S3
<a name="retrieving-object-versions"></a>

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Na lista **Buckets**, escolha o nome do bucket que contém o objeto.

1. Na lista **Objetos** , escolha o nome do objeto.

1. Escolha **Versões**.

   O Amazon S3 mostra todas as versões do objeto.

1. Marque a caixa de seleção ao lado **do ID da versão** para as versões que deseja recuperar.

1. Escolha **Ações**, escolha **Download**e salve o objeto.

Você também pode visualizar, fazer download e excluir versões do objeto no painel de visão geral do objeto. Para obter mais informações, consulte [Exibir propriedades do objeto no console do Amazon S3](view-object-properties.md).

**Importante**  
Você pode cancelar a exclusão de um objeto somente se ele foi excluído como a versão mais recente (atual). Não é possível cancelar a exclusão de uma versão anterior de um objeto que foi excluído. Para obter mais informações, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md).

## Uso da SDKs AWS
<a name="retrieve-obj-version-sdks"></a>

Os exemplos para carregar objetos em buckets não versionados e habilitados para versionamento são os mesmos. No entanto, para buckets habilitados para versionamento, o Amazon S3 atribui um número de versão. Caso contrário, o número de versão é nulo.

Para obter exemplos de download de objetos usando AWS SDKs for Java, .NET e PHP, consulte [Download de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html).

Para obter exemplos de como listar a versão de objetos usando AWS SDKs para.NET e Rust, consulte [Listar a versão dos objetos em um bucket do Amazon S3](https://docs.aws.amazon.com/code-library/latest/ug/s3_example_s3_ListObjectVersions_section.html).

## Uso da API REST
<a name="retrieve-obj-version-rest"></a>

**Para recuperar uma versão específica do objeto**

1. Defina `versionId` como o ID da versão do objeto que você deseja recuperar.

1. Envie uma solicitação `GET Object versionId`.

**Example — Recuperar um objeto versionado**  
A seguinte solicitação recupera a versão `L4kqtJlcpXroDTDmpUMLUo` do `my-image.jpg`.  

```
1. GET /my-image.jpg?versionId=L4kqtJlcpXroDTDmpUMLUo HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

Você pode recuperar apenas os metadados de um objeto (não o conteúdo). Para obter mais informações, consulte [Recuperar metadados de uma versão de objeto](RetMetaOfObjVersion.md).

Para obter informações sobre como restaurar uma versão de objeto anterior, consulte [Restaurar versões anteriores](RestoringPreviousVersions.md).

# Recuperar metadados de uma versão de objeto
<a name="RetMetaOfObjVersion"></a>

Se você quiser recuperar apenas os metadados (e não o conteúdo) de um objeto, use a operação `HEAD`. Por padrão, você obtém os metadados da versão mais recente. Para recuperar os metadados de um objeto específico, você especifica seu ID de versão.

**Para recuperar os metadados de uma versão do objeto**

1. Defina `versionId` como o ID da versão do objeto cujos metadados você deseja recuperar.

1. Envie uma solicitação `HEAD Object versionId`.

**Example — Recuperar metadados de um objeto versionado**  
A solicitação a seguir recupera os metadados da versão `3HL4kqCxf3vjVBH40Nrjfkd` de `my-image.jpg`.  

```
1. HEAD /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

A seguir, um exemplo de resposta.

```
 1. HTTP/1.1 200 OK
 2. x-amz-id-2: ef8yU9AS1ed4OpIszj7UDNEHGran
 3. x-amz-request-id: 318BC8BC143432E5
 4. x-amz-version-id: 3HL4kqtJlcpXroDTDmjVBH40Nrjfkd
 5. Date: Wed, 28 Oct 2009 22:32:00 GMT
 6. Last-Modified: Sun, 1 Jan 2006 12:00:00 GMT
 7. ETag: "fba9dede5f27731c9771645a39863328"
 8. Content-Length: 434234
 9. Content-Type: text/plain
10. Connection: close
11. Server: AmazonS3
```

# Restaurar versões anteriores
<a name="RestoringPreviousVersions"></a>

Você pode usar o versionamento para recuperar versões anteriores de um objeto. Existem duas abordagens para se fazer isso:
+ Copie uma versão anterior do objeto para o mesmo bucket.

  O objeto copiado torna-se a versão atual desse objeto e todas as versões são preservadas.
+ Exclua permanentemente a versão atual do objeto.

  Quando você exclui a versão atual do objeto, torna a versão anterior a versão atual desse objeto.

Como todas as versões do objeto são preservadas, você pode fazer de qualquer versão anterior a versão atual copiando uma versão específica do objeto para o mesmo bucket. Na figura a seguir, o objeto de origem (ID = 111111) é copiado para o mesmo bucket. O Amazon S3 fornece um novo ID (88778877) e ele se torna a versão atual do objeto. Assim, o bucket tem tanto a versão original (111111) quanto a cópia (88778877) do objeto. Para obter mais informações sobre como obter uma versão anterior e carregá-la para torná-la a versão atual, consulte [Recuperação de versões de objeto de um bucket habilitado para versionamento](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RetrievingObjectVersions.html) e [Upload de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html).

![\[Ilustração da cópia de uma versão específica de um objeto no mesmo bucket para torná-la a versão atual.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_COPY2.png)


Um subsequente `GET` recupera a versão 88778877.

A figura a seguir mostra como excluir a versão atual (121212) de um objeto deixa a versão anterior (111111) como a atual do objeto. Para obter mais informações sobre como excluir um objeto, consulte [Excluir um único objeto](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-objects.html).

![\[Ilustração que mostra que a exclusão da versão atual de um objeto torna a versão anterior a atual.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_COPY_delete2.png)


Um subsequente `GET` recupera a versão 111111.

**nota**  
Para restaurar versões de objetos em lotes, [use a operação `CopyObject`](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-copy-object.html). A operação `CopyObject` copia cada objeto especificado no manifesto. No entanto, esteja ciente de que os objetos não são necessariamente copiados na mesma ordem em que estão listados no manifesto. Para buckets versionados, se preservar a ordem de versão atual/não atual for importante, você deve copiar todas as versões não atuais primeiro. Em seguida, após a conclusão do primeiro trabalho, copie as versões atuais em um trabalho subsequente.

## Para restaurar versões anteriores de objetos
<a name="restoring-obj-version-version-enabled-bucket-examples"></a>

Para ter mais informações sobre como restaurar objetos, consulte [How can I retrieve an Amazon S3 object that was deleted in a versioning-enabled bucket?](https://repost.aws/knowledge-center/s3-undelete-configuration) no Centro de Conhecimento do AWS re:Post.

### Usar o console do S3
<a name="retrieving-object-versions"></a>

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Na lista **Buckets**, escolha o nome do bucket que contém o objeto.

1. Na lista **Objetos** , escolha o nome do objeto.

1. Escolha **Versões**.

   O Amazon S3 mostra todas as versões do objeto.

1. Marque a caixa de seleção ao lado **do ID da versão** para as versões que deseja recuperar.

1. Escolha **Ações**, escolha **Download**e salve o objeto.

Você também pode visualizar, fazer download e excluir versões do objeto no painel de visão geral do objeto. Para obter mais informações, consulte [Exibir propriedades do objeto no console do Amazon S3](view-object-properties.md).

**Importante**  
Você pode cancelar a exclusão de um objeto somente se ele foi excluído como a versão mais recente (atual). Não é possível cancelar a exclusão de uma versão anterior de um objeto que foi excluído. Para obter mais informações, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md).

### Uso da SDKs AWS
<a name="restoring-obj-version-version-enabled-bucket-sdks"></a>

Para obter informações sobre o uso de outros AWS SDKs, consulte o [Centro do Desenvolvedor da AWS](https://aws.amazon.com/code/). 

------
#### [ Python ]

O exemplo de código Python a seguir restaura a versão anterior de um objeto versionado excluindo todas as versões criadas após a versão de reversão especificada.

```
def rollback_object(bucket, object_key, version_id):
    """
    Rolls back an object to an earlier version by deleting all versions that
    occurred after the specified rollback version.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that holds the object to roll back.
    :param object_key: The object to roll back.
    :param version_id: The version ID to roll back to.
    """
    # Versions must be sorted by last_modified date because delete markers are
    # at the end of the list even when they are interspersed in time.
    versions = sorted(
        bucket.object_versions.filter(Prefix=object_key),
        key=attrgetter("last_modified"),
        reverse=True,
    )

    logger.debug(
        "Got versions:\n%s",
        "\n".join(
            [
                f"\t{version.version_id}, last modified {version.last_modified}"
                for version in versions
            ]
        ),
    )

    if version_id in [ver.version_id for ver in versions]:
        print(f"Rolling back to version {version_id}")
        for version in versions:
            if version.version_id != version_id:
                version.delete()
                print(f"Deleted version {version.version_id}")
            else:
                break

        print(f"Active version is now {bucket.Object(object_key).version_id}")
    else:
        raise KeyError(
            f"{version_id} was not found in the list of versions for " f"{object_key}."
        )
```

------

# Excluir versões de objetos de um bucket com versionamento habilitado
<a name="DeletingObjectVersions"></a>

Você pode excluir versões de objeto de buckets do Amazon S3 sempre que desejar. Você também pode definir regras de configuração de ciclo de vida de objetos que têm um ciclo de vida bem definido para solicitar que o Amazon S3 expire as versões atuais dos objetos ou que remova permanentemente as versões anteriores dos objetos. Quando o bucket tem versionamento habilitado ou suspenso, as ações da configuração do ciclo de vida funcionam do seguinte modo:
+ A `Expiration` ação se aplica à versão atual do objeto. Em vez de excluir a versão atual do objeto, o Amazon S3 a retém como uma versão desatualizada adicionando um *marcador de exclusão*, que se torna a versão atual.
+ A ação `NoncurrentVersionExpiration` aplica-se a versões antigas do objeto, e o Amazon S3 remove permanentemente essas versões do objeto. Você não pode recuperar objetos removidos permanentemente.

Para obter mais informações sobre o Ciclo de Vida do S3, consulte [Gerenciar o ciclo de vida dos objetos](object-lifecycle-mgmt.md) e [Exemplos de configurações do Ciclo de Vida do S3](lifecycle-configuration-examples.md).

Para ver quantas versões de objetos atuais e desatualizadas seus buckets têm, você pode usar as métricas da Lente de Armazenamento do Amazon S3. A Lente de Armazenamento do S3 é um recurso de análise de armazenamento em nuvem que você pode usar para obter visibilidade em toda a organização sobre o uso e a atividade do armazenamento de objetos. Para obter mais informações, consulte [Usar a Lente de Armazenamento do S3 para otimizar os custos do armazenamento](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-optimize-storage.html?icmpid=docs_s3_user_guide_DeletingObjectVersions.html). Para obter uma lista completa de métricas, consulte o [Glossário de métricas da Lente de Armazenamento do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html).

**nota**  
 As taxas normais do Amazon S3 se aplicam a cada versão de um objeto armazenado e transferido, incluindo versões desatualizadas de objetos. Para obter mais informações, consulte [Preço do Amazon S3](https://aws.amazon.com/s3/pricing/). 

## Excluir casos de uso de solicitação
<a name="delete-request-use-cases"></a>

Uma solicitação `DELETE` tem os seguintes casos de uso:
+ Quando o versionamento está habilitado, um `DELETE` simples não pode excluir permanentemente um objeto. (Uma solicitação `DELETE` simples é uma solicitação que não especifica um ID de versão.) Em vez disso, o Amazon S3 insere um marcador de exclusão no bucket, que se torna a versão atual do objeto com um novo ID. 

  Quando você tenta um `GET` de um objeto cuja versão atual é um marcador de exclusão, o Amazon S3 se comporta como se o objeto tivesse sido excluído (mesmo que não tenha sido apagado) e retorna um erro 404. Para obter mais informações, consulte [Trabalhar com marcadores de exclusão](DeleteMarker.md).

  A figura a seguir mostra que uma simples solicitação `DELETE` não remove de fato o objeto especificado. Em vez disso, o Amazon S3 insere um marcador de exclusão.  
![\[Ilustração da inserção de um marcador de exclusão.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)
+ Para excluir objetos com versões permanentemente, você deve usar `DELETE Object versionId`.

  A figura a seguir mostra que excluir uma versão do objeto especificada remove permanentemente esse objeto.  
![\[Diagrama que mostra como DELETE Object versionId exclui permanentemente uma versão específica do objeto.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)

## Para excluir versões de objeto
<a name="delete-object-version"></a>

Você pode excluir versões de objeto no Amazon S3 usando o console, os AWS SDKs, a API REST ou a AWS Command Line Interface.

### Usar o console do S3
<a name="deleting-object-versions"></a>

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Na lista **Buckets**, escolha o nome do bucket que contém o objeto.

1. Na lista **Objetos** , escolha o nome do objeto.

1. Escolha **Versões**.

   O Amazon S3 mostra todas as versões do objeto.

1. Marque a caixa de seleção ao lado do **ID da versão** para as versões que deseja recuperar permanentemente.

1. Escolha **Excluir**.

1. Em **Excluir objetos permanentemente? **, insira **permanently delete**.
**Atenção**  
Quando você exclui permanentemente uma versão de objeto, a ação não pode ser desfeita.

1. Escolha **Delete objects (Excluir objetos)**.

   O Amazon S3 exclui a versão do objeto.

### Uso da SDKs AWS
<a name="delete-obj-version-version-enabled-bucket-sdks"></a>

Para ver exemplos de exclusão de objetos usando os AWS SDKs para Java, .NET e PHP, consulte [Excluir objetos do Amazon S3](DeletingObjects.md). Os exemplos para excluir objetos em buckets não versionados e habilitados para versionamento são os mesmos. No entanto, para buckets habilitados para versionamento, o Amazon S3 atribui um número de versão. Caso contrário, o número de versão é nulo. 

Para obter informações sobre o uso de outros AWS SDKs, consulte o [Centro do Desenvolvedor da AWS](https://aws.amazon.com/code/). 

------
#### [ Python ]

O exemplo de código Python a seguir exclui permanente um objeto versionado ao remover todas as suas versões.

```
def permanently_delete_object(bucket, object_key):
    """
    Permanently deletes a versioned object by deleting all of its versions.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to delete.
    """
    try:
        bucket.object_versions.filter(Prefix=object_key).delete()
        logger.info("Permanently deleted all versions of object %s.", object_key)
    except ClientError:
        logger.exception("Couldn't delete all versions of %s.", object_key)
        raise
```

------

### Uso da API REST
<a name="delete-obj-version-enabled-bucket-rest"></a>

**Como excluir uma versão específica de um objeto**
+ Em `DELETE`, especifique o ID da versão.

**Example — Excluir uma versão específica**  
O exemplo a seguir exclui a versão `UIORUnfnd89493jJFJ` do `photo.gif`.  

```
1. DELETE /photo.gif?versionId=UIORUnfnd89493jJFJ HTTP/1.1 
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 12 Oct 2009 17:50:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
5. Content-Type: text/plain
6. Content-Length: 0
```

### Como usar o AWS CLI
<a name="delete-obj-version-enabled-bucket-cli"></a>

O comando a seguir exclui um objeto chamado test.txt de um bucket chamado `amzn-s3-demo-bucket1`. Para remover uma versão específica de um objeto, você deve ser o proprietário do bucket e usar o sub-recurso de ID de versão.

```
aws s3api delete-object --bucket amzn-s3-demo-bucket1 --key test.txt --version-id versionID
```

Para obter mais informações sobre `delete-object`, consulte [https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) na *Referência de comandos da AWS CLI*.

Para obter mais informações sobre como excluir versões de objetos, consulte os seguintes tópicos:
+ [Trabalhar com marcadores de exclusão](DeleteMarker.md)
+ [Como remover marcadores de exclusão para tornar uma versão mais antiga atual](ManagingDelMarkers.md#RemDelMarker)
+ [Excluir um objeto de um bucket com exclusão de MFA habilitada](UsingMFADelete.md)

# Trabalhar com marcadores de exclusão
<a name="DeleteMarker"></a>

Um *marcador de exclusão* no Amazon S3 é um espaço reservado (ou marcador) para um objeto com versões que foi especificado em uma solicitação `DELETE` simples. Uma solicitação `DELETE` simples é uma solicitação que não especifica um ID de versão. Como o objeto está em um bucket com versionamento habilitado, o objeto não é excluído. Mas o marcador de exclusão faz com que o Amazon S3 se comporte como se o objeto tivesse sido excluído. É possível usar a chamada de API `DELETE` do Amazon S3 em um marcador de exclusão. Para isso, será necessário fazer a solicitação `DELETE` usando um usuário ou um perfil do AWS Identity and Access Management (IAM) com as permissões adequadas.

Um marcador de exclusão tem um *nome de chave* (ou *chave*) e um ID de versão como qualquer outro objeto. Contudo, um marcador de exclusão difere de outros objetos nas seguintes maneiras:
+ Um marcador de exclusão não tem dados associados a ele.
+ Um marcador de exclusão não está associado a um valor da lista de controle de acesso (ACL).
+ Se você emitir uma solicitação `GET` para um marcador de exclusão, a solicitação `GET` não recuperará nada porque um marcador de exclusão não tem dados. Especificamente, quando a solicitação `GET` não especifica um `versionId`, você recebe um erro 404 (não encontrado).

Os marcadores de exclusão acumulam uma cobrança mínima para armazenamento no Amazon S3. O tamanho de armazenamento de um marcador de exclusão é igual ao tamanho do nome da chave do marcador de exclusão. Um nome de chave é uma sequência de caracteres Unicode. A codificação UTF-8 para o nome da chave adiciona de 1 a 4 bytes de armazenamento ao bucket para cada caractere no nome. Os marcadores de exclusão são armazenados na classe de armazenamento S3 Standard. 

Se você quiser descobrir quantos marcadores de exclusão você tem e em qual classe de armazenamento eles estão armazenados, use a Lente de Armazenamento do Amazon S3. Para obter mais informações, consulte [Monitorar a atividade de armazenamento e o uso com a Lente de Armazenamento do Amazon S3](storage_lens.md) e [Glossário de métricas de lente de armazenamento do Amazon S3](storage_lens_metrics_glossary.md).

Para obter mais informações sobre nomes de chave, consulte [Nomear objetos do Amazon S3](object-keys.md). Para obter mais informações sobre exclusão de um marcador de exclusão, consulte [Gerenciamento de marcadores de exclusão](ManagingDelMarkers.md). 

Somente o Amazon S3 pode criar e excluir um marcador de exclusão, e ele faz isso sempre que você envia uma solicitação `DeleteObject` em um objeto em um bucket com versionamento habilitado ou suspenso. O objeto especificado na solicitação `DELETE` não é de fato excluído. Em vez disso, o marcador de exclusão torna-se a versão atual do objeto. O nome de chave (ou chave) do objeto torna-se a chave do marcador de exclusão. 

Ao obter um objeto sem especificar um `versionId` na solicitação, se a versão atual for um marcador de exclusão, o Amazon S3 responderá com o seguinte:
+ Um erro 404 (não encontrado)
+ Um cabeçalho de resposta, `x-amz-delete-marker: true`

Ao obter um objeto especificando um `versionId` na solicitação, se a versão especificada for um marcador de exclusão, o Amazon S3 responderá com o seguinte:
+ Um erro 405 (Método Não Permitido)
+ Um cabeçalho de resposta, `x-amz-delete-marker: true`
+ Um cabeçalho de resposta, `Last-Modified: timestamp` (somente ao usar as operações de API [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) ou [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html))

O cabeçalho de resposta `x-amz-delete-marker: true` mostra que o objeto acessado era um marcador de exclusão. Esse cabeçalho de resposta nunca retorna `false`, porque quando o valor é `false`, a versão atual ou especificada do objeto não é um marcador de exclusão.

O cabeçalho de resposta `Last-Modified` fornece a hora de criação dos marcadores de exclusão.

A figura a seguir mostra como uma chamada de API `GetObject` em um objeto, cuja versão atual é um marcador de exclusão, responde com um erro 404 (não encontrado), e o cabeçalho da resposta inclui `x-amz-delete-marker: true`.

![\[Ilustração de uma chamada GetObject para um marcador de exclusão que retorna um erro 404 (não encontrado).\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


Se você fizer uma chamada `GetObject` em um objeto especificando um `versionId` na solicitação e se a versão especificada for um marcador de exclusão, o Amazon S3 responderá com um erro 405 (método não permitido) e os cabeçalhos de resposta incluirão `x-amz-delete-marker: true` e `Last-Modified: timestamp`.

![\[Ilustração de uma chamada GetObject para um marcador de exclusão que retorna um erro 405 (método não permitido).\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound_405.png)


Mesmo que sejam substituídos, os marcadores de exclusão permanecem nas versões do objeto. O único modo de listar marcadores de exclusão (e outras versões de um objeto) é usando a solicitação [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html). Você pode fazer essa solicitação no Console de gerenciamento da AWS listando seus objetos em um bucket de uso geral e selecionando **Mostrar versões**. Para obter mais informações, consulte [Listar objetos em um bucket com versionamento habilitado](list-obj-version-enabled-bucket.md).

A figura a seguir mostra que uma solicitação [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) ou [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) não retorna objetos cuja versão atual é um marcador de exclusão.

![\[Ilustração que mostra como uma chamada ListObjectsV2 ou ListObjects não retorna nenhum marcador de exclusão.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_GETBucketwithDeleteMarkers.png)


# Gerenciamento de marcadores de exclusão
<a name="ManagingDelMarkers"></a>

## Como configurar o ciclo de vida para limpar marcadores de exclusão expirados automaticamente
<a name="LifecycleDelMarker"></a>

Em um marcador de exclusão de objeto expirado, todas as versões de objeto são excluídas e resta apenas um único marcador de exclusão. Se a configuração de ciclo de vida estiver definida para excluir versões atuais ou a ação `ExpiredObjectDeleteMarker` estiver explicitamente definida, o Amazon S3 removerá o marcador de exclusão do objeto expirado. Para ver um exemplo, consulte [Remover marcadores de exclusão de objetos expirados em um bucket com versionamento habilitado](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7). 

## Como remover marcadores de exclusão para tornar uma versão mais antiga atual
<a name="RemDelMarker"></a>

Quando você exclui um objeto em um bucket ativado para versionamento, todas as versões permanecem no bucket, e o Amazon S3 cria um marcador de exclusão para o objeto. Para cancelar a exclusão do objeto, você deve excluir esse marcador de exclusão. Para obter mais informações sobre versionamento e marcadores de exclusão, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md).

Para excluir permanentemente um marcador de exclusão, inclua seu respectivo ID de versão em uma solicitação `DeleteObject versionId`. A figura a seguir mostra como uma solicitação `DeleteObject versionId` simples remove, permanentemente, um marcador de exclusão.

![\[Ilustração da exclusão de um marcador de exclusão usando o respectivo ID da versão.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


O efeito da remoção do marcador de exclusão é que uma simples solicitação `GET` não recuperará o ID da versão atual do objeto (121212). 

**nota**  
Se você usar uma solicitação `DeleteObject` em que a versão atual seja um marcador de exclusão (sem especificar o ID da versão do marcador de exclusão), o Amazon S3 não excluirá o marcador de exclusão, mas outro marcador de exclusão `PUTs`.

Para excluir um marcador de exclusão com um ID de versão `NULL`, você deve aprovar o `NULL` como o ID da versão na solicitação `DeleteObject`. A figura a seguir mostra como uma simples solicitação `DeleteObject` feita sem um ID de versão em que a versão atual é um marcador de exclusão não remove nada. Em vez disso, ela adiciona um marcador de exclusão extra com um ID de versão exclusivo (7498372).

![\[Ilustração da exclusão de um marcador de exclusão usando um ID de versão NULL.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## Usar o console do S3
<a name="undelete-objects"></a>

Use as etapas a seguir para recuperar objetos excluídos que não são pastas do seu bucket do S3, incluindo objetos que estão dentro dessas pastas. 

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Na lista **Buckets**, escolha o nome do bucket desejado.

1. Para ver uma lista das **versões** dos objetos no bucket, escolha a opção **List versions (Listar versões)**. Você conseguirá ver os marcadores de exclusão dos objetos excluídos. 

   

1. Para cancelar a exclusão de um objeto, você deve excluir o marcador de exclusão. Marque a caixa de seleção ao lado do **delete marker (marcador de exclusão)** do objeto a ser recuperado e escolha **Delete (excluir)**.

1. Confirme a exclusão na página **Delete objects (Excluir objetos)**.

   1. Para a opção **Permanently delete objects?** (Excluir objetos permanentemente?), insira **permanently delete**.

   1. Escolha **Delete objects (Excluir objetos)**.

**nota**  
Você não pode usar o console do Amazon S3 para cancelar a exclusão de pastas. Você deve usar a AWS CLI ou o SDK. Para ver exemplos, consulte [Como faço para recuperar um objeto do Amazon S3 que foi excluído em um bucket habilitado para versionamento?](https://aws.amazon.com/premiumsupport/knowledge-center/s3-undelete-configuration/) na Central de Conhecimento da AWS.

## Uso dos REST API
<a name="delete-marker-rest-api"></a>

**Para remover permanentemente um marcador de exclusão**

1. Defina `versionId` como o ID da versão do marcador de exclusão que você deseja remover.

1. Envie uma solicitação `DELETE Object versionId`.

**Example — Remover um marcador de exclusão**  
O exemplo a seguir remove o marcador de exclusão de `photo.gif` com versão 4857693.  

```
1. DELETE /photo.gif?versionId=4857693 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

Quando você exclui um marcador de exclusão, o Amazon S3 inclui o seguinte na resposta:

```
1. 204 NoContent 
2. x-amz-version-id: versionID 
3. x-amz-delete-marker: true
```

## Uso da SDKs AWS
<a name="remove-delete-marker-examples-sdk"></a>

Para obter informações sobre o uso de outros AWS SDKs, consulte o [Centro do Desenvolvedor da AWS](https://aws.amazon.com/code/).

------
#### [ Python ]

O exemplo de código Python a seguir demonstra como remover um marcador de exclusão de um objeto e, portanto, transforma a versão não atual mais recente na versão atual do objeto.

```
def revive_object(bucket, object_key):
    """
    Revives a versioned object that was deleted by removing the object's active
    delete marker.
    A versioned object presents as deleted when its latest version is a delete marker.
    By removing the delete marker, we make the previous version the latest version
    and the object then presents as *not* deleted.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to revive.
    """
    # Get the latest version for the object.
    response = s3.meta.client.list_object_versions(
        Bucket=bucket.name, Prefix=object_key, MaxKeys=1
    )

    if "DeleteMarkers" in response:
        latest_version = response["DeleteMarkers"][0]
        if latest_version["IsLatest"]:
            logger.info(
                "Object %s was indeed deleted on %s. Let's revive it.",
                object_key,
                latest_version["LastModified"],
            )
            obj = bucket.Object(object_key)
            obj.Version(latest_version["VersionId"]).delete()
            logger.info(
                "Revived %s, active version is now %s  with body '%s'",
                object_key,
                obj.version_id,
                obj.get()["Body"].read(),
            )
        else:
            logger.warning(
                "Delete marker is not the latest version for %s!", object_key
            )
    elif "Versions" in response:
        logger.warning("Got an active version for %s, nothing to do.", object_key)
    else:
        logger.error("Couldn't get any version info for %s.", object_key)
```

------

# Excluir um objeto de um bucket com exclusão de MFA habilitada
<a name="UsingMFADelete"></a>

Quando você configura a exclusão de MFA, somente o usuário-raiz pode excluir permanentemente as versões do objeto ou alterar a configuração de versão no seu bucket do S3. Você deve usar um dispositivo de MFA para autenticar o usuário-raiz para realizar a ação de exclusão.

Se a configuração de versionamento do bucket tiver a exclusão de MFA ativada, o proprietário do bucket deverá incluir o cabeçalho de solicitação `x-amz-mfa` nas solicitações para excluir permanentemente uma versão de objeto ou alterar o estado de versionamento do bucket. As solicitações que incluem `x-amz-mfa` devem usar HTTPS.

O valor do cabeçalho é uma concatenação do número de série do seu dispositivo de autenticação, um espaço e o código de autenticação exibido nele. Se você não incluir esse cabeçalho, a solicitação falhará.

Ao usar a AWS CLI, inclua as mesmas informações do valor do parâmetro `mfa`.

Para obter mais informações sobre dispositivos de autenticação, consulte [Autenticação multifator](https://aws.amazon.com/iam/details/mfa/).

Para obter mais informações sobre ativação de exclusão de MFA, consulte [Configurando a exclusão de MFA](MultiFactorAuthenticationDelete.md).

**nota**  
Não é possível usar o Console de gerenciamento da AWS para excluir um objeto em um bucket com versionamento habilitado que tem exclusão de MFA.

## Como usar o AWS CLI
<a name="MFADeleteCLI"></a>

Para excluir um objeto em um bucket com versionamento habilitado que tem exclusão de MFA habilitada, use o comando a seguir. Ao usar o comando de exemplo a seguir, substitua os `user input placeholders` por suas próprias informações.

```
 aws s3api delete-object --bucket amzn-s3-demo-bucket --key OBJECT-KEY --version-id "VERSION ID" --mfa "MFA_DEVICE_SERIAL_NUMBER MFA_DEVICE_CODE"						
```

## Uso da API REST
<a name="MFADeleteAPI"></a>

O exemplo a seguir exclui `my-image.jpg` (com a versão especificada), que está em um bucket configurado com a exclusão de MFA habilitada. 

Para ter mais informações, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html) na “Referência de API do Amazon Simple Storage Service”.

```
1. DELETE /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTPS/1.1
2. Host: bucketName.s3.amazonaws.com
3. x-amz-mfa: 20899872 301749
4. Date: Wed, 28 Oct 2009 22:32:00 GMT
5. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

# Configurando permissões de objeto com versão
<a name="VersionedObjectPermissionsandACLs"></a>

As permissões para objetos no Amazon S3 são definidas no nível de versão. Cada versão tem seu próprio proprietário do objeto. A Conta da AWS que cria a versão do objeto é a proprietária. Assim, você pode definir diferentes permissões para diferentes versões do mesmo objeto. Para fazer isso, você deve especificar o ID da versão do objeto cujas permissões você deseja definir em uma solicitação `PUT Object versionId acl`. Para uma descrição detalhada e instruções de uso de ACLs, consulte [Gerenciamento de identidade e acesso para o Amazon S3](security-iam.md).

**Example : configurar permissões para uma versão de objeto**  
A solicitação a seguir define a permissão do beneficiário com o ID de usuário canônico *b4bf1b36f9716f094c3079dcf5ac9982d4f2847de46204d47448bc557fb5ac2a* como `FULL_CONTROL` na chave `my-image.jpg`, ID de versão `3HL4kqtJvjVBH40Nrjfkd`.  

```
 1. PUT /my-image.jpg?acl&versionId=3HL4kqtJvjVBH40Nrjfkd HTTP/1.1
 2. Host: bucket.s3.amazonaws.com
 3. Date: Wed, 28 Oct 2009 22:32:00 GMT
 4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
 5. Content-Length: 124
 6.  
 7. <AccessControlPolicy>
 8.   <Owner>
 9.     <ID>75cc57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
10.   </Owner>
11.   <AccessControlList>
12.     <Grant>
13.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
14.         <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
15.       </Grantee>
16.       <Permission>FULL_CONTROL</Permission>
17.     </Grant>
18.   </AccessControlList>
19.   </AccessControlPolicy>
```

Da mesma forma, para obter permissões para uma versão específica do objeto, você deve especificar seu ID de versão em uma solicitação `GET Object versionId acl`. Você precisa incluir o ID da versão porque, por padrão, o `GET Object acl` retorna as permissões da versão atual do objeto. 

**Example — Recuperar permissões para uma versão especificada de objeto**  
No exemplo a seguir, o Amazon S3 retorna as permissões da chave, `my-image.jpg`, ID da versão, `DVBH40Nr8X8gUMLUo`.  

```
1. GET /my-image.jpg?versionId=DVBH40Nr8X8gUMLUo&acl HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU
```

Para obter mais informações, consulte [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html) na *Referência da API do Amazon Simple Storage Service*.

# Trabalhar com objetos em um bucket com versionamento suspenso
<a name="VersionSuspendedBehavior"></a>

No Amazon S3, você pode suspender o versionamento para parar de ter novas versões do mesmo objeto em um bucket. Você pode fazer isso porque você quer apenas uma única versão de um objeto em um bucket. Ou talvez você não queira acumular cobranças para várias versões. 

Quando você suspende o versionamento, os objetos existentes em seu bucket não são alterados. O que muda é como o Amazon S3 trata os objetos em solicitações futuras. Os tópicos nesta seção explicam várias operações de objeto em um bucket suspenso de versão, incluindo adição, recuperação e exclusão de objetos.

Para obter mais informações sobre o S3 Versioning, consulte [Reter várias versões de objetos com o Versionamento do S3](Versioning.md). Para obter mais informações sobre como recuperar as versões de um objeto, consulte [Recuperando versões de objeto de um bucket habilitado para versionamento](RetrievingObjectVersions.md).

**Topics**
+ [Adicionar objetos a buckets com versionamento suspenso](AddingObjectstoVersionSuspendedBuckets.md)
+ [Recuperar objetos de buckets com versionamento suspenso](RetrievingObjectsfromVersioningSuspendedBuckets.md)
+ [Excluir objetos de buckets com versionamento suspenso](DeletingObjectsfromVersioningSuspendedBuckets.md)

# Adicionar objetos a buckets com versionamento suspenso
<a name="AddingObjectstoVersionSuspendedBuckets"></a>

Você pode adicionar objetos a buckets com versionamento suspenso no Amazon S3 para criar o objeto com um ID de versão nulo ou substituir qualquer versão de objeto por um ID de versão correspondente.

Depois que você suspender o versionamento em um bucket, o Amazon S3 adicionará automaticamente um ID de versão `null` a cada objeto subsequente armazenado depois disso (usando `PUT`, `POST` ou `CopyObject`) nesse bucket.

A figura a seguir mostra como o Amazon S3 adiciona um ID de versão `null` a cada objeto quando ele é adicionado a um bucket com versionamento suspenso.

![\[Amazon S3 adicionando o ID de versão null a uma representação gráfica do objeto.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended.png)


Se um versão nula já existir no bucket e você adicionar outro objeto com a mesma chave, o objeto adicionado substituirá a versão original nula. 

Se existirem objetos com versões no bucket, a versão que você usa no `PUT` torna-se a versão atual do objeto. A figura a seguir mostra como a adição de um objeto a um bucket que contém objetos com versões não substitui o objeto já existente no bucket. 

Neste caso, a versão 111111 já estava no bucket. O Amazon S3 anexa o ID de versão nula ao objeto que está sendo adicionado e armazena o objeto no bucket. A versão 111111 não é substituída.

![\[Amazon S3 adicionando o ID de versão null a um objeto sem sobrescrever a representação gráfica da versão 111111.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended3.png)


Se uma versão nula já existir em um bucket, a versão nula será substituída, como mostrado na figura a seguir.

![\[Amazon S3 adicionando o ID de versão null a um objeto enquanto sobrescreve a representação gráfica do conteúdo original.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended4.png)


Embora a chave e o ID (`null`) da versão nula sejam iguais antes e depois de `PUT`, o conteúdo da versão nula originalmente armazenado no bucket é substituído pelo conteúdo do objeto `PUT` no bucket.

# Recuperar objetos de buckets com versionamento suspenso
<a name="RetrievingObjectsfromVersioningSuspendedBuckets"></a>

Uma solicitação `GET Object` retorna a versão atual de um objeto sempre independentemente de você ter ou não ativado o versionamento de um bucket. A figura a seguir mostra como um `GET` simples retorna a versão atual de um objeto.

![\[Ilustração que mostra como um GET simples retorna a versão atual do objeto.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_GET_suspended.png)


# Excluir objetos de buckets com versionamento suspenso
<a name="DeletingObjectsfromVersioningSuspendedBuckets"></a>

Você pode excluir objetos de buckets com versionamento suspenso para remover um objeto com um ID de versão nulo.

Se o versionamento for suspenso para um bucket, uma `DELETE` solicitação:
+ Pode remover apenas um objeto cujo ID de versão seja `null`.
+ Não removerá nada se não existir uma versão nula do objeto no bucket.
+ Insere um marcador de exclusão no bucket.

Se o versionamento do bucket for suspenso, a operação removerá o objeto que tem um `versionId` nulo. Quando existe um ID de versão, o Amazon S3 insere um marcador de exclusão que se torna a versão atual do objeto. A figura a seguir mostra como um `DELETE` simples remove uma versão nula, e o Amazon S3 insere um marcador de exclusão em seu lugar com um ID de versão `null`.

![\[Ilustração de uma exclusão simples para remover um objeto com um ID de versão NULL.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspended.png)


Para excluir permanentemente um objeto que tenha um `versionId`, você deve incluir o `versionId` do objeto na solicitação. Como um marcador de exclusão não contém nenhum conteúdo, você perderá o conteúdo da versão `null` quando um marcador de exclusão a substituir.

A figura a seguir mostra um bucket que não tem uma versão nula. Nesse caso, `DELETE` não remove nada. Em vez disso, o Amazon S3 apenas insere um marcador de exclusão.

![\[Ilustração da inserção de um marcador de exclusão.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspendedNoNull.png)


Mesmo em um bucket com versionamento suspenso, o proprietário do bucket pode excluir permanentemente uma versão especificada incluindo o ID da versão na solicitação `DELETE`, a menos que as permissões para a solicitação `DELETE` tiverem sido explicitamente negadas. Por exemplo, para negar a exclusão de qualquer objeto que tenha um ID de versão `null`, é necessário negar explicitamente as permissões `s3:DeleteObject` e `s3:DeleteObjectVersions`.

A figura a seguir mostra que excluir uma versão do objeto especificada remove permanentemente essa versão do objeto. Apenas o proprietário do bucket pode excluir uma versão de objeto especificada.

![\[Ilustração da exclusão permanente de um objeto usando um ID de versão especificado.\]](http://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


# Solucionar problemas de versionamento
<a name="troubleshooting-versioning"></a>

Os tópicos a seguir podem ajudar a solucionar alguns problemas comuns de versionamento do Amazon S3.

**Topics**
+ [Quero recuperar objetos que foram excluídos acidentalmente em um bucket com versionamento ativado](#recover-objects)
+ [Quero excluir permanentemente objetos com versionamento](#delete-objects-permanent)
+ [Ocorreu uma degradação do desempenho depois de ativar o versionamento do bucket](#performance-degradation)

## Quero recuperar objetos que foram excluídos acidentalmente em um bucket com versionamento ativado
<a name="recover-objects"></a>

Em geral, quando as versões do objeto são excluídas dos buckets do S3, não há como o Amazon S3 recuperá-las. No entanto, se você habilitou o versionamento do S3 no bucket do S3, uma solicitação `DELETE` que não especifica um ID de versão não pode excluir permanentemente um objeto. Em vez disso, um marcador de exclusão é adicionado como espaço reservado. Esse marcador de exclusão torna-se a versão atual de objeto. 

Para verificar se os objetos excluídos foram excluídos permanentemente ou temporariamente (com um marcador de exclusão em seu lugar), faça o seguinte: 

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. No painel de navegação à esquerda, escolha **Buckets**.

1. Na lista **Buckets**, escolha o nome do bucket que contém o objeto.

1. Na lista **Objetos**, ative a opção **Mostrar versões** à direita da barra de pesquisa e, depois, pesquise o objeto excluído na barra de pesquisa. Essa alternância estará disponível somente se o versionamento tiver sido habilitado anteriormente no bucket.

   Você também pode usar o [Inventário do S3 para pesquisar objetos excluídos](storage-inventory.md#storage-inventory-contents).

1. Se você não conseguir encontrar o objeto depois de ativar **Mostrar versões** ou criar um relatório de inventário, e também não conseguir encontrar um [marcador de exclusão](DeleteMarker.md) do objeto, a exclusão será permanente e o objeto não poderá ser recuperado.



Você também pode verificar o status de um objeto excluído usando a operação de API `HeadObject` do AWS Command Line Interface (AWS CLI). Para fazer isso, use o comando `head-object` a seguir e substitua `user input placeholders` por suas próprias informações: 

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html`

Se você executar o comando `head-object` em um objeto com versionamento, cuja versão atual é um marcador de exclusão, você receberá um erro 404 Não encontrado. Por exemplo: 

Ocorreu um erro (404) ao chamar a operação HeadObject: não encontrado

Se você executar o comando `head-object` em um objeto com versionamento e fornecer o ID da versão do objeto, o Amazon S3 recuperará os metadados do objeto, confirmando que ele ainda existe e não foi excluído permanentemente.

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

```
{
"AcceptRanges": "bytes",
"ContentType": "text/html",
"LastModified": "Thu, 16 Apr 2015 18:19:14 GMT",
"ContentLength": 77,
"VersionId": "Zg5HyL7m.eZU9iM7AVlJkrqAiE.0UG4q",
"ETag": "\"30a6ec7e1a9ad79c203d05a589c8b400\"",
"Metadata": {}
}
```

Se o objeto for encontrado e a versão mais recente for um marcador de exclusão, a versão anterior do objeto ainda existirá. Como o marcador de exclusão é a versão atual do objeto, você pode recuperá-lo excluindo o marcador de exclusão. 

Depois de remover permanentemente o marcador de exclusão, a segunda versão mais recente do objeto se torna a versão atual dele, tornando-o disponível novamente. Para obter uma descrição visual de como os objetos são recuperados, consulte [Remover marcadores de exclusão](ManagingDelMarkers.md#RemDelMarker).

Para remover uma versão específica de um objeto, você deve ser o proprietário do bucket. Para excluir permanentemente um marcador de exclusão, inclua seu respectivo ID de versão em uma solicitação `DeleteObject`. Para excluir o marcador de exclusão, use o comando a seguir e substitua `user input placeholders` por suas próprias informações: 

****  
`aws s3api delete-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

Para obter mais informações sobre o comando `delete-object`, consulte [https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html) na *Referência de comandos da AWS CLI*. Para obter mais informações sobre como excluir permanentemente os marcadores de exclusão, consulte [Gerenciamento de marcadores de exclusão](ManagingDelMarkers.md).

## Quero excluir permanentemente objetos com versionamento
<a name="delete-objects-permanent"></a>

Em um bucket com versionamento, uma solicitação `DELETE` sem um ID de versão não pode excluir permanentemente um objeto. Em vez disso, essa solicitação insere um marcador de exclusão.

Para excluir permanentemente objetos com versionamento, você pode escolher entre os seguintes métodos:
+ Crie uma regra de ciclo de vida do S3 para excluir permanentemente as versões não atuais. Para excluir permanentemente versões não atuais de objetos, selecione **Excluir permanentemente versões não atuais de objetos**, e insira um número em **Dias após os objetos ficarem desatualizados**. Opcionalmente, você pode especificar o número de versões mais recentes a serem retidas inserindo um valor em **Number of newer versions to retain** (Número de versões mais novas a serem mantidas). Para obter mais informações sobre como criar essa regra, consulte [Definir uma configuração de ciclo de vida do S3](how-to-set-lifecycle-configuration-intro.md).
+ Exclua uma versão especificada incluindo o ID da versão na solicitação `DELETE`. Para obter mais informações, consulte [Como excluir permanentemente objetos com versionamento](DeletingObjectVersions.md#delete-request-use-cases).
+ Crie uma regra de ciclo de vida para expirar as versões atuais. Para expirar as versões atuais dos objetos, selecione **Expirar versões atuais de objetos** e adicione um número em **Dias após a criação do objeto**. Para obter mais informações sobre como criar essa regra de ciclo de vida, consulte [Definir uma configuração de ciclo de vida do S3](how-to-set-lifecycle-configuration-intro.md).
+ Para excluir permanentemente todos os objetos com versionamento e excluir marcadores, crie duas regras de ciclo de vida: uma para expirar as versões atuais e excluir permanentemente as versões não atuais dos objetos, e outra para excluir marcadores de exclusão de objetos expirados.

Em um bucket com versionamento ativado, uma solicitação `DELETE` que não especifica um ID de versão pode remover somente objetos com um ID de versão `NULL`. Se o objeto foi carregado quando o versionamento estava ativado, uma solicitação `DELETE` que não especifica um ID de versão cria um marcador de exclusão desse objeto.

**nota**  
Para buckets com o bloqueio de objetos do S3 ativado, uma solicitação de `DELETE` objeto com um ID de versão de objeto protegido causa um erro 403 Acesso negado. Uma solicitação de `DELETE` objeto sem um ID de versão adiciona um marcador de exclusão como a versão mais recente do objeto com uma resposta 200 OK. Objetos protegidos pelo bloqueio de objetos não podem ser excluídos permanentemente até que seus períodos de retenção e retenções legais sejam removidos. Para obter mais informações, consulte [Como o bloqueio de objetos do S3 funciona](object-lock.md#object-lock-overview).

## Ocorreu uma degradação do desempenho depois de ativar o versionamento do bucket
<a name="performance-degradation"></a>

A degradação do desempenho poderá ocorrer em buckets com versionamento ativado se houver muitos marcadores de exclusão ou objetos com versionamento e se as práticas recomendadas não forem seguidas.

**Marcadores de exclusão em excesso**  
Depois que você habilita o versionamento em um bucket, uma solicitação `DELETE` sem um ID de versão feita a um objeto cria um marcador de exclusão com um ID de versão exclusivo. As configurações do ciclo de vida com a regra **Expirar versões atuais de objetos** adicionam um marcador de exclusão com um ID de versão exclusivo a cada objeto. Marcadores de exclusão excessivos podem reduzir o desempenho no bucket.

Quando o versionamento é suspenso em um bucket, o Amazon S3 marca o ID da versão como `NULL` em objetos recém-criados. Uma ação de expiração em um bucket com versionamento suspenso faz com que o Amazon S3 crie um marcador de exclusão com `NULL` como o ID da versão. Em um bucket com versionamento suspenso, um marcador de exclusão `NULL` é criado para qualquer solicitação de exclusão. Esses marcadores de exclusão `NULL` também são chamados de marcadores de exclusão de objeto expirado quando todas as versões de objeto são excluídas e resta apenas um único marcador de exclusão. Se muitos marcadores de exclusão `NULL` se acumularem, ocorrerá uma degradação do desempenho no bucket.

**Objetos com versionamento em excesso**  
Se um bucket com versionamento ativado contiver objetos com milhões de versões, poderá ocorrer um aumento nos erros 503 Serviço indisponível. Se você perceber um aumento significativo do número de respostas HTTP 503 Serviço indisponível recebidas para solicitações `PUT` ou `DELETE` de objetos a um bucket com o versionamento ativado, talvez tenha um ou mais objetos no bucket com milhões de versões. Quando você tem objetos com milhões de versões, o Amazon S3 limita automaticamente as solicitações ao bucket. As solicitações de controle de utilização protegem o bucket de uma quantidade excessiva de tráfego de solicitação, o que pode potencialmente impedir outras solicitações feitas ao mesmo bucket. 

Para determinar quais objetos têm milhões de versões, use o inventário do S3. O inventário do S3 gera um relatório que fornece uma lista de arquivos simples dos objetos em um bucket. Para obter mais informações, consulte [Catalogar e analisar seus dados com o Inventário S3](storage-inventory.md).

Para verificar se há um grande número de objetos com versionamento no bucket, use as métricas da Lente de Armazenamento do S3 para visualizar a **Contagem de objetos da versão atual**, o **Número de objetos de versões não atuais** e a **Contagem de objetos do marcador de exclusão**. Para obter mais informações sobre métricas da Lente de Armazenamento, consulte [Glossário de métricas de lente de armazenamento do Amazon S3](storage_lens_metrics_glossary.md).

A equipe do Amazon S3 incentiva os clientes a investigarem aplicações que sobrescrevem repetidamente o mesmo objeto, criando potencialmente milhões de versões desse objeto, para determinar se a aplicação está funcionando conforme o esperado. Por exemplo, uma aplicação que sobrescreve o mesmo objeto a cada minuto durante uma semana pode criar mais de dez mil versões. Recomendamos armazenar menos de cem mil versões para cada objeto. Se você tiver um caso de uso que exija milhões de versões para um ou mais objetos, entre em contato com a equipe do AWS Support a fim de obter ajuda para determinar uma solução melhor.

**Práticas recomendadas**  
Para evitar problemas de degradação do desempenho relacionada ao versionamento, recomendamos aplicar as seguintes práticas recomendadas:
+ Habilite uma regra de ciclo de vida para expirar as versões anteriores dos objetos. Por exemplo, você pode criar uma regra de ciclo de vida para expirar versões não atuais após 30 dias de inatividade do objeto. Você também poderá manter várias versões não atuais se não quiser excluir todas elas. Para obter mais informações, consulte [Definir uma configuração do ciclo de vida do S3](how-to-set-lifecycle-configuration-intro.md).
+ Habilite uma regra de ciclo de vida para excluir marcadores de exclusão de objetos expirados que não tenham objetos de dados associados no bucket. Para obter mais informações, consulte [Remover marcadores de exclusão de objeto expirado](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7).

Para ver mais práticas recomendadas de otimização de desempenho do Amazon S3, consulte [Padrões de design de melhores práticas](optimizing-performance.md).