Restaurar um bucket do S3 com versão para um momento específico

16

Digamos que eu tenha a versão S3 ativada para meu bucket: http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html

Então, digamos que alguém (por exemplo, funcionário júnior) atrapalha o bucket do S3 (exclui alguns arquivos acidentalmente etc.)

Como posso restaurar todo o bucket com versão para um momento específico? Acredito que isso seja possível, dada a API do S3, mas prefiro não ter que escrever esse script por medo de perder alguma coisa (não sou especialista na AWS).

Existem boas soluções para esse problema? Estou usando o bucket S3 como uma loja de imagens para meu aplicativo Rails, então algo baseado em Ruby que eu poderia usar como uma tarefa de rake seria o ideal.

elsurudo
fonte

Respostas:

17

Você pode usar s3-pit-restore

A Restauração S3 Point in Time é uma ferramenta que você pode usar exatamente para restaurar um bucket ou um subconjunto de um bucket em um determinado momento, como este:

s3-pit-restore --bucket my-bucket --dest my-restored-bucket --timestamp "06-17-2016 23:59:50 +2"

O que o s3-pit-restore realmente oferece:

  • Restauração de todos os arquivos com carimbo de data e hora menor que o especificado
  • Restauração de um intervalo inteiro ou um prefixo do intervalo
  • Download paralelo de vários arquivos com uma ótima velocidade geral
  • Personalização da contagem de trabalhadores paralelos para otimizar o uso da largura de banda
  • Restaurar a partir de versões do bucket s3 ou do glacier, se ativado
Angelo
fonte
Isso não parece funcionar para mim. O destino cria apenas um diretório local, apesar da descrição da ferramenta.
Arthur
Você salvou meu dia. Obrigado por nos informar a ferramenta incrível.
cyberrspiritt
2

Se entendi a documentação corretamente, quando você tem o controle de versão ativado, a exclusão do arquivo simplesmente reverte a versão "mais recente" para um número de versão. No entanto, isso não permite restaurar um intervalo inteiro. Isso faz com que as versões anteriores do S3 não sejam adequadas às suas necessidades (por exemplo, recuperação da exclusão).

Mantenha um backup em outro lugar e também por precaução. O estouro de pilha tem uma pergunta / resposta sobre isso usando s3cmd. Tenho certeza que você pode encontrar um script baseado em Ruby em algum lugar ou pedir ajuda nesse site, se precisar.

Nathan C
fonte
Corrigir. Você está versionando cada objeto individual no balde, não o balde como um todo.
EEAA
1
Oh, eu entendo tudo isso. É por isso que percebo que não é tão simples. Eu provavelmente teria que percorrer todos os arquivos no intervalo, obter informações da versão de cada arquivo e escolher o item correto (se existir) com base na data em que eu quero "reverter". Não tão simples. Eu imaginei que a Amazon teria algo para um caso de uso tão comum, mas, infelizmente, não ... Então, eu queria saber se alguém já escreveu esse script tedioso. Vou dar uma olhada s3cmd, mas também gosto de ter snapshots com versão no S3.
elsurudo
esta resposta contém informações incorretas - um simples deleteinsere um marcador de exclusão e solicitações futuras retornam um 404, não a versão anterior. Para RESTAURAR, você pode copiar uma versão antiga para uma nova versão ou deletecom uma versão específica do objeto atual - os futuros gets receberão a segunda a última versão. docs.aws.amazon.com/AmazonS3/latest/dev/... para ser justo, o docu em torno de versões balde tende a ser vaga e falta ...
afiado
@keen Observe que esta pergunta foi respondida há quase três anos ... é muito possível que eles tenham atualizado a documentação. Boa captura, no entanto.
Nathan C
o link referenciado para o docu é sobre recuperação (a visão de recuperação em nível super alto) e não mudou - e, para ser justo, é mais do que um pouco confuso quando começa a falar sobre exclusões. só queria ter certeza de que ninguém viu isso e pensou "apenas excluir um objeto de um balde s3 com versão significa que a versão antiga começará a ser retornada" - isso pode acontecer, mas é necessário excluir especificamente a versão atual (... / key ? versionID = xyz) para que isso aconteça ...
afiado
1

Aqui está um pequeno script php que usei para restaurar meu bucket de um backup com versionamento:

Para executar novamente em um balde com o controle de versão ativado

#CONFIGURATION
export bucket_to_backup='example-of-a-bucket-name';
export backup_bucket='example-of-a-backup-bucket-name'; 
export AWS_ACCESS_KEY_ID=ASDFDSAFADSFDASF;
export AWS_SECRET_ACCESS_KEY=adsfdsaf86adsf5adsf568aadf75ads;
#you will need to download and install the s3cmd tool at the following url:
#http://s3tools.org/
s3cmd --access_key=$AWS_ACCESS_KEY_ID --secret_key=$AWS_SECRET_ACCESS_KEY --recursive sync s3://$bucket_to_backup s3://$backup_bucket;

restaurar o backup de arquivos com versão entre esses dois carimbos de data e hora

export startSnapShotTimeStamp=1427577934;
export endSnapShotTimeStamp=1427577939;
#do the restore with php script
php awsUtil.php sync example-of-a-backup-bucket-name example-of-a-bucket-name $startSnapShotTimeStamp-$endSnapShotTimeStamp

você pode baixar o script PHP aqui: http://boulderapps.co/post/backing-up-and-restoring-s3-to-a-versioned-bucket

user278847
fonte