Quero recuperar um objeto que foi excluído do meu bucket de uso geral do Amazon Simple Storage Service (Amazon S3) com o versionamento ativado.
Breve descrição
Observação: o versionamento do S3 está disponível somente para buckets de uso geral. Os buckets de diretórios e tabelas não oferecem suporte ao versionamento do S3.
Quando você exclui um objeto de um bucket ativado para versionamento, o Amazon S3 cria um marcador de exclusão para o objeto. O marcador de exclusão se torna a versão atual do objeto e o objeto se torna a versão anterior. Com um marcador de exclusão, o Amazon S3 responde às solicitações do objeto como se ele tivesse sido excluído. Por exemplo, se você enviar uma solicitação GET para o objeto, o Amazon S3 retorna um erro.
Para recuperar um objeto que foi excluído de um bucket ativado para versionamento, conclua uma das seguintes tarefas:
- Baixe a versão anterior do objeto. Você deve ter a permissão s3:GetObjectVersion.
- Use uma conta da AWS que tenha a permissão s3:DeleteObjectVersion para remover um marcador de exclusão. A versão mais recente não excluída então se torna a versão atual do objeto para que seja possível acessar o objeto excluído anteriormente em um bucket versionado.
- Observação: se você configurou a exclusão com autenticação multifator (MFA) no bucket, deve usar a MFA para remover o marcador de exclusão.
Resolução
Importante: não é possível recuperar dados que você exclui permanentemente de um bucket.
Use o console do Amazon S3 para baixar a versão anterior do objeto
Conclua as etapas a seguir:
- Abra o console do Amazon S3.
- No painel de navegação, clique em Buckets e selecione o bucket do objeto excluído.
- Para ver uma lista das versões do objeto, ative Mostrar versões.
- Selecione a versão do objeto excluído que você deseja recuperar.
- Selecione Ações e, em seguida, clique em Baixar.
Use a AWS CLI para baixar a versão anterior do objeto
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI. Nos comandos a seguir, substitua DOC-EXAMPLE-BUCKET pelo nome do seu bucket.
Conclua as etapas a seguir:
-
Execute o comando list-object-versions para listar as versões do objeto:
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/
Observação: o comando anterior inclui a opção --prefix para filtrar os resultados para o prefixo do nome de chave especificado. Use essa opção para reduzir o número de resultados quando seu bucket contiver muitas versões de objetos.
-
Na saída do comando, anote o ID da versão anterior do objeto.
-
Execute o comando get-object para recuperar a versão:
aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id example.d6tjAKF1iObKbEnNQkIMPjj filename.txt
Use o console do Amazon S3 para remover o marcador de exclusão
Conclua as etapas a seguir:
- Na conta que possui o bucket do objeto excluído, abra o console do Amazon S3.
- No painel de navegação, clique em Buckets e selecione o bucket do objeto excluído.
- Para ver uma lista das versões do objeto, ative Mostrar versões.
- Selecione o Marcador de exclusão do objeto.
Importante: certifique-se de selecionar o marcador de exclusão e não o objeto em si. Caso contrário, não será possível recuperar o objeto.
- Na página Excluir objetos, em Excluir objetos permanentemente?, insira excluir permanentemente.
- Clique em Excluir.
Importante: não é possível usar o console do Amazon S3 para recuperar pastas. Em vez disso, você deve usar a AWS CLI ou o AWS SDK.
Use a AWS CLI para remover o marcador de exclusão
É possível usar a AWS CLI para remover o marcador de exclusão em vários objetos, milhares de objetos ou milhões de objetos.
Remova o marcador de exclusão em vários objetos
Conclua as etapas a seguir:
-
Execute o comando list-object-versions a seguir com o parâmetro --query:
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --query 'DeleteMarkers[*].{Key: Key, VersionId: VersionId}'
Observação: o comando anterior inclui a opção --prefix para filtrar os resultados para o prefixo do nome de chave especificado.
-
Na saída do comando, anote o ID da versão do marcador de exclusão.
Importante: certifique-se de ter anotado o ID da versão do marcador de exclusão. Se você excluir uma versão do objeto, não é possível recuperá-la.
-
Execute o comando delete-object para remover o marcador de exclusão:
aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'
-
Para verificar se o marcador de exclusão foi removido, execute o comando ls:
aws s3 ls s3://DOC-EXAMPLE-BUCKET
Remova o marcador de exclusão em milhares de objetos
Aviso: é uma prática recomendada fazer backup dos seus dados antes de executar o seguinte comando list-object-versions. O comando usa a ação da API s3api delete-object para excluir os objetos marcadores de exclusão identificados. A exclusão de objetos é uma ação permanente. Modificações na estrutura desse comando podem causar perda inesperada de dados.
Conclua as etapas a seguir:
- Abra o console do AWS CloudShell.
- Execute o comando list-object-versions:
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --output json --query 'DeleteMarkers[?IsLatest==`true`].[Key, VersionId]' | jq -r '.[] | "--key " + "'\\\"'" + .[0] + "'\\\"'" + " --version-id " + .[1]' | xargs -L1 -t aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET
Observação: o comando anterior usa a ferramenta jq para analisar a resposta ListObjectVersions para DeleteMarkers da versão atual. Por padrão, o jq é instalado no AWS CloudShell. Se você não interagir com o ambiente do shell, sua sessão do shell será encerrada. Para obter mais informações sobre a ferramenta jq, consulte ./jq no site da jq.
Remova o marcador de exclusão em milhões de objetos
Para remover o marcador de exclusão em milhões de objetos em um bucket, use um script personalizado com o AWS SDK. Para obter mais informações, expanda a guia Usar SDKs da AWS.
Observação: quando você executa list-object-versions em um bucket que tem milhões de objetos, pode obter um tempo limite.