Ayuda con AWS EC2 [Básicos]

eXtreM3

Buenos días,
tengo desarrollado un proyecto en laravel que me gustaría subir a AWS. Ayer di de alta la cuenta para utilizar el free tier, también registré el dominio (el cual tiene extensión .com, dicho sea de paso por si fuese importante)

El caso es que no tengo ni idea de sistemas. He seguido tutoriales de esta página https://awswithatiq.com/ pero no consigo hacerlo funcionar. Pasos que he hecho hasta ahora:

  • Crear la instancia EC2 con la AMI Amazon Linux 2023, t2.micro
  • Creada un key pair para conectarme a la instancia.
  • He podido conectarme a ella con PuTTY generando una key para tal fin.
  • Registré el dominio dominioejemplo.com en Route 53
  • Le he creado un registro DNS de tipo A al dominio para que apunte a la IP pública v4 de EC2.
  • En la instancia, he seguido este video al pie de la letra

no me ha dado ningún error en el proceso y se ha hecho paso a paso lo que se dice, espero no saltarme nada para que no tengáis que ver el vídeo, que básicamente es seguir este post https://awswithatiq.com/how-to-install-apache-php-on-amazon-linux-2023/

Aquí ya me parece que está el primer error porque si entro en http://ip-publica/info.php no carga nada

Después de eso he seguido este otro post https://awswithatiq.com/create-a-virtual-host-in-apache-2-4/ para crear un Virtual Host, pero claro, entiendo que si el punto anterior no me funciona, ya nada de aquí en adelante me va a funcionar.

Alguna idea de por qué? Puedo ejecutar el comando que me digáis para mostrar status de la instancia.
por ejemplo sudo service httpd status :

 httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/httpd.service.d
             └─php-fpm.conf
     Active: active (running) since Sat 2023-08-26 07:57:10 UTC; 1h 23min ago
       Docs: man:httpd.service(8)
   Main PID: 71436 (httpd)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 177 (limit: 1114)
     Memory: 13.8M
        CPU: 3.273s
     CGroup: /system.slice/httpd.service
             ├─71436 /usr/sbin/httpd -DFOREGROUND
             ├─73618 /usr/sbin/httpd -DFOREGROUND
             ├─73619 /usr/sbin/httpd -DFOREGROUND
             ├─73620 /usr/sbin/httpd -DFOREGROUND
             └─73621 /usr/sbin/httpd -DFOREGROUND

Gracias!

pd: es posible que la instancia no tenga permitida la entrada desde internet? En ese caso, cómo se hace?

iKarbOne

has abierto los puertos en la regla de red de la instancia?

1 1 respuesta
eXtreM3

#2 no he hecho nada con la red. Qué debo hacer?

2 respuestas
iKarbOne

#3 puedes intentar tirar algun comando como test-netconnection hacia la ip publica para ver si los puertos estan abiertos.

1
PiPePiTo

#3 tienes que abrir los puertos de entrada y de salida que vayas a usar como si de un firewall se tratase.

80 para http 443 para https.

Si te fijas tiene que haber una regla ya para el ssh

Lo que yo hago por ejemplo es servir en un puerto random (pero siempre el mismo) y con el loas balancer redirijo del puerto 443 al que esté hosteando la app.

Por cierto, la ip publica de la instancia te puede variar cuando la reinicies, estate atento a eso xD

1 respuesta
iKarbOne

#5 no recuerdo en aws, pero en azure los de salida están abiertos por defecto.

1 3 respuestas
PiPePiTo

#6 es que justo eso es lo que no estoy seguro ahora mismo

hda

#6 en aws está aislado de inet, tienes que crear las reglas.

3
eXtreM3

En qué apartado se crean las reglas para abrir los puertos?

1 respuesta
PiPePiTo

#6 Justo lo acabo de mirar, los de salida están abiertos a full, pero los de entrada (para recibir las peticiones) chapadísimos, los tuve que abrir yo a mano.

#9 Redes y Seguridad -> Grupos de seguridad.

En la propia instancia de EC2, te vas a la pestaña de security y te salen ahí los puertos que tienes abiertos y a qué IPs permites.

En mi caso el 22 (ssh) sólo es accesible vía la ip de mi casa
80 y 443 son accesibles desde todas las redes.

1 1 respuesta
S

AWS ya tiene herramientas para desplegar apps. Además de poder escalar y lanzar nuevas versiones, por ejemplo elasticbeanstalk o fargate.

https://aws.amazon.com/elasticbeanstalk/

eXtreM3

#10 vale, estoy aquí


https://i.imgur.com/NhDjZny.png

eXtreM3

Oleeee! He creado la regla para acceder al 80 y 443 desde todas las IPs y listo, ya me aparece el archivo info.php en la raíz de mi sitio!! Muchas gracias, os quiero :heart_eyes:

De PM, además tenía ya la parte de configuración del SSL prácticamente lista a falta del último comando. Lo he ejecutado y perfecto, ya veo de paso https://midominioinventado.com funcionando :)

5 1 respuesta
PiPePiTo

#13 Niquelao!

Recuerda lo de la ip publica, si reinicias la máquina puede cambiar.

1 respuesta
eXtreM3

#14 perfect :)

Aún me queda pegarme bastante con esto jajaja. Mi proyecto tiene base de datos y me gustaría montar un sistema de auto despliegues. Tengo el repositorio ahora mismo en gitlab pero no sé si por comodidad sería bueno llevarlo a Code Commit y que quede todo bien integradito en AWS.

Necesito:

  • Migrar el repo a CC
  • Mirar tutoriales de cómo hacer un auto-deploy cada vez que se pushee a la rama master (he visto por encimilla que debo tener un bucket de S3 para tal fin)
  • Configurar la pipeline (esto directamente no sé ni lo que es, me suena de oidas, pero sin más xd)
  • Instalar la base de datos
  • Instalar un visor, rollo https://www.phpmyadmin.net/
  • Que funcione x'D

GL! A ver si a lo largo del finde lo saco.

1 respuesta
PiPePiTo

#15 yo lo hago todo con github actions por comodidad (tengo un runner en el ec2)

Code Pipeline es lo que buscas, aunque creo que se puede conectar a cualquier repo. No hace falta que te salgas de gitlab si no quieres (de hecho para mi la interfaz de las pr en codecommit es un dolor)
Para la db, si estás tirando de free tier, puedes montarte un rds de mysql (mariadb o el nombre de aws que no recuerdo ahora ¿Aurora?) o postgresql que tienes la misma capacidad que ec2 en horas y tal.

Y para la db lo que tengo es en mi servidor un docker del pgadmin (postgre) y las reglas de entrada de rds configuradas como el ssh, sólo desde mi casa (y desde la red de aws, claro)

Mushuu

Echale un ojo al servicio AWS Beanstalk, es un servicio gestionado totalmente por AWS para hacer deploy de aplicaciones.

1
JuAn4k4

Mejor tirar de beanstalk como te dicen si no quieres liarte con otras historias. Con EC2 a pelo lo normal es poner un ALB delante y apuntar a target groups donde se meten tus EC2, todo eso lo hace Beanstalk solo creo recordar

1
eXtreM3

Bueno, estoy el finde en la playa y lo que he podido avanzar en los ratillos libres es:

✅ Migrar el repo a CC (me ha costado lo mío hacer que me funcionase git por ssh teniendo ya otros usuarios configurados xd)
✅ Instalar la base de datos (mariadb)
✅ Instalar un visor, rollo https://www.phpmyadmin.net/ (5.2.1 es la última)

  • Mirar tutoriales de cómo hacer un auto-deploy cada vez que se pushee a la rama master (he visto por encimilla que debo tener un bucket de S3 para tal fin)
  • Configurar la pipeline (esto directamente no sé ni lo que es, me suena de oidas, pero sin más xd)
  • Que funcione x'D

Pensaba que me haría falta una instancia de RDS para la BD pero de momento como el proyecto va a ser algo pequeño (es personal) en principio con tener la BD dentro de la propia instancia EC2 no es ningún problema.

Vale, he llegado al punto donde he hecho "lo conocido". Ahora toca remangarse y hacer lo difícil, pero ya será a partir de mañana :)

aren-pulid0

Esta guay lo de que uses CC, pero yo personalmente hubiese utilizado Github Actions, es un conocimiento que se va a transferir mejor a otros ámbitos fuera de AWS.

Te recomiendo que hagas usos de las IP estáticas que ofrece AWS o que directamente uses Elastic Beanstalk como te han comentado por arriba

JuAn4k4

Si usas EBS la BD tiene que ir separada creo recordar

1 respuesta
wdaoajw

#21 si has puesto el ebs a la EC2 puedes meterle lo que quieras, siempre que te quepa por tamaño claro

eXtreM3

Actualización de estado:

✅ Migrar el repo a CC (me ha costado lo mío hacer que me funcionase git por ssh teniendo ya otros usuarios configurados xd)
✅ Instalar la base de datos (mariadb)
✅ Instalar un visor, rollo https://www.phpmyadmin.net/ (5.2.1 es la última)
✅ Mirar tutoriales de cómo hacer un auto-deploy cada vez que se pushee a la rama master (he visto por encimilla que debo tener un bucket de S3 para tal fin)
✅ Configurar la pipeline (esto directamente no sé ni lo que es, me suena de oidas, pero sin más xd)
❌ Que funcione x'D

He creado todo lo necesario para poder montar la pipeline (rol, grupo, aplicación), configurándola para que despliegue a la EC2 desde el repo que tengo en CC y la rama master. El caso es que cada vez que hay un cambio en master se empieza a ejecutar la pipeline, pero me da un error al cabo de unos minutos:

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

Según esto, la ejecución ha fallado por lo siguiente:

Sigo investigando a ver.

Otra duda que tengo es: en el caso de que no hubiera petado y sí hubiera desplegado, en qué directorio de la instancia haría el despliegue? xD

eXtreM3

Lo conseguí

Pues nada todo listo y funcionando. Me falta hacer algún ajuste con los scripts de deploy para que se ejecute lo que quiero en el AfterInstall (composer install, correr las migraciones, reiniciar cachés, esas cosillas)

Me estaba fallando la pipeline porque no tenía el rol IAM que había creado de CodeDeploy asociado correctamente a la instancia EC2 y me estaba volviendo loco.

✅ Migrar el repo a CC (me ha costado lo mío hacer que me funcionase git por ssh teniendo ya otros usuarios configurados xd)
✅ Instalar la base de datos (mariadb)
✅ Instalar un visor, rollo https://www.phpmyadmin.net/ (5.2.1 es la última)
✅ Mirar tutoriales de cómo hacer un auto-deploy cada vez que se pushee a la rama master (he visto por encimilla que debo tener un bucket de S3 para tal fin)
✅ Configurar la pipeline (esto directamente no sé ni lo que es, me suena de oidas, pero sin más xd)
✅ Que funcione x'D

Muchas gracias a todos los que habéis ayudado :)

pd: con esto he aprendido un montón de cosas que no tenía ni idea jajaja, estoy contento porque pensaba que no me iba a salir ni a tiros.

4
1 mes después
bLaKnI

Yo sigo pensando que no hay nada como un ctrl+c y ctrl+v para minidevelopments como el que comentas.

Los pipelines hay que mantenerlos porque con el tiempo las imagenes pueden caer en deprecated si no son LTS y es un dolor, que los scripts de deploy se jodan... Ayer iba, hoy no... Frito me ha tenido esto en el curro...
Además, development va p'arriba solo. Pero para prod, hay que hacer el pull request create, luego el merge, luego etc... Y finalmente darle al run en el ultimo paso para asegurar el push a prod...
Todo esta guay para jugar con el mundo DevOps... pero...
(por supuesto para cadenas productivas, nada que objetar).

Pensaba: ¿Lightsail vs Benstalk?

Usuarios habituales

  • bLaKnI
  • eXtreM3
  • JuAn4k4
  • aren-pulid0
  • Mushuu
  • PiPePiTo
  • iKarbOne