En esta oportunidad estaremos viendo como poder montar un bucket s3 en una instancia EC2 de AWS, es importante mencionar que también funciona con un servidor creado fuera de la nube de Amazon, como puede ser Google Cloud, Azure, DigitalOcean, etc.
El montaje de un Bucket S3 en nuestro servidor puede llegar a ser de mucha utilidad, sobre todo si necesitamos realizar respaldos de nuestro sistema, esta sería una excelente oportunidad para poder guardar externamente copias de seguridad de forma segura en un bucket S3.
Si no tienes un Becket S3 creado lo primero es crear uno, para ello desde la pantalla principal de AWS nos ubicamos en Almacenamiento y luego seleccionamos en S3.
AWS nos listará todos los bucket que hayamos creado con anterioridad, en caso de no tener ninguno o querer crear uno nuevo seleccionamos en el botón Crear bucket.
Para configurarlo le asignamos un nombre al bucket (este nombre debe ser único y no debe contener espacios) y seleccionamos una región a elección.
Dejamos por defecto marcada la opción Bloquear todo el acceso público ya que para este propósito necesitamos un bucket privado y no de acceso público.
Finalmente bajamos y damos en Crear bucket para finalizar la creación de este.
Nuestro bucket ha sido creado correctamente y si lo seleccionamos podemos ver que nos da la opción se subir archivos, aunque para este caso no lo realizaremos desde aquí ya que será directamente desde nuestro servidor.
s3fs nos permitirá realizar el montaje de un bucket S3 en nuestro sistema, la instalación de s3fs está disponible para diferentes distribuciones, por lo cual, debes ingresar los comandos correspondientes según el sistema que tengas instalado.
Instalación en Amazon Linux a través de EPEL:
sudo amazon-linux-extras install epel
sudo yum install s3fs-fuse
Instalación en Arch Linux:
sudo pacman -S s3fs-fuse
Instalación en Debian 9 y Ubuntu 16.04 o más reciente:
sudo apt install s3fs
Instalación en Fedora 27 o más reciente:
sudo dnf install s3fs-fuse
Instalación en Gentoo:
sudo emerge net-fs/s3fs
Instalación en RHEL y CentOS 7 o más reciente a través de EPEL:
sudo yum install epel-release
sudo yum install s3fs-fuse
Instalación en SUSE 12 y openSUSE 42.1 o más reciente:
brew install --cask osxfuse
brew install s3fs
Si necesitas saber como levantar tu servidor Linux en Amazon Web Services te invito a revisar el articulo Crear una instancia EC2 de Linux en AWS disponible en este el sitio.
Una vez que estemos conectados en la terminal de nuestro servidor realizamos la instalación correspondiente.
En este caso, el sistema operativo que tenemos es Amazon Linux 2, por lo cual realizaremos la instalación con los comandos correspondientes.
[root@ip-172-31-24-4 ~]# sudo amazon-linux-extras install epel
Installing epel-release
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-epel
12 metadata files removed
4 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
amzn2extra-docker | 3.0 kB 00:00:00
amzn2extra-epel | 3.0 kB 00:00:00
(1/7): amzn2-core/2/x86_64/group_gz | 2.5 kB 00:00:00
(2/7): amzn2-core/2/x86_64/updateinfo | 350 kB 00:00:00
(3/7): amzn2extra-epel/2/x86_64/primary_db | 1.8 kB 00:00:00
(4/7): amzn2extra-docker/2/x86_64/updateinfo | 76 B 00:00:00
(5/7): amzn2extra-docker/2/x86_64/primary_db | 74 kB 00:00:00
(6/7): amzn2extra-epel/2/x86_64/updateinfo | 76 B 00:00:00
(7/7): amzn2-core/2/x86_64/primary_db | 50 MB 00:00:01
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-11 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================== Package Arch Version Repository Size
========================================================================================================================Installing:
epel-release noarch 7-11 amzn2extra-epel 15 k
Transaction Summary
========================================================================================================================Install 1 Package
Total download size: 15 k
Installed size: 24 k
Is this ok [y/d/N]: y
Downloading packages:
epel-release-7-11.noarch.rpm | 15 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : epel-release-7-11.noarch 1/1
Verifying : epel-release-7-11.noarch 1/1
Installed:
epel-release.noarch 0:7-11
Complete!
0 ansible2 available \
[ =2.4.2 =2.4.6 =2.8 =stable ]
2 httpd_modules available [ =1.0 =stable ]
3 memcached1.5 available \
[ =1.5.1 =1.5.16 =1.5.17 ]
5 postgresql9.6 available \
[ =9.6.6 =9.6.8 =stable ]
6 postgresql10 available [ =10 =stable ]
8 redis4.0 available \
[ =4.0.5 =4.0.10 =stable ]
9 R3.4 available [ =3.4.3 =stable ]
10 rust1 available \
[ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0
=stable ]
11 vim available [ =8.0 =stable ]
15 php7.2 available \
[ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14
=7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23
=7.2.24 =7.2.26 =stable ]
17 lamp-mariadb10.2-php7.2 available \
[ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5
=10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13
=10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17
=10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23
=10.2.10_7.2.24 =stable ]
18 libreoffice available \
[ =5.0.6.2_15 =5.3.6.1 =stable ]
19 gimp available [ =2.8.22 ]
20 docker=latest enabled \
[ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ]
21 mate-desktop1.x available \
[ =1.19.0 =1.20.0 =stable ]
22 GraphicsMagick1.3 available \
[ =1.3.29 =1.3.32 =1.3.34 =stable ]
23 tomcat8.5 available \
[ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50
=stable ]
24 epel=latest enabled [ =7.11 =stable ]
25 testing available [ =1.0 =stable ]
26 ecs available [ =stable ]
27 corretto8 available \
[ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232
=1.8.0_242 =stable ]
28 firecracker available [ =0.11 =stable ]
29 golang1.11 available \
[ =1.11.3 =1.11.11 =1.11.13 =stable ]
30 squid4 available [ =4 =stable ]
31 php7.3 available \
[ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10
=7.3.11 =7.3.13 =stable ]
32 lustre2.10 available \
[ =2.10.5 =2.10.8 =stable ]
33 java-openjdk11 available [ =11 =stable ]
34 lynis available [ =stable ]
35 kernel-ng available [ =stable ]
36 BCC available [ =0.x =stable ]
37 mono available [ =5.x =stable ]
38 nginx1 available [ =stable ]
39 ruby2.6 available [ =2.6 =stable ]
40 mock available [ =stable ]
41 postgresql11 available [ =11 =stable ]
42 php7.4 available [ =stable ]
43 livepatch available [ =stable ]
44 python3.8 available [ =stable ]
45 haproxy2 available [ =stable ]
46 collectd available [ =stable ]
47 aws-nitro-enclaves-cli available [ =stable ]
48 R4 available [ =stable ]
49 kernel-5.4 available [ =stable ]
50 selinux-ng available [ =stable ]
51 php8.0 available [ =stable ]
[root@ip-172-31-24-4 ~]#
[root@ip-172-31-24-4 ~]# sudo yum install s3fs-fuse
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
205 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package s3fs-fuse.x86_64 0:1.88-1.el7 will be installed
--> Processing Dependency: fuse >= 2.8.4 for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: fuse-libs >= 2.8.4 for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: libfuse.so.2(FUSE_2.2)(64bit) for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: libfuse.so.2(FUSE_2.5)(64bit) for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: libfuse.so.2(FUSE_2.6)(64bit) for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: libfuse.so.2(FUSE_2.8)(64bit) for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: mailcap for package: s3fs-fuse-1.88-1.el7.x86_64
--> Processing Dependency: libfuse.so.2()(64bit) for package: s3fs-fuse-1.88-1.el7.x86_64
--> Running transaction check
---> Package fuse.x86_64 0:2.9.2-11.amzn2 will be installed
---> Package fuse-libs.x86_64 0:2.9.2-11.amzn2 will be installed
---> Package mailcap.noarch 0:2.1.41-2.amzn2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
============================================================================================================================================================================================================================================ Package Arch Version Repository Size
============================================================================================================================================================================================================================================Installing:
s3fs-fuse x86_64 1.88-1.el7 epel 291 k
Installing for dependencies:
fuse x86_64 2.9.2-11.amzn2 amzn2-core 86 k
fuse-libs x86_64 2.9.2-11.amzn2 amzn2-core 94 k
mailcap noarch 2.1.41-2.amzn2 amzn2-core 31 k
Transaction Summary
============================================================================================================================================================================================================================================Install 1 Package (+3 Dependent packages)
Total download size: 501 k
Installed size: 1.3 M
Is this ok [y/d/N]: y
Downloading packages:
(1/4): fuse-libs-2.9.2-11.amzn2.x86_64.rpm | 94 kB 00:00:00
(2/4): mailcap-2.1.41-2.amzn2.noarch.rpm | 31 kB 00:00:00
(3/4): fuse-2.9.2-11.amzn2.x86_64.rpm | 86 kB 00:00:00
warning: /var/cache/yum/x86_64/2/epel/packages/s3fs-fuse-1.88-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Public key for s3fs-fuse-1.88-1.el7.x86_64.rpm is not installed
(4/4): s3fs-fuse-1.88-1.el7.x86_64.rpm | 291 kB 00:00:00
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Total 1.8 MB/s | 501 kB 00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
Userid : "Fedora EPEL (7) "
Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
Package : epel-release-7-11.noarch (@amzn2extra-epel)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Is this ok [y/N]: y
Running transaction check
Transaction test succeeded
Running transaction
Installing : fuse-2.9.2-11.amzn2.x86_64 1/4
Installing : fuse-libs-2.9.2-11.amzn2.x86_64 2/4
Installing : mailcap-2.1.41-2.amzn2.noarch 3/4
Installing : s3fs-fuse-1.88-1.el7.x86_64 4/4
Verifying : mailcap-2.1.41-2.amzn2.noarch 1/4
Verifying : fuse-libs-2.9.2-11.amzn2.x86_64 2/4
Verifying : fuse-2.9.2-11.amzn2.x86_64 3/4
Verifying : s3fs-fuse-1.88-1.el7.x86_64 4/4
Installed:
s3fs-fuse.x86_64 0:1.88-1.el7
Dependency Installed:
fuse.x86_64 0:2.9.2-11.amzn2 fuse-libs.x86_64 0:2.9.2-11.amzn2 mailcap.noarch 0:2.1.41-2.amzn2
Complete!
[root@ip-172-31-24-4 ~]#
Para poder tener acceso al bucket desde nuestro sistema debemos crear unas credenciales de acceso al bucket, estas credenciales las creamos desde nuestro panel de AWS, para eso vamos a Servicios y hacemos clic en IAM.
Luego de hacer clic nos dirigimos a Usuarios que se encuentra en el menú lateral izquierdo, nos mostrará todos los usuarios creados con anterioridad, necesitamos crear un nuevo usuario por lo cual daremos clic en el botón Añadir usuario(s).
Asignaremos un nombre de usuario a elección, en este caso será acceso-bucket-s3 y seleccionamos el tipo de acceso mediante programación, luego damos en Siguiente.
Aquí seleccionamos Asociar directamente las políticas existentes, en el buscador ingresamos s3 y seleccionamos la opción AmazonS3FullAccess, luego damos en Siguiente.
Las etiquetas no serán necesarias para este caso así que las omitimos sin configurar nada, tan solo seleccionamos en Siguiente.
Revisamos que todo esté correcto y continuamos seleccionando Crear usuario.
Ya hemos creado nuestro usuario correctamente, ya tenemos disponibles las credenciales, es importante no cerrar esta pantalla ya que este es el único momento en que podemos tener acceso a ellas, en caso de que necesites cerrarla puedes descargar las credenciales y utilizarlas posteriormente.
Primeramente debemos agregar nuestras credenciales recién creadas en un archivo oculto llamado .passwd-s3fs, debemos agregar este archivo en nuestro directorio home, ya que estamos como usuario Root, nuestro archivo debe crearse en /root que es el directorio home de nuestro usuario, para ello aplicaremos el comando echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
reemplazando ACCESS_KEY_ID
por la ID de clave de acceso y chmod 600 ${HOME}/.passwd-s3fs
[root@ip-172-31-24-4 ~]# echo AKIAQYB6F325TYMUJB6I:KEuGFNkvfbWNPQ3mi2wE+bY+yGlwG9fowfSTb+oW > ${HOME}/.passwd-s3fs
[root@ip-172-31-24-4 ~]# chmod 600 ${HOME}/.passwd-s3fs
[root@ip-172-31-24-4 ~]#
Verificamos que efectivamente se creó el archivo y se asignaron los permisos ingresando el comando ls -la /root
, también podemos ver el contenido del archivo con cat /root/.passwd-s3fs
y verificar que se ingresaron correctamente las credenciales.
[root@ip-172-31-24-4 ~]# ls -la /root
total 24
dr-xr-x--- 3 root root 123 Feb 24 23:43 .
dr-xr-xr-x 18 root root 257 Feb 23 00:09 ..
-rw-r--r-- 1 root root 18 Oct 18 2017 .bash_logout
-rw-r--r-- 1 root root 176 Oct 18 2017 .bash_profile
-rw-r--r-- 1 root root 176 Oct 18 2017 .bashrc
-rw-r--r-- 1 root root 100 Oct 18 2017 .cshrc
-rw------- 1 root root 62 Feb 24 23:43 .passwd-s3fs
drwx------ 2 root root 29 Feb 23 00:10 .ssh
-rw-r--r-- 1 root root 129 Oct 18 2017 .tcshrc
[root@ip-172-31-24-4 ~]# cat /root/.passwd-s3fs
AKIAQYB6F325TYMUJB6I:KEuGFNkvfbWNPQ3mi2wE+bY+yGlwG9fowfSTb+oW
[root@ip-172-31-24-4 ~]#
Luego de verificar aplicaremos el comando df
para ver las unidades de almacenamiento que tenemos en el sistema, posteriormente cuando configuremos el montaje del bucket s3 nos aparecerá en esta lista.
[root@ip-172-31-24-4 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 492680 0 492680 0% /dev
tmpfs 503448 0 503448 0% /dev/shm
tmpfs 503448 440 503008 1% /run
tmpfs 503448 0 503448 0% /sys/fs/cgroup
/dev/xvda1 8376300 1742564 6633736 21% /
tmpfs 100692 0 100692 0% /run/user/1000
[root@ip-172-31-24-4 ~]#
Para comenzar a realizar el montaje, primeramente, crearemos un directorio en el cual montaremos el bucket S3, es este caso crearemos un directorio llamado respaldo-s3 en la raíz del sistema con el comando mkdir /respaldo-s3
.
[root@ip-172-31-24-4 ~]# mkdir /respaldo-s3
[root@ip-172-31-24-4 ~]#
Ahora realizaremos el montaje del bucket ingresando el comando s3fs nombrebucket /rutadirectorio -o passwd_file=${HOME}/.passwd-s3fs
donde nombrebucket
es el nombre del bucket creado en AWS y /rutadirectorio
es el nombre del directorio recién creado.
[root@ip-172-31-24-4 ~]# s3fs mzbuckets3 /respaldo-s3 -o passwd_file=${HOME}/.passwd-s3fs
[root@ip-172-31-24-4 ~]#
Una vez realizado podemos ingresar el comando df
para ver las unidades de almacenamiento montadas en el sistema, ahora vemos que nos aparece nuestro bucket s3 que acabamos de configurar.
[root@ip-172-31-24-4 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 492680 0 492680 0% /dev
tmpfs 503448 0 503448 0% /dev/shm
tmpfs 503448 444 503004 1% /run
tmpfs 503448 0 503448 0% /sys/fs/cgroup
/dev/xvda1 8376300 1744588 6631712 21% /
tmpfs 100692 0 100692 0% /run/user/1000
s3fs 274877906944 0 274877906944 0% /respaldo-s3
[root@ip-172-31-24-4 ~]#
Es importante mencionar que cada vez que reiniciemos el servidor debemos montar el bucket S3 nuevamente de forma manual, para evitar esto y que el montaje se realice de forma automática al reiniciar, debemos agregar la línea mzbuckets3 /respaldo-s3 fuse.s3fs _netdev,allow_other 0 0
(recuerda reemplazar el nombre del bucket y directorio según tu caso) al archivo /etc/fstab
, edita el archivo con algún editor a elección como nano o vi.
[root@ip-172-31-24-4 ~]# vi /etc/fstab
[root@ip-172-31-24-4 ~]#
#
UUID=518d317e-9b1a-43aa-8b7c-850dd3510341 / xfs defaults,noatime 1 1
mzbuckets3 /respaldo-s3 fuse.s3fs _netdev,allow_other 0 0
~
~
~
~
Luego de realizar lo anterior podemos reiniciar el sistema para verificar que efectivamente el montaje se realiza automáticamente.
Ahora, ingresaremos a nuestro bucket S3 montado, crearemos un archivo y una carpeta para verificar que se creen correctamente.
[root@ip-172-31-24-4 ~]# cd /respaldo-s3
[root@ip-172-31-24-4 respaldo-s3]# touch archivo-test.txt
[root@ip-172-31-24-4 respaldo-s3]# mkdir carpeta-test
[root@ip-172-31-24-4 respaldo-s3]# ls
archivo-test.txt carpeta-test
[root@ip-172-31-24-4 respaldo-s3]#
Por último, nos vamos al bucket S3 en AWS y lo actualizamos para verificar que nos lista el mismo archivo y carpeta creada recientemente desde nuestra terminal.