Backup na Amazon S3

Wyjaśnienie: wpis jest nieco bardziej techniczny niż zwykle, osoby niezainteresowane kopiami zapasowymi w chmurze mogą go sobie z czystym sercem odpuścić 😉

Od ładnych kilku lat administruję prywatnym linuksowym serwerem, utrzymywanym dzięki dobroci zaprzyjaźnionego ISP. Na serwerze, oprócz niniejszego bloga znajduje się też strona A. i kilka innych kont WWW, głównie proste strony oparte o WordPressa. Od dłuższego czasu zastanawiałem się jak to wszystko backupować. Kiedy wczoraj przeczytałem o burzach w Braniewie (gdzie serwer fizycznie się znajduje), przestałem się zastanawiać i przeszedłem do czynów. Padło na Amazon Simple Storage Service (w skrócie S3).

Jak sama nazwa wskazuje, produkt Amazona jest prostą usługą do przechowywania plików. Wchodzi ona w skład Amazon Web Services. Dostęp do danych możliwy jest przez web-serwisy. Co ciekawe, Amazon nie daje możliwości podłączenia się przez FTP/SCP — jedynie webserwisy oparte o SOAP lub REST.

Zacząłem od rejestracji na stronie Amazon AWS. Podczas rejestracji trzeba podać dane bilingowe i nr karty z której Amazon będzie ściągał należności. Pierwsze 5 GB jest za darmo, później płaci się jakieś 43 grosze miesięcznie za każdy kolejny GB. Nie jest to majątek, a moje WordPressy spokojnie zmieszczą się w darmowym limicie. Po rejestracji uzyskałem dostęp do konsoli AWS, gdzie wygenerowałem klucze, które posłużą do uwierzytelnienia (opcja Security Credentials). Klucze są dwa: Access Key ID i Secret Access Key. Takich par można utworzyć wiele, zgodnie z zasadą: „para kluczy na program lub usługę”.

Pliki w ramach S3 przechowywane są w tzw. kubełkach (buckets). Jeden kubełek to jedna przestrzeń plików, każdy bucket musi mieć unikalną (w ramach całego S3) nazwę. Przy tworzeniu kubełka wybieramy jego region (US, Europa, itd.) Radzę pozostać przy domyślnym US, kubełek utworzony w Irlandii okazał się być bardzo niestabilny (tzn. nie udało się tam wrzucić żadnego pliku większego niż kilka kB ze względu na błędy połączenia).

Mamy kubełek, mamy klucze, trzeba jeszcze skonfigurować serwer. Narzędziem umożliwiającym łączenie się z S3 z poziomu linuksowej konsoli jest program s3cmd. W Debianowym repozytorium znajduje się jakaś tam wersja s3cmd, jednak lepiej ściągnąć najnowszą. Aby to zrobić, wystarczą trzy komendy:

wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | sudo apt-key add -
sudo wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list
sudo apt-get update && sudo apt-get install s3cmd

Po instalacji s3cmd trzeba go skonfigurować:

s3cmd --configure

Program zapyta o wygenerowane klucze i utworzy plik ~/.s3cfg. Program posiada szereg różnych komend, których znaczenia łatwo się domyślić: ls, get, put, itd. Mnie najbardziej interesowała komenda sync, pozwalają zsynchronizować lokalne drzewo katalogów z odpowiednią lokalizacją we wskazanym kubełku. Przykład użycia:

s3cmd sync --delete-removed /home/acme/public_html s3://example-bucket/acme/

Opcja –delete-remove usuwa z kubełka pliki, które nie istnieją już na lokalnej maszynie. A oto propozycja gotowego skryptu który backupuje wszystkie bazy MySQL i kilka wybranych katalogów:

#!/bin/sh
S3CMD=/usr/bin/s3cmd
SYNC="$S3CMD sync --delete-removed"
BUCKET="s3://example-bucket"
MYSQL_USER=backup
MYSQL_PASS=bakcup_password
MYSQL_BACKUP=/tmp/mysql.gz
 
echo "Dumping DB..."
mysqldump -u $MYSQL_USER -p$MYSQL_PASS --all-databases | gzip - > $MYSQL_BACKUP
echo "DB dumped"
$S3CMD put /tmp/mysql.gz $BUCKET/mysql.gz
rm $MYSQL_BACKUP
 
$SYNC /home/newton/public_html $BUCKET/newton.net.pl/
$SYNC /home/example/public_html $BUCKET/example.com/
$SYNC /home/another_page/public_html $BUCKET/page/

Skrypt można dodać do crona, aby wykonywał się np. codziennie o 4 rano:

0 4 * * * /root/s3backup > /dev/null

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *