FTP desde PHP entre instancias de EC2

Recientemente he tenido que configurar la conexión FTP entre 2 instancias de EC2, que puede ser bastante complicada si no tenemos en cuenta varios puntos.

Lo principal, es comprender que la conexión entre 2 instancias de EC2 es una conexión que se realiza entre 2 servidores protegidos por un cortafuegos, que además seguramente funcionen con una IP interna, y usen una IP pública asociada a su VPC.

Los problemas de FTP

La mayor parte de los problemas de FTP son fallos de diseño del propio protocolo (debido a su antiguedad), y no pueden ser solucionados de forma sencilla.

Cuando trabajamos con FTP en este tipo de entornos tenemos que tener en cuenta dos aspectos importantes:

El modo pasivo

Para conectar entre máquinas protegidas por cortafuegos, se usa el modo pasivo, donde se indica de forma directa los puertos de la conexión.

En la instancia que contiene el servidor FTP, debemos crear un Grupo de Seguridad que permita la conexión a un rango de puertos alto (por ejemplo, del 10.000 al 15.000).

Además, en el servidor FTP que estemos usando, debemos configurar el mismo rango de puertos como puertos a usar para las conexiones pasivas, de forma que todas las conexiones pasivas se realicen contra los puertos que hemos abierto.

En el lado del cliente, debemos indicar que la conexión es pasiva, y dependiendo de como nos estemos conectando, es posible que tengamos que enviar un comando PORT indicando la IP pública.

Las IPs de conexión

Cuando se realiza una conexión pasiva, es el cliente el que inicia la conexión de datos con el servidor.

Cuando el cliente se va a conectar, y dependiendo de la forma de hacerlo, y del tipo de conexión o VPC que estemos usando, es posible que envíe para la conexión la IP privada en lugar de la pública, con lo que la comunicación con el servidor no va a ser posible.

Esto se puede solucionar forzando la dirección IP pública con un comando PORT, justo después de iniciar el modo pasivo.

Conectando desde PHP

Si bien la conexión desde PHP es en principio exactamente igual a cualquier otro tipo de conexión, en PHP podemos hacerlo de una forma más sencilla con las funciones que el propio lenguaje incorpora.

En el siguiente ejemplo podéis ver un script completamente funcional de conexión en PHP:

<?php
ini_set('display_errors', 1);
ini_set('track_errors', 1);

$conn_id = ftp_connect('54.54.54.54');
ftp_login($conn_id, 'username', 'password');

ftp_set_option($conn_id, FTP_USEPASVADDRESS, false);
ftp_pasv($conn_id,true);

$l = ftp_nlist($conn_id, ".");
if( ! $l ) {
        print_r(error_get_last());
}
var_dump($l);

Las dos instrucciones importantes en el son las que usan las funciones ftp_set_option y ftp_pasv, que es donde indicamos la forma en que vamos a hacer la conexión.

La opción FTP_USEPASVADDRESS lo que hace es ignorar la IP que nos indica el servidor (que puede ser incorrecta) y usar la IP de la conexión directamente (que es la correcta).

La opción ftp_pasv inicia una conexión pasiva normal.

Con estas dos opciones, es posible conectar sin problemas aunque estemos conectando entre instancias separadas por un cortafuegos y que usan NAT para conectar.

 

¿Debo cambiarme a un VPS?

Los que nos dedicamos a esto de la web, poco a poco vamos acumulando pequeñas web que mantenemos en distintos proveedores de alojamientos baratos. Son productos por los que no cobramos mucho porque tampoco nos requieren mucho mantenimiento, y que simplemente “están ahí”.

Con el tiempo, y a medida que el número de webs que mantenemos va aumentando, nos surge la pregunta del millón: ¿Debo pasarme a un VPS?

Las ventajas de tener un VPS

Si tienes un número medio de webs (pongamos 8 o 10), tenerlas alojadas en tu propio VPS te da una serie de ventajas innegables:

  • Coste total menor que usando alojamientos separados.
  • Mejor uso de recursos, ya que los recursos que no usa una web quedan disponibles para otras.
  • Mayor capacidad para adaptar las configuraciones a nuestro gusto.
  • Todos los recursos del VPS están a nuestra disposición, no como en los alojamientos compartidos normales.
  • Internet está lleno de manuales para hacer las cosas que necesitemos.
  • Mejores opciones para ampliar recursos si se nos queda pequeño.

Los inconvenientes de tener un VPS

Cuando empiezas a usar tu propio VPS, te das cuenta de que no es oro todo lo que brilla, porque tener tu propio VPS tiene también incovenientes:

  • En imprescindible tener conocimientos en administración de sistemas.
  • Si no quieres que el precio se dispare, usarás un VPS GNU/Linux, que te obliga a saber sobre GNU/Linux
  • Normalmente usarás un panel de control (como Cpanel, Plesk o VestaCp), que pueden tener un coste asociado.
  • Debes conocer y manejar ese panel de control para evitarte problemas.
  • Si quieres tener libertad total, no puedes usar un panel de control, pero debes ser un buen administrador.
  • Tienes que ocuparte de cosas como las copias de seguridad, salvar los logs, etc

¿Entonces… qué hago?

El principal problema de usar un VPS es que tienes que saber manejarlo. Si estás dispuesto a aprender a hacerlo, vas a encontrar muchas ventajas. Si no tienes tiempo o ganas, mejor ni empieces porque al final te vas a arrepentir.

Si tu motivación es solo la de ahorrar dinero, lo más seguro es que acabes harto del cacharro. Si lo ves como una forma de aprender, mejorar y optimizar, no es una mala idea.

¿Qué proveedor de VPS me recomiendas?

Yo trabajo principalmente con 3:

Todos son baratos, y todos son buenos, pero no dejes de comparar antes de decidirte.

 

¿Qué es AWS SNS?

Dentro de la infraestructura de Servicios Web de Amazon, SNS es uno de los dos servicios que se ocupan de enviar notificaciones.

SNS son las siglas de Simple Notification Service (Servicio Simple de Notificaciones, en castellano), y es el nombre que mejor define su función: enviar notificaciones a los subscriptores de forma rápida y fiable.

¿Cómo funciona SNS?

SNS es un servicio completamente desatendido y administrado, que funciona en alta disponibilidad, y de forma segura y durable.

La principal ventaja de SNS es que no necesitamos conocer nada sobre su estructura o funcionamiento, ya que está pensado para que nuestro único trabajo sea integrar nuestra aplicación con la API de SNS, y sea SNS quien se ocupe de todo el trabajo de distribución de mensajes.

En su estructura más básica, solo necesitamos crear un Tema de notificación (un asunto sobre el que queremos mandar mensajes, como por ejemplo “Errores”, para avisar de los errores del sistema), y subscribir los puntos que recibirán la notificación. Estos puntos pueden ser de diferentes tipos:

  • HTTP
  • HTTPS
  • Email
  • Email-JSON
  • Amazon SQS
  • Applicación
  • AWS Lambda
  • SMS

¿Cuales son los costes de SNS?

SNS es un servicio pensado para el envío masivo de mensajes que, al igual que el resto de servicios de AWS, tiene un coste muy bajo, basado en el volumen de mensajes enviado.

Además, la capa gratuita de AWS para SNS incluye el primer millón de mensajes, que será más que suficiente para usos básicos del servicio.

Es importante matizar que el envío de mensajes vía SMS si que tiene un coste distinto (se cobra por cada SMS enviado), debido a las características de este tipo de servicio.