Postado originalmente em meu blog: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
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 erro Segmentation 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 .
$ aws s3 sync s3: // nome-do-seu-balde / home / ubuntu / s3 / nome-do-seu-balde /
Benefícios:
- Escalável - suporta enormes baldes S3
- Multi-threaded - sincroniza os arquivos mais rápido, utilizando vários threads
- Inteligente - sincroniza apenas arquivos novos ou atualizados
- Rápido - graças à sua natureza multithread e algoritmo de sincronização inteligente
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 via apt-get
.
$ sudo apt-get install awscli
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, como us-east-1
.
$ aws configurar
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.
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
Sincronização inicial
Vamos sincronizar o intervalo pela primeira vez com o seguinte comando:
$ aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
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
:
$ nano /home/ubuntu/s3/sync.sh
Copie e cole o seguinte código em sync.sh
:
#! / bin / sh
# Ecoar a data e hora atuais
echo '-----------------------------'
encontro
echo '-----------------------------'
echo ''
# Inicialização de script de eco
echo 'Sincronizando bucket S3 remoto ...'
# Realmente execute o comando de sincronização (substitua {BUCKET_NAME} pelo nome do seu intervalo S3)
/ usr / bin / aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
# Conclusão do script de eco
echo 'Sincronização completa'
Certifique-se de substituir {BUCKET_NAME} pelo nome do seu intervalo S3, duas vezes ao longo do script.
Dica profissional: você deve usar o /usr/bin/aws
link para o aws
binário, pois crontab
executa comandos em um ambiente de shell limitado e não será capaz de encontrar o executável por conta própria.
Em seguida, verifique chmod
o script para que ele possa ser executado por crontab
.
$ sudo chmod + x /home/ubuntu/s3/sync.sh
Vamos tentar executar o script para verificar se ele realmente funciona:
$ /home/ubuntu/s3/sync.sh
A saída deve ser semelhante a esta:
A seguir, vamos editar o usuário atual crontab
executando o seguinte comando:
$ crontab -e
Se esta for sua primeira execução crontab -e
, você precisará selecionar um editor de sua preferência. Eu recomendo selecionar nano
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:
mh dom mon dow comando
O comando a seguir é configurado crontab
para executar o sync.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 um sync.log
arquivo em nosso s3
diretório:
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
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 sair nano
pressionando Ctrl + X . crontab
irá agora executar a tarefa de sincronização a cada hora.
Dica profissional: você pode verificar se o cron job de hora em hora está sendo executado com sucesso inspecionando /home/ubuntu/s3/sync.log
, verificando seu conteúdo para a data e hora de execução e inspecionando os logs para ver quais novos arquivos foram sincronizados.
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 .