[Debian] Amazon S3 jako dysk (s3fs)

Opublikowany 28 listopada 2011, w Linux, Narzędzia, przez Rafał Gałka

Pewnie wszyscy znacie powiedzonko „Ludzie dzielą się na tych, co robią backupy i tych co dopiero będą je robić…”. I jak to w życiu bywa, większość osób przed mniejszą/większą utratą danych zalicza się do drugiej grupy. Ja do dzisiaj stałem „rozkrokiem”… :)

Od kilku miesięcy regularnie backupuję z desktopa (M$ Windows) całą bibliotekę zdjęć (obecnie ok. 33GB) używając DragonDisk – Amazon S3 Client. Ale jakoś ciągle brakowało mi czasu/chęci aby zorganizować backup/archiwum projektów z serwera deweloperskiego. Aż do dzisiaj, gdy podczas robienia drobnych porządków, skasowałem sobie repozytorium jednego z archiwalnych projektów…

Idea podłączenia usługi Amazon S3 jako dysku (za pomocą s3fs), chodziła mi po głowie od dłuższego czasu. Takie rozwiązanie ma dwie zasadnicze zalety:

  • dostępność – nie wymaga uruchamiania klienta, logowania, kopiowania danych na lokalny system plików i wgrywania ich z powrotem gdy coś zmodyfikujemy
  • lokalny cache – domyślnie nie jest włączony – dzięki tej opcji praca na pliku wykonywana jest w lokalnym systemie plików a zmiany wprowadzane są automatycznie do S3 jak tylko plik zostanie zwolniony

Dla równowagi natury rzeczy istnieją też dwa istotne ograniczenia:

  • Eventual Consistency - w skrócie oznacza to, że  po wykonaniu operacji zapisu, zmiany mogą nie być natychmiast dostępne dla następującej po niej operacji odczytu. Innymi słowy, mamy do czynienia z rozproszonym systemem plików i nie możemy wymagać od niego tego samego, czego wymaga się od lokalnej pamięci. Ważne aby podczas tworzenia „wiaderka” wybrać region US-West lub EU ponieważ rozwiązują one jeden z problemów spójności, a dokładniej „read-after-write” (nadal należy się liczyć z problemami „read-after-delete” i „read-after-update”)
  • brak zarządzania dostępem – albo zawartość dysku jest dostępna tylko dla root’a, albo dla wszystkich użytkowników systemu

Przejdźmy więc do konkretów. Najpierw upewniamy się, że mamy zainstalowane niezbędne pakiety:

apt-get install build-essential libfuse-dev fuse-utils libcurl4-openssl-dev libxml2-dev mime-support

Pobieramy, kompilujemy i instalujemy s3fs:

wget http://s3fs.googlecode.com/files/s3fs-1.61.tar.gz
tar xvzf s3fs-1.61.tar.gz
cd s3fs-1.61/
./configure --prefix=/usr
make
make install

Dane dostępowe do usługi Amazon S3 możemy podać podczas montowania dysku, stworzyć plik .passwd-s3fs w lokalnym katalogu użytkownika, zdefiniować zmienne środowiskowe AWSACCESSKEYID i AWSSECRETACCESSKEY lub zapisać w globalnym pliku konfiguracyjnym /etc/passwd-s3fs. Osobiście najbardziej przypadła mi do gustu ostatnia opcja:

touch /etc/passwd-s3fs
chmod 640 /etc/passwd-s3fs
echo "bucketName:accessKeyId:secretAccessKey" | tee /etc/passwd-s3fs

Montujemy dysk z opcją cache oraz dostępem dla zwykłych użytkowników:

mkdir /mnt/bucketName
mkdir /var/lib/s3fs
s3fs bucketName /mnt/bucketName/ -o use_cache=/var/lib/s3fs -o allow_other

W katalogu /mnt/bucketName powinna pojawić się zawartość „wiaderka” z S3. Jeśli jeszcze nic do niego nie wrzucaliśmy możemy dla pewności przetestować polecenie w stylu echo "foo bar baz" | tee /mnt/bucketName/test.txt i sprawdzić w konsoli AWS czy plik został dodany. Jeśli wszystko działa jak powinno możemy uprościć montowanie naszego dysku dodając odpowiedni wpis w /etc/fstab

umount /mnt/bucketName
cp -a /etc/fstab /etc/fstab.bak
echo "s3fs#bucketName /mnt/bucketName fuse use_cache=/var/lib/s3fs,allow_other 0 0" | tee -a /etc/fstab
mount /mnt/bucketName

Pewnie zastanawiacie się jak taki dysk można wykorzystać poza zwykłym rsync’owaniem do niego ważnych katalogów/plików. Ja postanowiłem sprawdzić jak s3fs poradzi sobie z przechowywaniem repozytoriów Git. Odpaliłem kopię Gitolite i mam zamiar push’ować do niego źródła projektu esmoke, który dłubię w wolnych chwilach. Jak będę miał jakieś przemyślenia z chęcią się z Wami podzielę.

Tagged with:  

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>