Estou procurando algum conselho ou prática recomendada para fazer backup do bucket S3.
O objetivo de fazer backup dos dados do S3 é evitar a perda de dados devido ao seguinte:
- Problema S3
- problema em que excluo acidentalmente esses dados do S3
Após alguma investigação, vejo as seguintes opções:
- Use versionamento http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
- Copie de um bucket S3 para outro usando AWS SDK
- Backup para Amazon Glacier http://aws.amazon.com/en/glacier/
- Backup para o servidor de produção, que é o próprio backup
Que opção devo escolher e quão seguro seria armazenar dados apenas no S3? Quer ouvir suas opiniões.
Alguns links úteis:
amazon-web-services
amazon-s3
backup
amazon-glacier
Sergey Alekseev
fonte
fonte
Respostas:
Sincronize seu Bucket S3 com um servidor EC2 periodicamente
Isso pode ser feito facilmente utilizando vários utilitários de linha de comando que tornam possível sincronizar um depósito S3 remoto com o sistema de arquivos local.
s3cmd
No início,
s3cmd
parecia extremamente promissor. No entanto, depois de experimentá-lo em meu enorme balde S3 - não conseguiu escalar, apresentando um erroSegmentation fault
. Funcionou bem em baldes pequenos, no entanto. Como não funcionava para baldes enormes, decidi encontrar uma alternativa.s4cmd
A alternativa multi-threaded mais recente para
s3cmd
. Parecia ainda mais promissor, no entanto, notei que ele continuou baixando arquivos que já estavam presentes no sistema de arquivos local. Esse não é o tipo de comportamento que eu esperava do comando sync. Ele deve verificar se o arquivo remoto já existe localmente (a verificação de hash / tamanho do arquivo seria legal) e ignorá-lo na próxima execução de sincronização no mesmo diretório de destino. Abri um problema ( bloomreach / s4cmd / # 46 ) para relatar esse comportamento estranho. Nesse ínterim, comecei a encontrar outra alternativa.awscli
E então eu encontrei
awscli
. Esta é a interface de linha de comando oficial da Amazon para interagir com seus diferentes serviços em nuvem, S3 incluído.Ele fornece um comando de sincronização útil que baixa de forma rápida e fácil os arquivos de bucket remoto para seu sistema de arquivos local .
Benefícios:
Exclusão acidental
Convenientemente, o
sync
comando não excluirá os arquivos da pasta de destino (sistema de arquivos local) se eles estiverem faltando na origem (depósito S3) e vice-versa. Isso é perfeito para fazer backup do S3 - no caso de arquivos serem excluídos do depósito, sincronizá-los novamente não os excluirá localmente. E, no caso de você excluir um arquivo local, ele também não será excluído do intervalo de origem.Configurando o awscli no Ubuntu 14.04 LTS
Vamos começar instalando
awscli
. Existem várias maneiras de fazer isso, no entanto, achei mais fácil instalá-lo viaapt-get
.Configuração
Em seguida, precisamos configurar
awscli
com nosso ID de chave de acesso e chave secreta, que você deve obter do IAM , criando um usuário e anexando a política AmazonS3ReadOnlyAccess . Isso também impedirá que você ou qualquer pessoa que tenha acesso a essas credenciais exclua seus arquivos S3. Certifique-se de inserir sua região S3, comous-east-1
.Preparação
Vamos preparar o diretório de backup local do S3, de preferência em
/home/ubuntu/s3/{BUCKET_NAME}
. Certifique-se de substituir{BUCKET_NAME}
pelo nome real do seu intervalo.Sincronização inicial
Vamos sincronizar o intervalo pela primeira vez com o seguinte comando:
Supondo que o depósito exista, as credenciais e a região da AWS estão corretas e a pasta de destino válida,
awscli
o download de todo o depósito será iniciado no sistema de arquivos local.Dependendo do tamanho do balde e de sua conexão com a Internet, pode levar de alguns segundos a horas. Quando isso for feito, iremos em frente e configuraremos um cron job automático para manter a cópia local do bucket atualizada.
Configurando um Cron Job
Vá em frente e crie um
sync.sh
arquivo em/home/ubuntu/s3
:Copie e cole o seguinte código em
sync.sh
:Certifique-se de substituir {BUCKET_NAME} pelo nome do seu intervalo S3, duas vezes ao longo do script.
Em seguida, verifique
chmod
o script para que ele possa ser executado porcrontab
.Vamos tentar executar o script para verificar se ele realmente funciona:
A saída deve ser semelhante a esta:
A seguir, vamos editar o usuário atual
crontab
executando o seguinte comando:Se esta for sua primeira execução
crontab -e
, você precisará selecionar um editor de sua preferência. Eu recomendo selecionarnano
porque é o mais fácil para iniciantes trabalharem.Frequência de Sincronização
Precisamos dizer com
crontab
que freqüência executar nosso script e onde o script reside no sistema de arquivos local, escrevendo um comando. O formato deste comando é o seguinte:O comando a seguir é configurado
crontab
para executar osync.sh
script a cada hora (especificado por meio dos parâmetros minuto: 0 e hora: *) e para que ele canalize a saída do script para umsync.log
arquivo em nossos3
diretório:Você deve adicionar esta linha ao final do
crontab
arquivo que está editando. Em seguida, salve o arquivo no disco pressionando Ctrl + W e depois Enter . Você pode então sairnano
pressionando Ctrl + X .crontab
irá agora executar a tarefa de sincronização a cada hora.Tudo pronto! Seu bucket S3 agora será sincronizado com seu servidor EC2 a cada hora automaticamente e você deve estar pronto para ir. Observe que, com o tempo, conforme seu balde S3 fica maior, pode ser necessário aumentar o tamanho do volume EBS do servidor EC2 para acomodar novos arquivos. Você sempre pode aumentar o tamanho do volume EBS seguindo este guia .
fonte
awscli
suporte sincronizar isso automaticamente noaws s3 sync
comando. Parece que você precisa implementar isso manualmente.Levando em consideração o link relacionado, que explica que o S3 tem durabilidade de 99,999999999%, descartaria sua preocupação nº 1. A sério.
Agora, se o # 2 é um caso de uso válido e uma preocupação real para você, eu definitivamente ficaria com as opções # 1 ou # 3. Qual deles? Realmente depende de algumas questões:
Amazon Glacier is optimized for data that is infrequently accessed and for which retrieval times of several hours are suitable.
Isso é bom para você?A menos que seu uso de armazenamento seja realmente grande, eu continuaria com o controle de versão do balde. Dessa forma, você não precisará de nenhum código / fluxo de trabalho extra para fazer backup dos dados no Glacier, em outros baldes ou mesmo em qualquer outro servidor (o que é realmente uma má escolha, IMHO, por favor, esqueça).
fonte
Você pode fazer backup de seus dados S3 usando os seguintes métodos
Agende o processo de backup usando o datapipeline da AWS, ele pode ser feito das 2 maneiras mencionadas abaixo:
uma. Usando copyActivity de datapipeline usando o qual você pode copiar de um balde s3 para outro balde s3.
b. Usando ShellActivity de datapipeline e comandos "S3distcp" para fazer a cópia recursiva de pastas s3 recursivas de um depósito para outro (em paralelo).
Use o controle de versão dentro do intervalo S3 para manter versões diferentes dos dados
Use o glacier para fazer backup de seus dados (use-o quando não precisar restaurar o backup rapidamente para os baldes originais (leva algum tempo para recuperar os dados do glacier, pois os dados são armazenados em formato compactado) ou quando quiser salvar algum custo, evitando o uso de outro depósito s3 para backup), esta opção pode ser facilmente definida usando a regra de ciclo de vida no depósito s3 para o qual você deseja fazer backup.
A opção 1 pode dar a você mais segurança, digamos, no caso de você excluir acidentalmente seu bucket s3 original e outro benefício é que você pode armazenar seu backup em pastas de data e hora em outro bucket s3, desta forma você sabe quais dados tinha em uma data específica e pode restaurar um backup de data específica. Tudo depende do seu caso de uso.
fonte
Que tal usar o recurso de replicação entre regiões prontamente disponível nos próprios buckets S3? Aqui estão alguns artigos úteis sobre o recurso
fonte
Você pensaria que haveria uma maneira mais fácil agora de apenas manter algum tipo de backups incrementais em uma região diff.
Todas as sugestões acima não são soluções realmente simples ou elegantes. Eu realmente não considero o glacier uma opção, pois acho que é mais uma solução de arquivamento do que uma solução de backup. Quando penso em backup, penso em recuperação de desastre de um desenvolvedor júnior excluindo recursivamente um balde ou talvez um exploit ou bug em seu aplicativo que exclui coisas do s3.
Para mim, a melhor solução seria um script que apenas faça backup de um balde para outra região, um diário e um semanal para que, se algo terrível acontecer, você possa apenas trocar de região. Eu não tenho uma configuração como esta, eu pesquisei apenas não consegui fazer isso porque seria um pouco de esforço para fazer isso, é por isso que eu gostaria que houvesse alguma solução padrão para usar.
fonte
Embora essa pergunta tenha sido postada há algum tempo, achei importante mencionar a proteção contra exclusão do MFA com as outras soluções. O OP está tentando solucionar a exclusão acidental de dados. A autenticação multifator (MFA) se manifesta em dois cenários diferentes aqui -
Excluindo versões de objeto permanentemente - Habilite a exclusão de MFA no controle de versão do bucket.
Excluindo acidentalmente o próprio balde - Configure uma política de balde negando a exclusão sem autenticação MFA.
Casal com -se a replicação e controle de versão entre regiões para reduzir o risco de perda de dados e melhorar os cenários de recuperação.
Aqui está uma postagem de blog sobre este tópico com mais detalhes.
fonte
Se, temos muitos dados. Se você já tem um balde, então da primeira vez A sincronização vai demorar muito, no meu caso, eu tinha 400GB. Demorou 3 horas na primeira vez. Portanto, acho que podemos fazer a réplica é uma boa solução para backup do S3 Bucket.
fonte