Aprende a Instalar Laravel + Base de datos con Amazon Web Services paso a paso

Empezar a utilizar Amazon Web Services puede ser todo un reto cuando no se tienen las bases necesarias para comprender las diferentes herramientas que Amazon Web Services (AWS) ofrece. En este artículo te guiaré paso a paso para crear un servidor para PHP en AWS, sin que debas gastar para hacerlo. Al final de este tutorial sabrás lo siguiente:

  1. Crear y configurar una instancia de servidor para PHP y MySQL con Elastic Beanstalk
  2. Configurar correctamente la aplicación de Laravel
  3. Cargar una nueva versión de la aplicación Laravel a Elastic Beanstalk
  4. Conectarse a la instancia EC2 usando un túnel SSH para correr migraciones
IMPORTANTE: Este tutorial contempla una instancia única. Es decir, no contempla balanceado de carga.

Para este tutorial voy a asumir que tienes la experiencia suficiente para cumplir con los siguientes requisitos:

  • Tu aplicación de Laravel debe estar corriendo correctamente en tu servidor local.
  • Tu aplicación de Laravel debe ya consumir una base de datos MySql correctamente en tu servidor local.
  • Tienes una computadora que pueda utilizar el protocolo SSH.
  • Tienes una cuenta de Amazon Web Services creada y tu sesión iniciada.
  • Tu cuenta de AWS está en Español.

Paso #1: Crear y configurar una instancia de servidor para PHP y MySQL con Elastic Beanstalk

Elastic Beanstalk es un servicio de AWS que te permite implementar y escalar servicios web y aplicaciones web desarrollados en diversos lenguajes, para efectos de este tutorial estaremos utilizando PHP.

En la barra de navegación de la consola de AWS encontrarás el menú “Servicios”, aquí podrás acceder y/o buscar el servicio que desees usar.

Instancia de Servidor para PHP

  1. Da clic en el menú “Servicios” en la barra de navegación
  2. Busca “Elastic Beanstalk” y da clic en el para ingresar como se muestra en la siguiente imágen:
Puedes buscar el servicio deseado en el menú o escribiendo el nombre del servicio en el campo de búsqueda.
Una vez que des clic en “Elastic Beanstalk” llegarás a esta pantalla.

3. Da clic en “Create Application” para crear la aplicación de Elastic Beanstalk y llegar al formulario “Crear una aplicación web” que se ve así:

4. En “Información de la aplicación” deberás darle un nombre, en mi caso la nombrare “Laravel App”, de tal forma que se vea así:

Puedes nombrar la aplicación como tú quieras. Trata de poner un nombre que te ayude a identificar la aplicación de Laravel que deseas instalar aquí.

5. Por ahora, ignora el apartado de “Etiquetas de la aplicación”.
6. En “Plataforma” da clic en el campo “Elegir una plataforma” y selecciona PHP de la siguiente manera:

Puedes escoger el lenguaje que necesites que se pueda correr en esta instancia. Para efectos de este tutorial utilizaremos PHP, aún que si estuvieras usando JAVA, tendrías que seleccionar Tomcat, por ejemplo.

7. Notarás que los siguientes campos ya fueron llenados con la última versión de PHP así como el Sistema Operativo y tipo de arquitectura. Deja las opciones por defecto y continua al siguiente paso.

Puedes seleccionar diferentes versiones de PHP si lo necesitas, aun que te recomiendo que si debes seleccionar una versión diferente a la predefinida, consideres hacer un upgrade de tu aplicación Laravel. De esta forma, estarás al día con las actualizaciones del lenguaje.

8. En el apartado “Código de Aplicación” selecciona “Aplicación de muestra”.

Seleccionar “Aplicación de Muestra” nos servirá para verificar que hemos creado el ambiente correctamente, para posteriormente configurar y subir la aplicación de Laravel.

9. Posterior al apartado “Código de Aplicación” encontrarás 3 botones, da clic en el que dice “Configurar más opciones”. Esta acción nos permitirá configurar la Base de Datos, así como el acceso a la instancia por SSH.

Una vez que hayas dado clic en “Configurar más opciones” llegarás a esta pantalla, en la que encontrarás diversas opciones de configuración para tu instancia. También notarás que el nombre de tu instancia fue creada como “LaravelApp-env”.

10. En “Elementos preestablecidos” selecciona “Instancia única (compatible con la capa gratuita)” como se muestra en la imagen anterior. De esta forma el servidor no te generará costo.

11. En “Plataforma” encontrarás la versión de PHP a instalar en el servidor, así como el Sistema Operativo y la arquitectura que seleccionamos anteriormente.

12. Como mencionaba al inicio de este tutorial, cuando estas iniciando en AWS es sencillo que te pierdas en tantas configuraciones disponibles para la instancia. Estas configuraciones las iremos explicando más adelante, por ahora, no nos rompamos la cabeza y vayamos directo al apartado “Seguridad” y da click en “Editar”.

Es importante que no intentes hacer configuraciones sobre otros apartados mientras no conozcas perfectamente qué hacen y para qué sirven. Esta puede ser la diferencia entre lograr tener éxito o fallar de forma abismal.

Par de Claves EC2

13. Una vez que hayas dado clic en “Seguridad” podrás configurar un “Par de Claves EC2”. Este “Par de Claves EC2” se refiere a un certificado que te permitirá entrar vía SSH a la instancia de tu aplicación Laravel en el servidor. Te darás cuenta que, si tratas de seleccionar un “Par de Claves EC2” no tendrás opciones disponibles, esto es debido a que aún no las hemos creado.

Deja la selección del “Rol de Servicio” preestablecida, ya que es la correcta a utilizar.

Es de gran importancia que entiendas los siguientes puntos sobre el “Par de Claves EC2”

  • Debes tratar este Par de Claves con tanta confidencialidad como si fuera una contraseña de acceso a tu servidor.
  • El “Par de Claves EC2” darás servicio a la zona de disponibilidad que hayas elegido. En mi caso, escogí Londres, por lo que, si intento utilizar estas llaves para una instancia en otra zona de disponibilidad como “Irlanda”, no podré hacer uso de ellas.
En este punto NO CAMBIES la zona de disponibilidad, pues puedes perder las configuraciones que hemos realizado para la creación de esta instancia. Mas adelante hablare de las zonas de disponibilidad.

14. Para crear un “Par de Claves EC2”, es importante que abras la consola de AWS una nueva pestaña en tu explorador, y busques en “Servicios” la palabra “EC2+” y selecciona la primera opción

15. Al llegar al Panel de EC2, busca en el menú lateral (izquierda) el grupo de opciones “Red y seguridad” y da clic en la opción “Pares de claves”, como se muestra a continuación:

En esta opción podrás crear el Par de Claves EC2.

16. Una vez que se muestre el apartado “Pares de Claves” da clic en el botón naranja “Crear par de claves”, que se muestra en la siguiente imagen:

17. Bajo el apartado “Par de claves” encontrarás el campo “Nombre”, escribe el nombre que desees para identificar el archivo que se va a crear. Así mismo, deja seleccionado el “Formato de archivo .pem” y da clic en el botón naranja “Crear par de claves”.

Yo le di el nombre de LaravelAppLondresKey, que me permite saber en qué zona de disponibilidad y para que aplicación utilizaré esta clave.

Una vez realizado el paso anterior, se descargará la clave en un archivo .pem, guarda esta llave en lugar seguro para utilizarla mas tarde.

18. Vuelve a la pestaña anterior y da clic en el icono de actualizar que esta a un lado del campo “Par de claves EC2” que tiene como leyenda “– Elegir un par de claves –” para que aparezca la clave recién creada.

Todas las claves que crees van a aparecer en este listado, para que decidas con cual clave se puede acceder a que instancias.

Selecciona tu clave y da clic en el botón naranja “Guardar”. Notarás que al guardar la clave regresaremos a la pantalla en la cual seleccionamos “Seguridad” para poder crear y seleccionar nuestra clave.

Ahora, solo nos falta configurar la base de datos para poder seguir al siguiente paso.

Crea y configura la Base de Datos MySQL

19. Da clic en “Editar” bajo el apartado “Base de datos”, como se muestra a continuación:

Debes dar clic en el penultimo cuadro nombrado “Base de datos”, en el botón de “Editar”.

20. Una vez que realizamos el paso anterior llegaremos al apartador “Modificar la base de datos”. En este apartado podremos crear la instancia de RDS que es la que manejara nuestra base de datos. Bajo el apartado “Configuración de la base de datos”. Dale el “Nombre de usuario” y “Contraseña” que tu quieras, asegúrate de establecer la configuración restante como se muestra en la siguiente imagen. Posteriormente, da clic en el botón “Guardar” para continuar.

21. Ahora ya estamos listos para crear nuestra aplicación. Así que, da clic en el botón naranja “Crear una aplicación”.

Una vez hecho esto, AWS comenzará a crear tu instancia de EC2 y RDS. Este proceso dura varios minutos, espera a que el proceso termine para continuar.

Notarás que el proceso automatizado creó una instancia de base de datos llamada (en mi caso) “aa1gfantp2alxfw”. Esta es solo un identificador de la instancia de base de datos RDS, no es el nombre de la base de datos como tal.

Listo! Después de casi 10 minutos, podrás ver la pantalla de la instancia LaravelApp-env. Asegúrate de que encuentres bajo “Estado” un icono verde con una palomita. Si no lo encuentras así, es posible que hayas configurado algo erróneamente. Escríbeme si requieres ayuda.

Bajo el nombre de nuestra instancia LaravelApp-env encontrarás un link, da clic y deberá llevarte a una pantalla como esta:

Si has llegado a ver esta página quiere decir que lo has hecho bien! 😀

Paso #2: Configurar correctamente la aplicación de Laravel

Muy bien!!! Has logrado avanzar con la parte más complicada de este tutorial, que fue crear y configurar una instancia de servidor para PHP y MySQL con Elastic Beanstalk.

Algo que debes saber es que la configuración de Laravel cuándo se instala en una instancia de EC2 con Elastic Beanstalk es que funciona diferente que un VPS o un servidor local. Las diferencias te las explicare más adelante, por ahora, agregaremos algunas configuraciones a nuestra aplicación de Laravel para dejarla lista para cargarla a Elastic Beanstalk.

  1. Para configurar la base de datos creada para nuestra instancia en las variables de entorno de la aplicación Laravel en el archivo .env. Para hacerlo necesitamos 5 valores:
    1. El nombre del usuario de base de datos: elquetuquieras (en mi caso)
    2. El nombre de base de datos: ebdb (por defecto)
    3. La contraseña de la base de datos: 1234567890 (en mi caso)
    4. El Puerto: 3306 (por defecto)
    5. Y, el HOST de la base de datos… pero ese no lo tenemos aún. Así que vamos a buscarlo.
  2. Para encontrar el HOST de la base de datos, busca en “Servicios” la palabra “RDS” y selecciona la primera opción.
  3. Una vez en “Amazon RDS”, en el apartado de “Resources”, da clic en “DB Instantes” como se muestra en la siguiente imagen para que te lleve al listado de instancias de Bases de Datos disponibles:
Busca en la imagen “DB Instances” y dale clic.

4. Da clic en la base de datos que pertenece a tu instancia, en mi caso, tiene el “DB Identifier” como aa1gfantp2alxfw. Al hacerlo, podrás ver el detalle de esta base de datos, busca la palabra “Endpoint” y selecciona su valor, este será el “HOST” de tu instancia de base de datos.

Recuerda que este valor es único, por lo que el mío no será igual que el tuyo.

5. Ya que tenemos los 5 valores, los pondremos en las variables de entorno de nuestra aplicación Laravel de la siguiente forma:

DB_CONNECTION=mysql
DB_HOST=aa1gfantp2alxfw.crohqzqe0sqp.eu-west-2.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=ebdb
DB_USERNAME=elquetuquieras
DB_PASSWORD=1234567890

Paso #3: Cargar una nueva versión de la aplicación Laravel a Elastic Beanstalk

1. El servidor web que creamos, por defecto, es Nginx. De tal forma que debemos crear una estructura de carpetas en la raíz de nuestra aplicación Laravel, que es la siguiente: .platform/nginx/conf.d/elasticbeanstalk y dentro de esta estructura de carpetas debemos crear el archivo laravel.conf, con el siguiente contenido:

# .platform/nginx/conf.d/elasticbeanstalk/laravel.conf
location / {
  try_files $uri $uri/ /index.php?$query_string;
}
Así debería verse el nuevo directorio .platform

Lo anterior nos permitirá habilitar el modo “rewrite” para que las redirecciones a las diferentes páginas de nuestra aplicación Laravel. De no completar este paso, siempre que vayas a cualquier página encontrarás un error 404.

Comprimiendo la aplicación de Laravel

2. Ahora solo nos falta reemplazar la versión actual de nuestra instancia EC2 que muestra a la página por defecto de Amazon Web Services por nuestra aplicación de Laravel. Cuando se utiliza Elastic Beanstalk, la forma de cargar las nuevas versiones es a través de la compresión de todo la aplicación de Laravel en un archivo comprimido .zip.

Para ello, vamos a abrir una terminal y posicionarnos en la raíz de la aplicación Laravel y correr el siguiente comando:

zip ../"${PWD##*/}".zip -r * .[^.]*;

Al finalizar, podrás encontrar un nivel más arriba el archivo comprimido con el contenido de tu aplicación de Laravel.

El comando “pwd” retorna la posición del sistema de archivos desde el cual estas ejecutado el comando. Aquí puedes ver como voy a ejecutar el comando para comprimir el proyecto desde la raíz de mi aplicación Laravel “LaravelApp”.

Después de correr el comando para comprimir nuestra aplicación de Laravel, notarás que se creo el archivo comprimido al mismo nivel de la aplicación LaravelApp.

El comando “ls -l ..” retorna la lista de carpetas y archivos un nivel arriba desde donde estamos ejecutando el archivo. Que es igual al comando “cd ..; ls -l“.

Cargando el archivo comprimido recién creado

3. Ya tenemos nuestra aplicación Laravel en un archivo comprimido, que en mi caso se llama LaravelApp.zip, es hora de subirla a Elastic Beanstalk para sustituir la página por defecto que se muestra ahora.

Esta es la página por defecto que nos creo Elastic Beanstalk en nuestra instancia de EC2, misma que sustituiremos con nuestra aplicación LaravelApp.

Para subir nuestra aplicación LaravelApp da clic en el botón “Cargar e implementar”, al hacer esto se abrirá un modal también llamado “Cargar e implementar”.

Esta pantalla nos permite cargar nuestra aplicación comprimida en el archivo .zip creado anteriormente.

Dá clic en “Elegir archivo” y selecciona tu aplicación Laravel comprimida en el archivo .zip. Posteriormente, puedes definir un nombre para la “Etiqueta de versión”, este nombre puede ser lo que tu quieras.

Un dato de interés es que siempre que cargues una nueva versión de tu aplicación Laravel, Elastic Beanstalk por defecto irá incrementando el número de versión, ahora es la primera que cargaremos, por lo tanto, verás el número 1 al final de la “Etiqueta de versión”.

Una vez que elijas el archivo de tu aplicación Laravel y definas el nombre de la “Etiqueta de versión” da clic en “Implementar”. Al hacerlo te mostrará en la parte inferior izquierda el mensaje ” como se muestra en la siguiente imagen:

Nota como en la imagen se muestra que ya he seleccionado mi aplicación Laravel comprimida “LaravelApp.zip” y he definido una Etiqueta de versión.

Posterior a que se cargue completamente nuestra aplicación Laravel, notarás que Elastic Beanstalk esta preparando la sustitución de la nueva versión.

Espera que “Estado” cambie a verde.
Nota como la “Versión en ejecución” ya cambió a LaravelApp-1.

Al entrar a la instancia podrás notar que nos desplegará el siguiente mensaje:

El error 403 Forbidden al subir una nueva versión de Laravel a Elastic Beanstalk se refiere a que esta intentando ejecutar la aplicación desde la raíz en vez de ejecutar desde la carpeta “public“, por lo tanto debemos decirle a Elastic Beanstalk que ejecute desde “public” de la siguiente manera.

4. En el menu lateral, encontrarás bajo el nombre de tu ambiente, que en mi caso es “LaravelApp-env”, el menú configuración:

Recuerda que el título de este menú contendrá el nombre del ambiente creado por Elastic Beanstalk.

5. Una vez en “Información general de la configuración” da clic en “Editar” en la fila de la Categoría “Software”:

Notarás que “Raíz del documento” está vacío. Este es el que debemos de cambiar.

6. Cambia el valor de “Raíz del documento” a “/public” como se muestra en la siguiente imagen. Es importante que pongas exactamente “/public”. Posteriormente da clic en el botón “Aplicar” que se encuentra hasta abajo de esa página.

Esta configuración solo la deberemos hacer una vez.

Al dar clic en aplicar, Elastic Beanstalk reconstruirá la versión de tu aplicación Laravel con la nueva configuración. Espera a que “Estado” cambié a verde e ingresa a tu aplicación nuevamente… y listo!! Ya tenemos corriendo nuestra aplicación Laravel.

Listo! Tienes disponible tu aplicación Laravel.

Ahora lo último que nos falta hacer es configurar nuestra base de datos.

Paso #4: Conectarse a la instancia EC2 usando un túnel SSH para correr migraciones

Para este último paso, necesitaremos la llave que creamos en el Paso #1 en los incisos 13 al 18. Recordemos que esta llave es nuestro acceso a la instancia EC2 creada con Elastic Beanstalk. Debido a que esta llave es muy importante, debemos darle permisos especiales para poder usarla.

  1. Deste tu computadora, posiciónate en el directorio donde guardaste la llave creada. En mi caso, la deje en la carpeta de Downloads (para fines prácticos, aun que te recomiendo enérgicamente, la guardes en un lugar menos predecible).
  2. Ejecuta el siguiente comando, que hará que la llave solo pueda ser utilizada por nosotros y no pueda ser modificada de forma externa.
sudo chmod 400 LaravelAppLondresKey.pem
Ahora ya esta lista para ser utilizada.

3. Es hora de conectarnos por SSH a nuestra instancia EC2 creada por Elastic Beanstalk debemos obtener el “endpoint” de nuestra instancia EC2. Para obtenerlo, dirígete al Panel de EC2 buscando “EC2” en el menú de “Servicios”.

Para llegar a este apartado, da clic en el menú “Servicios” en la esquina superior izquierda y busca “EC2” y clic en la primera opción que te aparezca.

4. Ingresa a “Instancias en ejecución” en el apartado de “Recursos”, una vez ahí, encontrarás las instancias disponibles bajo la zona de disponibilidad, que en mi caso es Londres. Da clic en el checkbox de tu instancia, que en mi caso se llama LaravelApp-env. Ahí encontramos el endpoint, el cual esta seleccionado en la siguiente imagen:

En este apartado puedes hacer diversas configuraciones de la instancia en especifico. Por ahora, solo nos enfocaremos en el endpoint que necesitamos para el comando de SSH.

5. Copia el valor bajo “DNS de IPV4 pública”, regresa a la terminal (o abre una), y ejecuta el siguiente comando para ingresar a la instancia de SSH:

ssh -i LaravelAppLondresKey.pem [email protected] -o "ServerAliveInterval 60"

Recuerda reemplazar “LaravelAppLondresKey.pem” por tu propia llave. Así como debes reemplazar “ec2-3-9-222-131.eu-west-2.compute.amazonaws.com” con tu propio endpoint. El usuario para ingresar a tu instancia será por defecto “ec2-user“.

6. Te preguntara si deseas continuar, escribe “yes” y da “enter”. Una vez hecho esto, habrás entrado a la instancia EC2 por SSH como se muestra en la siguiente imagen:

Si no has podido acceder, regresa a inciso 2 de este paso.

7. Elastic Beanstalk pone el código de nuestra aplicación dentro de la ruta “/var/www/html“, para ir a esta ruta escribe en la terminal lo siguiente:

cd /var/www/html

8. Antes de ejecutar el comando de artisan para correr migraciones, debemos darle permisos a la carpeta de “storage” y “boostrap/cache” para poder ser utilizados por nuestro usuario “ec2-user”. Ejecuta el siguiente comando dentro de /var/www/html:

sudo chmod -R g+w storage bootstrap/cache
sudo chown -R ec2-user storage bootstrap/cache

9. Ahora ya podemos correr nuestro comando de artisan para correr las migraciones. Ejecuta el siguiente comando para hacerlo dentro de /var/www/html:

php artisan migrate
Listo! Has terminado de configurar la instancia de EC2 junto con la migración de la base de datos.

Felicidades! Ahora ya tienes tu instancia de EC2 creada con Elastic Beanstalk funcionando con una instancia de RDS. Verifica que este funcionando correctamente. En mi caso, me registré para comprobarlo.

Ingrese mis datos para el registro y di clic “Register”.
Pude comprobar que mi instancia está funcionando correctamente

Te agradezco por seguir este tutorial “Aprende a Instalar Laravel + Base de datos con Amazon Web Services paso a paso” para comenzar a utilizar Amazon Web Services. Ahora ya sabes crear servidores con Amazon Web Services utilizando Elastic Beanstalk y tienes conocimientos básicos de lo que son las instancias EC2 y RDS.

Subscríbete para seguir aprendiendo sobre tecnología. No dudes en dejar tus comentarios, recomendaciones y/o dudas en este artículo.

Protegido: Instalar ModSecurity en ELB con NGINX con este script Forzar HTTPS en Elastic Beanstalk con Nginx Habilitar SSL en un Single Instance de Elastic Beanstalk con NGINX
View Comments
There are currently no comments.