X
    Categoria: Amazon

Backup da instância EC2 para S3

 

Existem muitas ferramentas disponíveis para ajudar a fazer backup de sistemas Linux para o Amazon S3, mas encontrar o caminho certo para usar pode ser difícil.

Uma ferramenta que é muito simples de usar é o s3cmd que é uma ferramenta de linha de comando do Linux para fazer o upload, recuperar e gerenciar dados em Amazon S3.
A ferramenta é escrita em python, por isso deve instalar e rodar em praticamente qualquer distribuiçâo linux moderna e eu descobri que funciona muito bem e parece ser uma ferramenta ideal para usar se você quiser escrever um script de backup básico.

Uma vez instalado, basta executar “s3cmd –configure” para configurar o script com suas chaves de acesso Amazon S3. Você pode então usar s3cmd a partir da linha de comando para gerenciar seus buckets S3 e seus conteúdos.
Todos os detalhes sobre as várias opções podem ser obtidas através correndo “s3cmd –help”.

Eu tenho usado s3cmd para criar backups diários automáticos rodada de um único diretório (ex: /home) usando um script simples que eu adaptei do roteiro automysqlbackup. O script que eu tenho usado é mostrado abaixo, e fornece rodada backups dos últimos 7 dias, a cada dia individualmente arquivado em um arquivo tar.gz único.
Esta é uma solução bastante limitada, pois apenas fornece um backup de um único diretório, não faz backups incrementais, e ele vai quebrar se o seu arquivo tar.gz exceder o limite de armazenamento S3 indivídual de arquivo – 6GB.
No entanto, se você só precisa de uma solução simples para manter backups diários de uma única pasta, então essa é uma boa opção. Ele também irá enviar-lhe os resultados, e pode, opcionalmente, incluir tarefas para executar pré e pós-backup.

#!/bin/bash
#
# Backup Script
#
#=====================================================================
#=====================================================================
# Defina suas variáveis
#=====================================================================

# Diretório para salvar arquivos de backup diário, por exemplo, tar.gz /backups
BACKUPDIR=”/mnt/backups”

# Diretório de backup
BACKUPSRCDIR=”/mnt/www”

# Tamanho máximo de arquivos de backup em MB (arquivos maiores será dividido em arquivos separados)
# Nota: ainda não implementada
MAXTARSIZE=”1000″

# S3 Settings
# Nome do S3 bucket para upload ex. “meu_s3_bucket”
S3BUCKET=”meu_s3_bucket”

# Configuração de email
# O que você gostaria de ser enviado a você?
# – log: enviar apenas arquivo de log
# – files: enviar arquivo de log e arquivos tar.gz como anexos
# – stdout: simplesmente emitir o registro para a tela se executar manualmente.
# – quiet: Apenas enviar logs se ocorrer um erro ao MAILADDR.

MAILCONTENT=”log”

# Defina o tamanho máximo permitido de e-mail em k. (4000 = cerca de 5MB e-mail)
MAXATTSIZE=”4000″

# Endereço de email para enviar
MAILADDR=”usuario@dominio.com.br”;

# Comando para executar antes de backups (descomente para usar)
#PREBACKUP=”/etc/backup-pre”

# Comando executado depois de backups (descomente para usar)
#POSTBACKUP=”/etc/backup-post”

#=====================================================================
#=====================================================================
#=====================================================================
#
# Não precisa ser modificado daqui para baixo!
#
#=====================================================================
#=====================================================================
#=====================================================================
PATH=/usr/local/bin:/usr/bin:/bin:
DATE=`date +%Y-%m-%d_%Hh%Mm` # Datestamp e.g 2002-09-21
DOW=`date +%A` # Day of the week e.g. Monday
DNOW=`date +%u` # Day number of the week 1 to 7 where 1 represents Monday
DOM=`date +%d` # Date of the Month e.g. 27
M=`date +%B` # Month e.g January
W=`date +%V` # Week Number e.g 37
VER=0.1 # Version Number
HOST=`hostname` # Hostname for LOG information
LOGFILE=$BACKUPDIR/$HOST-`date +%N`.log # Logfile Name
LOGERR=$BACKUPDIR/ERRORS_$HOST-`date +%N`.log # Error log Name
BACKUPFILES=””

# Create required directories
if [ ! -e “$BACKUPDIR” ] # Check Backup Directory exists.
then
mkdir -p “$BACKUPDIR”
fi

# IO redirection for logging.
touch $LOGFILE
exec 6>&1 # Link file descriptor #6 with stdout.
# Saves stdout.
exec > $LOGFILE # stdout replaced with file $LOGFILE.
touch $LOGERR
exec 7>&2 # Link file descriptor #7 with stderr.
# Saves stderr.
exec 2> $LOGERR # stderr replaced with file $LOGERR.

# Functions

# Backup function: removes last weeks archive from S3, creates new tar.gz and sends to S3
SUFFIX=””
dobackup () {
s3cmd ls s3://”$S3BUCKET” | grep s3 | sed “s/.*s3://$S3BUCKET//s3://$S3BUCKET//” | grep “$DOW” | xargs s3cmd del
tar cfz “$1” “$2”
echo
echo Backup Information for “$1”
gzip -l “$1”
echo
s3cmd put “$1″ s3://”$S3BUCKET”
return 0
}

# Run command before we begin
if [ “$PREBACKUP” ]
then
echo ======================================================================
echo “Prebackup command output.”
echo
eval $PREBACKUP
echo
echo ======================================================================
echo
fi

echo ======================================================================
echo BackupScript VER $VER
echo
echo Backup of Server – $HOST
echo ======================================================================

echo Backup Start Time: `date`
echo ======================================================================
58,1 38%
echo ======================================================================
echo ======================================================================
# Daily Backup
echo Daily Backup of Directory ( $BACKUPSRCDIR )
echo
echo Rotating last weeks Backup…
eval rm -fv “$BACKUPDIR/*.$DOW.tar.gz”
echo
dobackup “$BACKUPDIR/$DATE.$DOW.tar.gz” “$BACKUPSRCDIR”
BACKUPFILES=”$BACKUPFILES $BACKUPDIR/$DATE.$DOW.tar.gz”
echo
echo ———————————————————————-
echo Backup End Time: `date`
echo ======================================================================
echo Total disk space used for backup storage..
echo Size – Location
echo `du -hs “$BACKUPDIR”`
echo
echo ======================================================================
echo ======================================================================
echo “Jrossetto – http://www.jrossetto.com.br”
# Run command when we’re done
if [ “$POSTBACKUP” ]
then
echo ======================================================================
echo “Postbackup command output.”
echo
eval $POSTBACKUP
echo
echo ======================================================================
fi

#Clean up IO redirection
exec 1>&6 6>&- # Restore stdout and close file descriptor #6.
exec 1>&7 7>&- # Restore stdout and close file descriptor #7.

if [ “$MAILCONTENT” = “files” ]
then
if [ -s “$LOGERR” ]
then
# Include error log if is larger than zero.
BACKUPFILES=”$BACKUPFILES $LOGERR”
ERRORNOTE=”WARNING: Error Reported – ”
fi
#Get backup size
ATTSIZE=`du -c $BACKUPFILES | grep “[[:digit:][:space:]]total$” |sed s/s*total//`
if [ $MAXATTSIZE -ge $ATTSIZE ]
then
BACKUPFILES=`echo “$BACKUPFILES” | sed -e “s# # -a #g”` #enable multiple attachments
mutt -s “$ERRORNOTE MySQL Backup Log and SQL Files for $HOST – $DATE” $BACKUPFILES $MAILADDR < $LOGFILE #send via mutt
else
cat “$LOGFILE” | mail -s “WARNING! – Backup exceeds set maximum attachment size on $HOST – $DATE” $MAILADDR
fi
elif [ “$MAILCONTENT” = “log” ]
then
cat “$LOGFILE” | mail -s “Backup Log for $HOST – $DATE” $MAILADDR
if [ -s “$LOGERR” ]
then

then
cat “$LOGERR” | mail -s “ERRORS REPORTED: MySQL Backup error Log for $HOST – $DATE” $MAILADDR
fi
elif [ “$MAILCONTENT” = “quiet” ]
then
if [ -s “$LOGERR” ]
then
cat “$LOGERR” | mail -s “ERRORS REPORTED: Backup error Log for $HOST – $DATE” $MAILADDR
cat “$LOGFILE” | mail -s “Backup Log for $HOST – $DATE” $MAILADDR
fi
else
if [ -s “$LOGERR” ]
then
cat “$LOGFILE”
echo
echo “###### WARNING ######”
echo “Errors reported during Backup execution.. Backup failed”
echo “Error log below..”
cat “$LOGERR”
else
cat “$LOGFILE”
fi
fi

if [ -s “$LOGERR” ]
then
STATUS=1
else
STATUS=0
fi

# Clean up Logfile
eval rm -f “$LOGFILE”
eval rm -f “$LOGERR”

exit $STATUS

 

 

Juliano Rossetto: Formado em Analise e Desenvolvimento de Sistemas. Desenvolvedor dos principais CMS ( Wordpress, Joomla). Desenvolvedor de E-commerce (Opencart e WooCommerce). Analista de SEO: Otimização de sites para mecanismos de buscas. Analista de Infraestrutura voltado para servidores na nuvem: Amazon Web Services (AWS), DigitalOcean e Linode. Para dúvidas ou serviços entre em contato aqui.