O blog da AWS

Como o Amazon Backup pode viabilizar a restauração de objetos acidentalmente removidos do Amazon S3?

Por Ariane Vieira, arquiteta de soluções da AWS

Remoções acidentais de arquivos no Amazon S3 podem acontecer, e como foi explicado na Parte 1 deste blogpost, é possível restaurar estes arquivos, desde que tenha sido habilitada a funcionalidade de versionamento do Amazon S3. No entanto, a premissa para a execução do script detalhado na Parte 1 é de que a remoção acidental dos arquivos não tenha apagado também as versões anteriores íntegras dos objetos a serem restaurados.

Para simplificar o processo de restauração de versões dos arquivos do Amazon S3 por meio de backups, recomenda-se o uso do AWS Backup, que é um serviço nativamente integrado ao Amazon S3 e que possibilita a criação de um cofre, o qual poderá impedir a remoção do backup dos arquivos armazenados no Amazon S3, aumentando a durabilidade e segurança dos dados nele armazenados.

Utilizando o AWS Backup para gerenciar backups de um bucket do Amazon S3

O AWS Backup é o serviço gerenciado da AWS que visa centralizar e facilitar a automação dos backups e restauração de dados para diversos serviços AWS, como por exemplo AWS RDS, Amazon EC2, Amazon EBS e, desde fevereiro de 2022, para o Amazon S3. Veja a lista completa de serviços suportado na documentação oficial.

Com o AWS Backup, é possível criar regras para gerenciar de forma centralizada e iniciar o backup dos seus buckets do Amazon S3 de forma periódica e automatizada e assim, você não precisará se preocupar em gerar backups manuais, facilitando inclusive manter seus workloads aderentes às regras de auditoria e compliance necessárias em sua empresa. Dessa forma, o AWS Backup é um forte aliado para te ajudar a estar preparado para recuperar seus dados em um cenário de desastre, ou de remoções acidentais, conforme cenário explorado na Parte 1 desse artigo.

A Figura 1 ilustra o funcionamento do AWS Backup

Figura 1: backup realizado pelo AWS Backup

Para compreensão da figura 1, listamos os conceitos sobre os quais se baseia a configuração do AWS Backup:

  • Plano de Backup: é onde definimos os recursos e as regras para que os backups aconteçam, especificando a periodicidade para realizar e para reter os backups, o destino para efetuar o armazenamento final, que chamamos de cofre, e também qual será a chave de criptografia a ser utilizada. Uma vez que você tenha criado o plano de backup, assim que iniciar a janela de tempo estipulada, uma nova iteração irá realizar o backup dos seus dados de forma automática.

O primeiro backup realizado fará uma cópia completa dos dados e a cada nova iteração, o backup é realizado de forma incremental, ou seja, apenas as novas mudanças são acrescentadas aos backups existentes. Essa característica traz um bom custo – benefício, já que o preço do serviço é composto também pelo custo de armazenamento. Para mais informações sobre preço do AWS Backup, visite nossa página pública de preços.

  • Criptografia dos dados: você pode criptografar os backups gerados utilizando uma chave de criptografia diferente da chave que você utiliza em seu bucket S3 de origem, garantindo uma camada extra de proteção aos seus backups. Consulte a documentação do AWS KMS para maiores informações sobre o funcionamento e como criar uma chave de criptografia.
  • Vault Destino: o cofre onde serão armazenados e organizados os backups gerados em cada região, para que os dados fiquem protegidos em um repositório separado e imutável.
  • Vault Lock: configuração que traz uma camada extra de segurança para os backups armazenados, pois implementa o conceito WORM – Write-Once-Read-Many (escreva uma vez, leia várias). Quando habilitado, nem mesmo o usuário root poderá alterar ou apagar os conteúdos armazenados no vault. A seção a seguir se aprofundará nos conceitos desta funcionalidade.

Uma camada extra de segurança: AWS Backup Vault Lock

Até esse ponto citamos alguns conceitos, como versionamento e criação de backups criptografados, que vão te ajudar a agregar segurança em seu ambiente e também a evitar que você perca seus dados. Agora, imagine uma situação de desastre onde o usuário root foi exposto, podendo efetuar qualquer alteração em seu ambiente e mediante a esse desastre, alterações em suas configurações poderão ser efetuadas.

Uma forma de proteger seus dados e garantir que você tenha uma cópia imutável para realizar a restauração do seu ambiente em uma situação de desastre é pelo uso do AWS Backup Vault Lock, que uma vez habilitado impede que qualquer usuário, inclusive o root, possa alterar ou deletar os backups que foram armazenados no vault. Para um vault com o lock ativado, os dados só serão removidos de forma automática quando o período de retenção estipulado chegar ao fim, sendo importante ressaltar que:

  • O AWS Backup Vault Lock é habilitado por vault e irá afetar todos os backups existentes dentro desse  vault
  • O bloqueio no vault será efetivado após um período determinando por meio do parâmetro ‘ChangeableForDays’,  onde deve ser especificado por quantos dias o vault poderá ser alterado  e/ou deletado antes que se torne imutável. Esse período é chamado de ‘cooling off’ e deve ser igual ou maior que 3 dias.
    Importante: caso o parâmetro ‘ChangeableForDays’ não seja  especificado, o vault continuará aceitando alterações.
  • Caso a conta onde os backups estejam armazenados seja apagada, se em até 90 dias a conta  não for reativada, os backups serão apagados mesmo com o vault lock

*Nota: os passos descritos nas secções abaixo irão partir da premissa que você já possui um vault e um plano de backup criado. Você pode consultar como criar o vault e um plano de backup na documentação oficial ou através desse blogpost, que automatizará a criação dos recursos através de um template do AWS CloudFormation.

Habilitando AWS Backup Vault Lock

Utilize o comando ‘put-backup-vault-lock‘ passando por parâmetro o nome do vault a ser realizado o lock, o período de retenção e o período que o vault poderá sofrer alterações e/ou remoções antes de tornar o lock irreversível. Para maiores detalhes, consultar a documentação aqui. Para esse tutorial, o comando será realizado com os seguintes parâmetros:

Input:

$ aws backup put-backup-vault-lock-configuration --backup-vault-name vault-s3-demo  --min-retention-days 10 --max-retention-days 35 --changeable-
for-days 4 --region us-east-2

Para conferir o resultado, utilize novamente o comando ‘describe-backup-vault’:

$aws backup describe-backup-vault --backup-vault-name vault-s3-demo --region us-east-2
 {
 "BackupVaultName": "vault-s3-demo",
 "BackupVaultArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-vault:vault-s3-demo",
 "EncryptionKeyArn": "arn:aws:kms:us-east-2:<<account_ID>>:key/e2c41434-460e-4714-bd99-9c3ad1d42a30",
 "CreationDate": "2022-04-20T09:56:06.422000-03:00",
 "CreatorRequestId": "ce171bf9-0ed5-411a-a17b-b72a5649982d",
 "NumberOfRecoveryPoints": 1,
"Locked": true,
 "MinRetentionDays": 10,
 "MaxRetentionDays": 35,
"LockDate": "2022-05-01T14:50:14.277000-03:00"
 }

Note que agora o vault possui a configuração de Locked habilitada e possui uma data para o lock ser ativado definitivamente. A partir dessa data, não será possível apagar um backup, alterar o período de retenção mínimo e máximo estabelecido para o vault, assim como não será permitido criar um backup com regras de retenção fora desse intervalo, conforme ilustrado nas imagens abaixo.

  • Mensagem de erro recebida ao tentar apagar um backup pela console após lock ativado para o vault:

  • InvalidRequest ao tentar realizar alteração nas regras de retenção através do AWS CLI:

  • Tentativa de criar um  backup on-demand com retenção fora do período aceito pelo o vault com lock habilitado:

Analisando o backup gerado e as opções de restauração

Uma vez que o plano de backup foi criado, sempre que as regras que foram definidas para horário e periodicidade entrarem em vigência, um novo job será inicializado para realizar o backup dos dados e a cópia será armazenada no vault criado e especificado anteriormente, conforme ilustrado nas imagens abaixo. Para realizar essa consulta através da console, basta clicar na opção ‘Jobs’ no menu esquerdo da tela.

Ao acessar o vault, note que o tipo do backup gerado é ‘Continuous’ e que a data de criação é diferente da data dos jobs gerados. Isso acontece pois o AWS Backup realiza cópias incrementais, ou seja, o primeiro job de backup faz uma cópia completa dos dados existentes e os demais acrescentam apenas a diferença entre as versões. Observe na imagem abaixo que, ao selecionar a opção para restaurar esse backup, é possível escolher qualquer intervalo de tempo entre a data de criação do backup e a data do último backup gerado.

 Você também pode listar os backups gerados através da linha de comando no AWS CLI, conforme ilustrado abaixo:

Input:

$ aws backup list-backup-jobs —by-backup-vault-name vault-s3-demo —region us-east-2

O resultado será um array contendo as informações de cada backup gerado. Para maiores informações, consulte a documentação clicando aqui

Output:

{
    "BackupJobs": [
        {
            "AccountId": "<<account_ID>>",
            "BackupJobId": "16173E77-2E85-6543-9474-9F98FD73D1D2",
            "BackupVaultName": "vault-s3-demo",
            "BackupVaultArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-vault:vault-s3-demo",
            "ResourceArn": "arn:aws:s3:::s3-bucket-bkp-demo",
            "CreationDate": "2022-04-27T14:40:00-03:00",
            "State": "RUNNING",
            "PercentDone": "0.0",
            "IamRoleArn": "arn:aws:iam::<<account_ID>>:role/AWSBackupPermissionsForS3",
            "CreatedBy": {
            "BackupPlanId": "b247eee7-2f87-483a-b467-0cdf9d7c65d6",
            "BackupPlanArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-plan:b247eee7-2f87-483a-b467-0cdf9d7c65d6",
            "BackupPlanVersion": "NDZhMmMyYTYtMDdjNi00OTM2LWE4ZWMtZmMxZWY4N2ZiNzAy",
            "BackupRuleId": "95f00255-5814-4977-8b16-6f8d62c274ba"
        },
        "StartBy": "2022-04-27T15:40:00-03:00",
        "ResourceType": "S3"
        },
        {
            "AccountId": "<<account_ID>>",
            "BackupJobId": "6CD4B2BF-CA08-AD81-921D-1DC77A17AC2A",
            "BackupVaultName": "vault-s3-demo",
            "BackupVaultArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-vault:vault-s3-demo",
            "ResourceArn": "arn:aws:s3:::s3-bucket-bkp-demo",
            "CreationDate": "2022-04-27T13:40:00-03:00",
            "CompletionDate": "2022-04-27T14:03:20.429000-03:00",
            "State": "COMPLETED",
            "PercentDone": "100.0",
            "IamRoleArn": "arn:aws:iam::<<account_ID>>:role/AWSBackupPermissionsForS3",
            "CreatedBy": {
                "BackupPlanId": "b247eee7-2f87-483a-b467-0cdf9d7c65d6",
                "BackupPlanArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-plan:b247eee7-2f87-483a-b467-0cdf9d7c65d6",
                "BackupPlanVersion": "NDZhMmMyYTYtMDdjNi00OTM2LWE4ZWMtZmMxZWY4N2ZiNzAy",
                "BackupRuleId": "95f00255-5814-4977-8b16-6f8d62c274ba"
            },
            "StartBy": "2022-04-27T14:40:00-03:00",
            "ResourceType": "S3"
        }
    ]
 }

Para restaurar os dados, você pode escolher a versão do backup mais atual ou em um ponto no tempo, sendo possível restaurar o bucket parcial ou integralmente, além de escolher o destino, como por exemplo um novo bucket, um bucket existente ou o próprio bucket origem no qual o backup foi gerado.

Também é possível realizar a restauração por meio do terminal. Nesse tutorial, vamos optar por restaurar o bucket inteiro a partir da versão de backup gerada em 26 Abril as 14:00:00 UTC e tendo como destino um novo bucket chamado ‘s3-new-bucket-restored’

Primeiro, vamos chamar o comando ‘list-recovery-points-by-backup-vault’ para que possamos pegar o ARN que identifica o backup que será restaurado.
Input:

$ aws backup list-recovery-points-by-backup-vault --backup-vault-name vault-s3-demo --region us-east-2

Output:

{
    "RecoveryPoints": [
        {
            "RecoveryPointArn": "arn:aws:backup:us-east-2:<<account_ID>>:recovery-point:continuous:s3-bucket-bkp-demo-d679ca92",
            "BackupVaultName": "vault-s3-demo",
            "BackupVaultArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-vault:vault-s3-demo",
            "ResourceArn": "arn:aws:s3:::s3-bucket-bkp-demo",
            "ResourceType": "S3",
            "CreatedBy": {
                "BackupPlanId": "b247eee7-2f87-483a-b467-0cdf9d7c65d6",
                "BackupPlanArn": "arn:aws:backup:us-east-2:<<account_ID>>:backup-plan:b247eee7-2f87-483a-b467-0cdf9d7c65d6",
                "BackupPlanVersion": "NDZhMmMyYTYtMDdjNi00OTM2LWE4ZWMtZmMxZWY4N2ZiNzAy",
                "BackupRuleId": "95f00255-5814-4977-8b16-6f8d62c274ba"
            },
            "IamRoleArn": "arn:aws:iam::<<account_ID>>:role/AWSBackupPermissionsForS3",
            "Status": "AVAILABLE",
            "CreationDate": "2022-04-20T10:40:00-03:00",
            "CompletionDate": "2022-04-27T15:03:11.448000-03:00",
            "CalculatedLifecycle": {
                "DeleteAt": "2022-06-01T14:40:00-03:00"
            },
            "Lifecycle": {
                "DeleteAfterDays": 35
            },
            "EncryptionKeyArn": "arn:aws:kms:us-east-2:<<account_ID>>:key/e2c41434-460e-4714-bd99-9c3ad1d42a30",
            "IsEncrypted": true
        }
    ]
 }

Em seguida, para iniciar a restauração dos dados, no AWS CLI digite o comando ‘start-restore-job’ passando como parâmetro o RecoveryPointARN recuperado acima.

 Input:

$ aws backup start-restore-job --recovery-point-arn arn:aws:backup:us-east-2:<<account_ID>>:recovery-point:continuous:s3-bucket-bkp-demo-d679ca92
 --metadata newbucket=s3-new-bucket-restored,destinationbucketname=s3-new-bucket-restored,encrypted=true,encryptiontype=SSE-S3,restoretime=2022-
04-26T14:00:00Z,creationtoken=731bda30-c661-11ec-9d64-0242ac120002  --iam-role-arn arn:aws:iam::<<account_ID>>:role/AWSBackupPermissionsForS3 --
region us-east-2

Output:

{
    "RestoreJobId": "4A41E82B-4EE3-83E4-DA0C-EE690994F623"
}

Feito isso, a restauração dos dados é iniciada e será criado um novo bucket contendo os dados originais.

As imagens abaixo ilustram através da console o resultado dos comandos acima.
Em AWS BackupJobs, ao consultar a aba Restore jobs, é possível verificar o job sendo executado e, ao ser finalizado, o novo bucket ‘s3-new-bucket-restored’ terá sido criado apresentando a mesma estrutura do bucket original.

Para maiores detalhes sobre as permissões que são necessárias para realização de backups e restaurações, consulte IAM Role e Service-Linked Role na secção segurança da documentação oficial.

Conclusão

Arquivos podem ser cruciais para o correto funcionamento de uma aplicação, e muitas vezes até mesmo para o funcionamento da empresa como um todo. A perda irrecuperável destes arquivos pode ser bastante prejudicial para a organização. Esse blog post apresentou duas possibilidades de recuperação em cenários de remoção acidental de arquivos: a Parte 1 deste blog explorou a utilização de um script Python para restauração dos arquivos e a Parte 2 detalhou o uso do AWS Backup para o mesmo fim, no entanto com funcionalidades essenciais para clientes com requisitos de governança, auditoria e compliance.

Cada cliente deverá analisar seu caso uso na escolha da melhor abordagem, mas um arquivo apagado acidentalmente de um bucket não necessariamente significa o fim da linha.


Sobre o autor

Ariane Vieira trabalha com TI há 7 anos e atualmente é arquiteta de soluções na AWS com o foco em GovTechs, onde atua apoiando os clientes em suas diversas fases de adoção da nuvem, passando por projetos como migração de dados, containerização e otimização de custos, sempre buscando as melhores práticas. Anteriormente trabalhou no setor financeiro em projetos de inovação em canais digitais para o contato com os clientes, adquirindo experiencia em sistemas distribuídos, de mensageira em ambientes on-premises e realizando migrações para AWS.