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, s3cmdparecia 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 synccomando 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 awsclicom 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, awsclio 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.sharquivo 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/awslink para o awsbinário, pois crontabexecuta comandos em um ambiente de shell limitado e não será capaz de encontrar o executável por conta própria.
Em seguida, verifique chmodo 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 crontabexecutando 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 nanoporque é o mais fácil para iniciantes trabalharem.
Frequência de Sincronização
Precisamos dizer com crontabque 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 crontabpara executar o sync.shscript 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.logarquivo em nosso s3diretório:
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
Você deve adicionar esta linha ao final do crontabarquivo que está editando. Em seguida, salve o arquivo no disco pressionando Ctrl + W e depois Enter . Você pode então sair nanopressionando Ctrl + X . crontabirá 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 .