Una arquitectura de tres niveles es un patrón de arquitectura de software en el que la aplicación se divide 3 capas lógicas: La capa de presentación, la capa de lógica empresarial y la capa de almacenamiento de datos. Cada una de estas capas o niveles realiza una tarea específica y se pueden administrar de forma independiente. Esta arquitectura es muy usada en aplicaciones cliente-servidor, como por ejemplo aplicaciones web que tienen el frontend, el backend y la base de datos.

Aclaración importante

Existen muchas maneras de realizar esta implementación, para facilitar la interpretación el ejemplo aquí planteado simplifica muchos aspectos (que deberían considerarse en un entorno real) en pro del aprendizaje.

Uso de la capa gratuita

Es importante destacar que haremos uso de los recursos de la capa gratuita de AWS para no generar gastos o reducirlos al máximo mientras aprendemos. Cuando termines de practicar debes detener, des-asociar o eliminar todos los recursos que configuramos, como las instancias EC2, NAT Gateways, ELBs, etc. de lo contrario AWS dadas ciertas condiciones podría cobrarle por el uso de los mismos.

Para que nuestra infraestructura de 3 capas sea de alta disponibilidad y tolerante a fallas utilizaremos los siguientes servicios de AWS: Elastic Compute Cloud (EC2), Auto Scaling Group, Virtual Private Cloud (VPC), Elastic Load Balancer (ELB), Security groups y Internet Gateways.

10 pasos para crear una arquitectura de 3 capas en AWS

  1. Crear la VPC: Accedemos a la consola y en la sección VPC de los servicios de AWS y haga clic en el botón Crear VPC y asigne un nombre a su VPC y un bloque CIDR de 10.0.0.0/16

2. Configurar el Internet Gateway (puerta de enlace de Internet): Permite la comunicación entre las instancias EC2 en la VPC e Internet. Para crear la puerta de enlace de Internet, vaya a la página de puertas de enlace de Internet y luego haga clic en el botón Crear puerta de enlace de Internet.

Asociamos el Gateway con la VPC

3. Crear las sub-redes: Dado que una subred puede ser pública o privada las instancias EC2 dentro de una subred pública tienen IP públicas y accederán directamente a Internet, mientras que las de la subred privada no tienen IP públicas y solo pueden acceder a Internet a través de un NAT Gateway. Para nuestra configuración, crearemos las siguientes subredes con los rangos de IP correspondientes.

public-subnet-1 | CIDR (10.0.1.0/24) | Availability Zone (us-east-1a)

public-subnet-2 | CIDR (10.0.2.0/24) | Availability Zone (us-east-1b)

private-subnet-3 | CIDR (10.0.3.0/24) | Availability Zone (us-east-1a)

private-subnet-4 | CIDR(10.0.4.0/24) | Availability Zone (us-east-1b)

4. Crear tabla de ruteo. Las tablas de enrutamiento son un conjunto de reglas que determinan cómo se mueven los datos dentro de nuestra red. Para este escenario necesitamos 2 tablas de enrutamiento (pública y privada). La tabla de rutas públicas definirá qué subredes tendrán acceso directo a Internet (es decir, subredes públicas), mientras que la tabla de rutas privadas definirá qué subred pasa por la puerta de enlace NAT (es decir, subred privada). Para crear las tablas de enrutamiento, vaya a la página Tablas de rutas y haga clic en el botón Crear tabla de ruteo.

Las subredes pública y privada deben estar asociadas con la tabla de rutas pública y privada respectivamente. Para hacerlo, seleccionamos la tabla de rutas y luego elegimos la pestaña Asociación de subred.

También necesitamos enrutar el tráfico a Internet a través de la puerta de enlace de Internet para nuestra tabla de rutas pública. Para ello seleccionamos la tabla de rutas públicas y luego elegimos la pestaña Rutas.

La regla debe ser similar a la que se muestra a continuación:

5. Crear la puerta de enlace NAT: La puerta de enlace NAT permite que las instancias EC2 en la subred privada accedan a Internet. Para crear la puerta de enlace NAT, vaya a la página Puertas de enlace NAT y luego haga clic en Crear puerta de enlace NAT.

Asegúrese de conocer el ID de subred para demo-public-subnet-2. Esto será necesario al crear la puerta de enlace NAT.

Ahora que tenemos la puerta de enlace NAT, vamos a editar la tabla de rutas privadas para utilizar la puerta de enlace NAT para acceder a Internet.

6. Crear el balanceador de carga (ELB): De acuerdo a la arquitectura definida previamente, el tráfico entre capas se ruteara como se establece a continuación:

  • Front-end solo puede aceptar tráfico del balanceador de carga elástico que se conecta directamente con la puerta de enlace de Internet
  • Back-end recibirá tráfico a través del balanceador de carga interno.

Seleccionaremos orientación a Internet para el balanceador de carga que usaremos para comunicarnos con el frontend e interno para el balanceador de carga el que usaremos para nuestro el trafico del backend.

Para crear los 2 balanceadores de carga necesarios en nuestra arquitectura, navegamos a la página Load Balancer y hacemos clic en Create Load Balancer.

En la zona de disponibilidad, para el Load Balancer de Internet, seleccionaremos las dos subredes públicas, mientras que para nuestro Load Balancer interno, seleccionaremos las dos subredes privadas.

7. Configuramos los Grupos de seguridad, solo necesitamos permitir los puertos que necesita la aplicación, en este caso debemos permitir el puerto HTTP 80 y/o el puerto HTTPS 443 en nuestro balanceador de carga orientado a Internet. Para el balanceador de carga interno, solo abrimos el puerto en el que se ejecuta el backend (por ejemplo, el puerto 3000) y hacemos que dicho puerto solo se abra al grupo de seguridad del frontend. Esto permitirá que solo la interfaz tenga acceso a ese puerto dentro de nuestra arquitectura.

En Configurar enrutamiento, necesitamos configurar nuestro Target group para definir el tipo de instancia de destino. Para facilitar la gestión le daremos al Target group un nombre que nos permitirá identificarlo y vincularlo al Auto Scaling Group. De momento omitiremos Registrar objetivos revisamos la configuración y luego hacemos clic en el botón Crear.

8. Creamos el Auto Scaling Group: Tenga en cuenta que cuando se crea un grupo de Auto Scaling, se debe especificar previamente un Launch Configuration, una plantilla de lanzamiento o una instancia EC2.

Para ajustar automáticamente el número de las instancias EC2 que sirven a la aplicación en función de las necesidades. En la sección correspondiente hacemos clic en el botón Crear Auto Scaling Group.

Si necesitaríamos configuración adicional en el menú desplegable Detalles avanzados, se puede proporcionar los datos del usuario o comandos necesarios para instalar las dependencias e iniciar la aplicación. Nuevamente, bajo el grupo de seguridad, queremos permitir solo los puertos que son necesarios para nuestra aplicación.

Revise la configuración y haga clic en el botón Crear configuración de lanzamiento.

Para gestionar los accesos debemos crear el par de claves que debemos descargarlas antes de continuar.

Ahora que tenemos nuestra Configuración de lanzamiento, podemos terminar con la creación de nuestro Grupo de Auto Scaling.

En Configurar políticas de escalado, queremos agregar una instancia cuando la CPU sea mayor o igual al 80 % y reducir la escala cuando la CPU sea menor o igual al 50.

Este proceso debe realizarse tanto para el nivel de front-end como para el nivel de back-end, pero no para el nivel de almacenamiento de datos.

9. Creamos la base de datos: En este ejemplo usaremos MySQL y deberá estar ubicada en la zona de disponibilidad us-east-1a en la subred private-subnet-3

Con el criterio de privilegios minimos usaremos los grupos de seguridad para permitir el acceso solo a los recursos que corresponda.

10. Creamos un Bastion host: Para acceder mediante SSH en las instancias EC2 en la subred privada. En la sección de EC2 cree una instancia en la subred public-subnet-1 dentro de nuestra VPC y verifique la asignación de la IP pública.

Es necesario mapear el acceso al Bastión host desde las instancias en las subredes privadas.

Comentarios finales

Como mencionamos previamente para facilitar la interpretación, el ejemplo aquí planteado simplifica muchos aspectos que deberían considerarse en un entorno real.

Comentarios? Dudas? Ajustes necesarios? Todos son bienvenidos

Gracias por leer y contribuir 🙂