AWS CLI requiere la ruta completa al ejecutable en cron

Al montar un entorno de producción lo primero que hago es preparar el sistema de copias de seguridad: creo una entrada en el cron que ejecuta un programa que vuelca la base de datos con una frecuencia mínima de una vez al día y que depende de la intensidad de uso del servidor.

Pero claro, esta copia de seguridad está en el mismo servidor, por lo que aunque resulta muy útil cuando se produce un error de tipo PICNIC no nos sirve de mucho si el problema es de hardware o perdemos el control del servidor. Necesitamos mantener una copia de esos ficheros en otra parte.

Para esto normalmente yo usaba rsync y copiaba los ficheros en algún otro servidor, pero decidí cambiar a S3 porque me fío más de sus servidores. Los pasos son estos:

  • Crear un usuario en AWS que tendrá acceso solo a un bucket y crear en ese bucket una carpeta backup donde se guardarán las copias de seguridad.
  • Instalar las utilidades de S3 AWS CLI y configurarlas con los datos de acceso de ese usuario de AWS.
  • Meter en el cron una entrada que sincronice nuestra carpeta de copias de seguridad con S3.

El comando para hacer la sincronización es:

aws s3 sync /home/backupDB/ s3://NOMBRE_BUCKET/backup --delete

El –delete indica que si un fichero no está en la carpeta local debemos borrarla de S3. Esto, unido a otra entrada en el cron como esta:

find /home/backupDB/ -mtime +60 -exec rm {} \;

nos permite limitar las copias de seguridad a los últimos dos meses. Dependiendo de los requisitos de este proyecto variamos este valor.

Bueno, pues si uno ejecuta el comando de sincronización verá que funciona estupendamente, lo meterá en el cron y seguirá con su vida tan tranquilo confiando en que todo funcionará bien…

…aunque por si acaso se pondrá una nota para dos días después para revisar que los ficheros se están copiando en S3. Eso hice yo, ¡y menos mal!

Porque dos días después cuando entré en S3 a mirar el bucket vi que solo tenía los ficheros de cuando hice la sincronización a mano desde la línea de comandos. En la carpeta local estaban los ficheros, pero no se habían copiado a S3.

Ejecuté de nuevo desde línea de comandos el trabajo tal y como estaba en el cron y funcionó perfectamente. Revisé que el trabajo estaba bien definido y esperé al día siguiente: los ficheros seguían sin copiarse en S3. Ejecuté otra vez el comando: los ficheros se subieron a S3. En este momento yo ya estaba pegándole bocaos a la mesa.

Rebuscando por Internet encontré un mensaje en Stack Overflow (¿dónde si no?) que daba la solución: hay que poner la ruta completa al ejecutable de aws. La entrada en el cron quedaría entonces así:

0 */2 * * * /usr/local/bin/aws s3 sync /home/backupDB/ s3://NOMBRE_BUCKET/backup --delete

En este caso yo lo tengo configurado para que haga la sincronización cada dos horas. Con este cambio al día siguiente por fin respiré tranquilo al ver que ya aparecían los nuevos ficheros.

Instalar WSL en Windows 10

WSL (Windows Subsystem for Linux) es una maravilla que nos permite tener un sistema operativo Linux dentro de nuestro Windows 10, sin necesidad de utilizar máquinas virtuales y completamente integrado.

Por completamente integrado me refiero a que los dos SO comparten la misma dirección IP y los mismos puertos, si yo arranco un nginx en WSL podré acceder a él mediante http://localhost en mi navegador de Windows.

Para instalar WSL en Windows 10 tenemos estas instrucciones que nos guían paso a paso; voy a dejar aquí un resumen.

Lo primero es habilitar WSL, para ello abrimos un PowerShell como administrador y escribimos

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

A continuación nos vamos a la Microsoft Store y buscamos el nombre de la distribución que queramos instalar, por ejemplo Ubuntu. Le damos a descargar y se descargará e instalará como si fuera cualquier programa.

Mientras se descarga debemos pararnos y reflexionar sobre lo que está pasando. Estamos descargando una distribución de Linux directamente de la tienda de aplicaciones oficial de Microsoft, que ha desarrollado un sistema para que ambos convivan en nuestro ordenador. ¿Cómo se os queda el cuerpo?

Una vez se haya descargado, nos vamos al menú de inicio y pulsamos en el icono de Ubuntu que nos habrá aparecido. Al hacerlo estará unos momentos haciendo brujería y magia negra terminando la instalación y luego nos pedirá un nombre de usuario y una contraseña. Este será nuestro usuario, que tendrá permisos para sudo.

Hecho esto, ya podemos instalar todo lo que queramos. Eso sí, si instalamos servicios como nginx o mysql no se arrancarán automáticamente al iniciar el ordenador o entrar en WSL, deberemos arrancarlos a mano (o crearnos un script que arranque todo lo necesario). Seguro que hay alguna forma de hacerlo pero no lo he buscado, no me parece mal arrancar esos servicios a mano.

Una utilidad imprescindible para línea de comandos: screen

Cuando trabajamos con línea de comandos en servidores remotos hay veces que debemos ejecutar alguna tarea que requiere tiempo. En estos casos, si perdemos la conexión con el servidor no podremos saber de una forma sencilla cuándo se ha terminado de ejecutar esa tarea, ya que aunque podamos reconectarnos la sesión de terminal se habrá perdido.

Para evitar esto podemos usar screen, que nos permite tener varias “sesiones” abiertas. Si perdemos la conexión al servidor mientras estamos dentro de una de las sesiones al volver a conectar podremos recuperar la sesión en la que estábamos sin problema. Esa es su ventaja número uno.

Su segunda ventaja es que permite dividir la pantalla en dos de forma horizontal y vertical. Esto es algo que pueden hacer los programas gráficos de terminal, podemos tener tantas pestañas abiertas en un servidor como queramos, pero no está de más conocerlo porque hay casos en los que nos resultará más cómodo tener la información de dos sesiones a la vista al mismo tiempo. Aquí hay un listado con los comandos más habituales de screen.

Bonus tip: para simplificar un poco el uso de screen existe una utilidad llamada screenie que no es más que un pequeño interfaz de texto para crear nuevas sesiones o conectarse a las existentes.

¿Cómo hacer que mi teléfono Android aparezca en adb para hacer debug remoto en Linux Mint?

Lo primero es conectar el teléfono por USB al ordenador, si nos pregunta qué modo de conexión queremos usar seleccionaremos el de imágenes.

A continuación ejecutamos lsusb, que nos devolverá varias líneas con información sobre nuestros dispositivos USB, el que nos interesa es el del teléfono, en mi caso (Huawei P Smart):

Bus 001 Device 075: ID 12d1:107e Huawei Technologies Co., Ltd. 

Con esta información crearemos el fichero /etc/udev/rules.d/51-android.rules con este contenido:

SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", ATTR{idProduct}=="107e", MODE="0666" GROUP="plugdev", SYMLINK+="android%n"

Hecho esto reiniciamos el servicio udev:

/etc/init.d/udev restart

Editamos el fichero ~/.android/adb_usb.ini y añadimos una línea con el identificador del fabricante (12d1 en mi caso) en formato hexadecimal:

0x12d1

Y arrancamos el servidor de adb:

adb kill-server && adb start-server

Y ¡listo! Nos vamos a las opciones del desarrollador del teléfono, activamos la opción Depuración por USB y ya podremos inspeccionar desde el ordenador las ventanas de Chrome.