Cómo resolver los retos comunes al desplegar Symfony en AWS Elastic Beanstalk

AWS Elastic Beanstalk es una plataforma versátil para el despliegue de aplicaciones en la nube, permitiendo a los desarrolladores centrarse en su código mientras AWS gestiona el balanceo de carga, la configuración de servidores y el monitoreo. Sin embargo, desplegar aplicaciones Symfony presenta retos específicos, como la gestión de rutas amigables, generación de claves JWT y configuraciones persistentes. Este artículo ofrece soluciones prácticas basadas en experiencias reales para superar estos desafíos.

Configuración Inicial de Elastic Beanstalk para Symfony

1. Ajuste del directorio raíz para Symfony

Elastic Beanstalk configura el servidor web para apuntar al directorio raíz /var/www/html de forma predeterminada. Sin embargo, las aplicaciones Symfony requieren que el servidor apunte al subdirectorio public/, lo que genera errores 404 al no encontrar los archivos necesarios.

Solución: Configuración de Nginx Crea o modifica el archivo .platform/nginx/conf.d/elasticbeanstalk/01-rewrite.conf para redirigir correctamente las solicitudes al directorio public/:

location / {
    root /var/www/html/public; # Define el directorio público como raíz
    try_files $uri /index.php$is_args$args;
}

2. Persistencia de la configuración tras despliegues

Los despliegues de Elastic Beanstalk reemplazan las instancias EC2, eliminando cualquier cambio manual. Para garantizar que la configuración persista:

  1. Incluye el archivo .platform/nginx/conf.d/elasticbeanstalk/01-rewrite.conf en tu repositorio.
  2. Verifica que no esté listado en .gitignore y súbelo al control de versiones:

    git add .platform/nginx/conf.d/elasticbeanstalk/01-rewrite.conf

git commit -m "Añadir configuración de Nginx para redirección al directorio public/"

3. Validación de la configuración

Tras realizar un despliegue, verifica que el servidor Nginx esté utilizando el directorio correcto:

sudo cat /etc/nginx/conf.d/elasticbeanstalk/01-rewrite.conf

El archivo debe mostrar la línea:

root /var/www/html/public;

Si no aparece, asegúrate de que el archivo .platform fue incluido correctamente en el despliegue.

Resultado
Con esta configuración, las solicitudes son redirigidas correctamente al controlador index.php dentro del directorio public/, resolviendo los errores 404 y asegurando que la aplicación Symfony funcione correctamente.

Problemas comunes y soluciones

Problema 1: Errores 404 en rutas amigables

Síntomas
Las rutas amigables de Symfony, como /order/invoice/{id}, generan errores 404, mientras que la página principal (/) carga correctamente.

Causa
La configuración predeterminada de Elastic Beanstalk con Nginx no redirige las solicitudes al controlador principal index.php, necesario para procesar las rutas amigables de Symfony.

Solución
Para garantizar que Nginx redirija correctamente las solicitudes:

1. Validar la configuración de reescritura de URLs Asegúrate de que el archivo .platform/nginx/conf.d/elasticbeanstalk/01-rewrite.conf incluya: location / {
  root /var/www/html/public; # Directorio público
  try_files $uri /index.php$is_args$args;
}

2. Persistir la configuraciónIncluye este archivo en el control de versiones y verifica su presencia tras el despliegue con:

sudo cat /etc/nginx/conf.d/elasticbeanstalk/01-rewrite.conf

3. Reiniciar Nginx si es necesarioSi los cambios no se aplican automáticamente:

sudo service nginx restart

Resultado
Las rutas amigables redirigen correctamente a index.php, eliminando los errores 404.

Problema 2: Tokens JWT vacíos

Síntomas
El endpoint /auth responde con un token vacío ({ "token": "" }) incluso cuando las credenciales son correctas.

Causa
Elastic Beanstalk reemplaza las instancias EC2 en cada despliegue, eliminando las claves JWT generadas manualmente, lo que impide la firma de los tokens.

Solución
Automatiza la generación de claves JWT:

1. Crear un script de predespliegue
En .platform/hooks/predeploy/, crea 01_generate_jwt_keys.sh:
#!/bin/bash
echo "Generando claves JWT..."
php bin/console lexik:jwt:generate-keypair --overwrite --env=prod
echo "Claves JWT generadas con éxito."

2. Dar permisos de ejecución al script
chmod +x .platform/hooks/predeploy/01_generate_jwt_keys.sh

3. Validar las claves tras el despliegue
Confirma la existencia de private.pem y public.pem en config/jwt/: ls -l config/jwt/

4. Probar el endpoint
Verifica que /auth genera un token válido:
curl -X POST http://<tu-dominio>/auth \
-H "Content-Type: application/json" \
-d '{"email": "usuario@ejemplo.com", "password": "contraseña"}'

Resultado
Con este hook, las claves JWT se generan automáticamente en cada despliegue, asegurando que el sistema de autenticación funcione correctamente.

Conclusión

Desplegar aplicaciones Symfony en AWS Elastic Beanstalk puede parecer desafiante al principio, pero con una configuración adecuada y un enfoque automatizado, los principales obstáculos se pueden superar de manera efectiva. A lo largo de este artículo, hemos identificado y resuelto problemas comunes, como la reescritura de URLs con Nginx y la generación persistente de claves JWT, dos pilares críticos para garantizar que la aplicación funcione sin interrupciones en producción.

La automatización se destaca como un componente esencial para gestionar despliegues consistentes y reducir errores manuales. Los hooks de predespliegue y la correcta configuración de archivos persistentes permiten alinear el entorno con las necesidades específicas de Symfony, como el uso del directorio public/ y la gestión de rutas amigables.

Para los desarrolladores que buscan implementar Symfony en Elastic Beanstalk, recomiendo:

  1. Automatizar configuraciones clave: Desde la generación de claves JWT hasta la gestión de rutas, los scripts automatizados minimizan problemas recurrentes.
  2. Verificar y validar configuraciones: Asegúrate de revisar los logs y validar que las configuraciones aplicadas sean las esperadas tras cada despliegue.
  3. Mantener una documentación clara: Un registro detallado de configuraciones y scripts facilita la solución de problemas y la implementación de actualizaciones futuras.

Con estas prácticas, Elastic Beanstalk puede convertirse en un entorno confiable para aplicaciones Symfony, ofreciendo escalabilidad, robustez y eficiencia. AWS Elastic Beanstalk no solo simplifica la gestión de infraestructura, sino que, con la preparación adecuada, se convierte en un aliado estratégico para desarrollar aplicaciones modernas y escalables en la nube.

¿Has enfrentado algún desafío similar al desplegar Symfony u otras aplicaciones en AWS Elastic Beanstalk? Comparte tus experiencias o soluciones en los comentarios; ¡nos encantaría conocer tus enfoques y aprendizajes!

Fuentes: