$ 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!