Regelmäßig automatisiert Ordner eines Ubuntu-Servers bei AWS S3 sichern

Auf Amazon betreibe ich via EC2 einen Ubuntu-Linux-Server mit NGINX um ein paar Websites von uns auszuliefern.

Um ein Backup der wichtigsten Daten zu haben, verwende ich ein Shell-Skript, das als Cronjob läuft und täglich Dateien auf Amazons S3-Speicher hochlädt.

Vorbereitende Arbeiten

Zunächst habe ich den Befehlszeilen-Client von Amazons AWS installiert, so wie in der Anleitung beschrieben. Alternativ könnt Ihr auch den gebündelten Client installieren. Ich selbst bevorzuge den gebündelten Client. Ggf. muss für diesen zuvor noch Python via sudo apt-get install python installiert werden.

Mit dem gebündelten Client ist der Ziel-Installationsordner des AWS-Clients in /usr/local/bin/aws.

Backup-Skript

Ich habe mein Bash-Skript initial von dieser Anleitung abgeleitet und entsprechend angepasst.

#!/bin/sh

echo '----------------------------------'
echo 'started'
echo ' '

# https://www.ideyatech.com/creating-automated-backup-scripts-linux-s3/

#backup folder within the server where backup files are store
BAK_DEST=/tmp/backup

#folders for backup, can be comma separated for multiple folders
BAK_SOURCES=/home,/opt/bitnami,/etc/lego

# API Keys for S3
export AWS_ACCESS_KEY_ID="FJEIWN4FKDI5DJHFQEW2"
export AWS_SECRET_ACCESS_KEY="kfdshfkjFD4DFDdfjlkdfdwoXdfjdf8dfjklDW3A"

#s3 bucket name that contains backup
S3_BUCKET=my-server-backups/my-server

#number of days to keep archives
KEEP_DAYS=3

#script variables
BAK_DATE=`date +%F`
BAK_DATETIME=`date +%F-%H%M`
BAK_FOLDER=${BAK_DEST}/${BAK_DATE}
DAYOFYEAR=`date +%j`
DAYOFYEARINT=$(echo $DAYOFYEAR | sed 's/^0*//')
MYIDX=$(($DAYOFYEARINT % $KEEP_DAYS))
ROLLING_FOLDER=backup-${MYIDX}

## echo 'DOY: ' ${DAYOFYEAR}
## echo 'DOYI: ' ${DAYOFYEARINT}
## echo 'Index : ' ${MYIDX}
## echo 'Ordnername: ' ${ROLLING_FOLDER}
## exit 1


#CREATE folder where backup database is to be place
echo 'Creating temp local backup to folder ' ${BAK_FOLDER}
rm -f -R ${BAK_FOLDER}
mkdir -p ${BAK_FOLDER}


# Löschen des aktuellen Tagesordners.
echo 'Removing current day folder on S3'
# "which aws" gibt auf der Konsole den Pfad aus.
/usr/local/bin/aws s3 rm s3://${S3_BUCKET}/${ROLLING_FOLDER} --recursive

echo 'Archiving folders'

FOLDERS=$(echo $BAK_SOURCES | tr "," "\n")
i=0
for F in $FOLDERS
do
  echo ' '
  echo 'Archiving ' ${F} '...'
  i=`expr ${i} + 1`

  tar czPf ${BAK_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz ${F}
  echo 'Created tar file ' ${BAK_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz

  # "which aws" gibt auf der Konsole den Pfad an.
  /usr/local/bin/aws s3 cp ${BAK_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz s3://${S3_BUCKET}/${ROLLING_FOLDER}/FILE_${i}_${BAK_DATETIME}.tar.gz --storage-class REDUCED_REDUNDANCY
done

echo 'Deleting temp local backup folder ' ${BAK_FOLDER}
rm -f -R ${BAK_FOLDER}

echo ' '
echo 'finished'
echo '----------------------------------'

Das Skript habe ich in /home/zeta gespeichert.

Scheduler einrichten

Zuletzt habe ich noch via sudo crontab -e die Scheduler-Datei im Editor geöffnet und folgende Zeile eingegeben:

0 1 * * * /home/zeta/backup.sh > /home/zeta/backup.log 2>&1

(Beschreibung, was die obige Umleitung > und 2>&1 bedeuten steht hier).

Wenn anstatt dem > ein >> benutzt wird, wird die Protokolldatei nicht bei jedem Aufruf gelöscht, sondern es wird jeweils an die Datei angefügt.