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

aws
ubuntu
s3
backup
Tags: #<Tag:0x00007ff2a918c9e8> #<Tag:0x00007ff2a918c740> #<Tag:0x00007ff2a918c268> #<Tag:0x00007ff2a918c060>

#1

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.

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.