$ useradd -d /home/ec2-user/s3mount -s /sbin/nologin nomeutente
$ passwd nomeutente
Cambio password per l'utente nomeutente.

 

In questo post vedremo come tirare un server FTP utilizzando una istanza Amazon EC2 che sincronizza automaticamente  i dati verso un bucket Amazon S3. Questa soluzione dirty-cheap sfrutta la libreria s3fs che ci permette in sostanza di montare un bucket S3 come un volume locale, usando il celebre FUSE e di eseguire letture/scritture senza alcun problemi, proprio come se i file fossero in locale. Configureremo successivamente un server FTP basato sul collaudato vsftpd  per interagire dall’esterno con l’istanza EC2.

Perché S3?

Amazon S3 è una garanzia, un pilastro del cloud object storage ed offre una durabilità del 99,999999999% (ci basta?) e ci permette di non avere alcun limite di storage. Costruiremo, in effetti, un backup server FTP con storage illimitato.

Perché FTP?

FTP non è un protocollo sicuro, ma è stabile, perfettamente compatibile con App di qualsiasi genere. A fornire maggiore protezione ci penseremo noi sfruttando le potenzialità dei Security Group di Amazon EC2. Per il momento concentriamoci sulla costruzione del servizio, pensando in futuro all’implementazione di un FTP-sicuro (FTPS) oppure un SFTP via SSH.

Come funziona s3fs

Gli hard disk locali, SAN o iSCSI conservano le informazioni come blocchi. Questo significa che potenzialmente, ogni memoria di questo tipo potrebbe funzionare universalmente con un sistema operativo Unix. Amazon S3, invece, è costruita sul concetto di object storage, per questo non direttamente compatibile con un sistema operativo standard.

La libreria s3fs risolve questo problema: si occupa di emulare come un filesystem locale (sul quale possiamo creare, cancellare, rinominare i file, etc.) un object storage remoto.

Ci siamo, abbiamo capito come trasferire i file sulla nostra istanza EC2, tramite il protocollo FTP, e come poi spostare questi file su Amazon S3, tramite la libreria s3fs. Procediamo allora.

Installiamo e configuriamo s3fs

Come root, procediamo all’installazione dei pacchetti di supporto:

# sudo su
# yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

Scarichiamo e compiliamo s3fs:

git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd s3fs-fuse
./autogen.sh
./configure
make
make install

A questo punto, aggiungiamo le nostre credenziali AWS al file auto-discovery:

# echo LA_NOSTRA_AWS_KEY:IL_NOSTRO_AWS_SECRET > ~/.passwd-s3fs
# chmod 640 ~/.passwd-s3fs

Creiamo una directory, che sarà quella automaticamente sincronizzata con un bucket S3:

# mkdir s3mount
# cd s3mount
# pwd
/home/ec2-user/s3mount

La nostra directory /home/ec2-user/s3mount , quindi, farà la magia.

Procediamo quindi a montare, come fosse un comune volume, il nostro bucket backupBucket (che abbiamo creato in precedenza) puntandolo proprio a questa directory:

/usr/local/bin/s3fs backupBucket /home/ec2-user/s3mount -o nonempty -o allow_other

Controlliamo che il volume sia montato correttamente:

# mount | grep s3fs
s3fs on /home/ec2-user/s3mount type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

Perfetto. Facciamo una piccola prova. Creiamo un file vuoto e controlliamo dalla console AWS S3 che questo file ci sia:

# touch /home/ec2-user/s3mount/prova.txt

Installiamo vsftpd

Sempre come root, installiamo il pacchetto vsftpd :

# yum install vsftpd
Plugin abilitati:priorities, update-motd, upgrade-helper
amzn-main                                                                                           | 2.1 kB  00:00:00     
amzn-updates                                                                                        | 2.5 kB  00:00:00     
Risoluzione dipendenze
--> Esecuzione del controllo di transazione
---> Pacchetto vsftpd.x86_64 0:2.2.2-13.13.amzn1 settato per essere installato
--> Risoluzione delle dipendenze completata

Dipendenze risolte

===========================================================================================================================
 Package                  Arch                     Versione                              Repository                   Dim.
===========================================================================================================================
Installazione:
 vsftpd                   x86_64                   2.2.2-13.13.amzn1                     amzn-main                   161 k

Riepilogo della transazione
===========================================================================================================================
Install  1 Pacchetto

Dimensione totale del download: 161 k
Dimensione installata: 320 k
Is this ok [y/d/N]: y
Downloading packages:
vsftpd-2.2.2-13.13.amzn1.x86_64.rpm                                                                 | 161 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installazione     : vsftpd-2.2.2-13.13.amzn1.x86_64                                                                  1/1 
  Verifica in corso : vsftpd-2.2.2-13.13.amzn1.x86_64                                                                  1/1 

Installato:
  vsftpd.x86_64 0:2.2.2-13.13.amzn1                                                                                        

Completo!

Procediamo subito alla sua configurazione editando il file vsftpd.conf :

vi /etc/vsftpd/vsftpd.conf

Impostiamo il file come segue. Possiamo configurarlo a piacimento, ma ricordiamoci di impostare local_enable=YES : permetterà a tutti gli utenti locali di accedere all’FTP.

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
chroot_local_user=YES
pam_service_name=vsftpd
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=15393
pasv_max_port=15592
port_enable=YES

Salviamo il file e lanciamo vsftpd:

# /etc/init.d/vsftpd restart
Arresto di vsftpd:                                         [  OK  ]
Avvio di vsftpd per vsftpd:                                [  OK  ]

Lanciamo vsftp al boot

Per sopravvivere al reboot, configuriamo il lancio all’avvio:

sudo chkconfig --level 345 vsftpd on

Apriamo le porte necessarie

Ricordiamoci di aprire le porte 20-21 e il range 15393-15592 nel Security Group dell’istanza! Decidiamo se “aprire a tutto il mondo” o stringere l’accesso ad uno o più indirizzi IP.

Creiamo un utente FTP

A questo punto, non ci resta che creare l’utente FTP con il quale effettueremo il login sul server FTP:

# useradd -d /home/ec2-user/s3mount -s /sbin/nologin nomeutente
useradd: attenzione: la directory home esiste già.
Non verrà copiato nessun file dalla directory skel.
# passwd nomeutente
Cambio password per l'utente nomeutente.

Impostiamo quindi i permessi sulla sua directory per evitare problemi:

# sudo chmod 755 /home/ec2-user
# sudo chmod 755 /home/ec2-user/s3mount
# chown -R nomeutente:nomeutente /home/ec2-user/s3mount/

Fatto. A questo punto, proviamo a collegarci all’IP pubblico della nostra istanza EC2 e proviamo ad eseguire l’upload di un file, lo troveremo nel nostro bucket Amazon S3!