DEV Community

Francisco Escobar
Francisco Escobar

Posted on

🚀 Construyendo tu Primera Aplicación Web Multi-Tier en AWS

📋 Tabla de Contenidos

  1. Introducción
  2. Arquitectura del Proyecto
  3. Requisitos Previos
  4. Etapa 1: Configuración de la Base de Datos (RDS)
  5. Etapa 2: Configuración del Backend (EC2 + Auto Scaling + ALB)
  6. Etapa 3: Configuración del Frontend (S3 + CloudFront)
  7. Etapa 4: Pruebas y Optimización
  8. Costos Estimados
  9. Buenas Prácticas
  10. Conclusión

🎯 Introducción

Una aplicación web multi-tier (multi-capa) es una arquitectura que separa la aplicación en diferentes capas independientes. En este proyecto aprenderás a construir una aplicación completa usando los servicios principales de AWS.

¿Por qué Multi-Tier?

  • Escalabilidad: Cada capa puede escalar independientemente
  • Mantenibilidad: Fácil de actualizar y mantener
  • Seguridad: Mejor aislamiento entre capas
  • Disponibilidad: Mayor resistencia a fallos

🏗️ Arquitectura del Proyecto

Internet → CloudFront → S3 (Frontend)
                ↓
         Application Load Balancer
                ↓
    Auto Scaling Group (EC2 instances)
                ↓
           RDS Database
Enter fullscreen mode Exit fullscreen mode

Componentes Principales:

  • Frontend: S3 + CloudFront para contenido estático
  • Backend: EC2 con Auto Scaling y Load Balancer
  • Base de Datos: RDS con réplicas de lectura
  • Balanceador: Application Load Balancer (ALB)

📋 Requisitos Previos

1. Cuenta AWS

  • Crear cuenta gratuita en aws.amazon.com
  • Activar AWS Free Tier (12 meses gratuitos)

2. Herramientas Necesarias

  • AWS CLI: Para comandos desde terminal
  • Editor de código: VS Code, Sublime, etc.
  • Navegador web: Para acceder a AWS Console

3. Conocimientos Básicos

  • HTML/CSS/JavaScript básico
  • Conceptos de redes (IP, DNS, HTTP)
  • Línea de comandos básica

🗄️ Etapa 1: Configuración de la Base de Datos (RDS)

Paso 1.1: Crear VPC y Subnets

# 1. Acceder a AWS Console
# 2. Ir a VPC Service
# 3. Crear nueva VPC
Enter fullscreen mode Exit fullscreen mode

Configuración VPC:

  • Nombre: multi-tier-vpc
  • CIDR: 10.0.0.0/16
  • Subnets:
    • Subnet Pública 1: 10.0.1.0/24 (us-east-1a)
    • Subnet Pública 2: 10.0.2.0/24 (us-east-1b)
    • Subnet Privada 1: 10.0.3.0/24 (us-east-1a)
    • Subnet Privada 2: 10.0.4.0/24 (us-east-1b)

Paso 1.2: Crear Security Groups

Security Group para RDS:

Nombre: rds-security-group
Reglas de entrada:
- Tipo: MySQL/Aurora
- Puerto: 3306
- Origen: Security Group del EC2
Enter fullscreen mode Exit fullscreen mode

Paso 1.3: Crear RDS Database

  1. Ir a RDS en AWS Console
  2. Click en "Create Database"
  3. Configuración:

    • Engine: MySQL 8.0
    • Template: Free tier
    • DB Instance: db.t3.micro
    • Storage: 20 GB SSD
    • DB Name: multitierdb
    • Username: admin
    • Password: TuPasswordSegura123!
  4. Configuración de Red:

    • VPC: multi-tier-vpc
    • Subnet Group: Crear nuevo con subnets privadas
    • Security Group: rds-security-group
    • Public Access: No

Paso 1.4: Crear Read Replica

# Después de crear la DB principal
1. Seleccionar la database
2. Actions → Create read replica
3. Configuración:
   - Instance: db.t3.micro
   - Region: Same region
   - AZ: Diferente a la principal
Enter fullscreen mode Exit fullscreen mode

🖥️ Etapa 2: Configuración del Backend (EC2 + Auto Scaling + ALB)

Paso 2.1: Crear Security Groups para EC2

Security Group para EC2:

Nombre: ec2-security-group
Reglas de entrada:
- HTTP (80) desde ALB Security Group
- HTTPS (443) desde ALB Security Group
- SSH (22) desde tu IP
Enter fullscreen mode Exit fullscreen mode

Security Group para ALB:

Nombre: alb-security-group
Reglas de entrada:
- HTTP (80) desde 0.0.0.0/0
- HTTPS (443) desde 0.0.0.0/0
Enter fullscreen mode Exit fullscreen mode

Paso 2.2: Crear Launch Template

  1. Ir a EC2 → Launch Templates
  2. Click "Create Launch Template"
  3. Configuración:
    • Name: multi-tier-template
    • AMI: Amazon Linux 2
    • Instance Type: t2.micro
    • Security Group: ec2-security-group
    • User Data:
#!/bin/bash
yum update -y
yum install -y httpd php php-mysql
systemctl start httpd
systemctl enable httpd

# Crear aplicación PHP simple
cat > /var/www/html/index.php << 'EOF'
<?php
$servername = "TU_RDS_ENDPOINT";
$username = "admin";
$password = "TuPasswordSegura123!";
$dbname = "multitierdb";

try {
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "<h1>¡Aplicación Multi-Tier Funcionando!</h1>";
    echo "<p>Conexión a base de datos: ✅ Exitosa</p>";
    echo "<p>Servidor: " . gethostname() . "</p>";
    echo "<p>Timestamp: " . date('Y-m-d H:i:s') . "</p>";

} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>
EOF

systemctl restart httpd
Enter fullscreen mode Exit fullscreen mode

Paso 2.3: Crear Application Load Balancer

  1. Ir a EC2 → Load Balancers
  2. Create Load Balancer → Application Load Balancer
  3. Configuración:

    • Name: multi-tier-alb
    • Scheme: Internet-facing
    • IP Address: IPv4
    • VPC: multi-tier-vpc
    • Subnets: Seleccionar subnets públicas
    • Security Group: alb-security-group
  4. Target Group:

    • Name: multi-tier-targets
    • Protocol: HTTP
    • Port: 80
    • Health Check: /index.php

Paso 2.4: Crear Auto Scaling Group

  1. Ir a EC2 → Auto Scaling Groups
  2. Create Auto Scaling Group
  3. Configuración:

    • Name: multi-tier-asg
    • Launch Template: multi-tier-template
    • VPC: multi-tier-vpc
    • Subnets: Subnets privadas
    • Load Balancer: Attach to existing → multi-tier-alb
    • Target Group: multi-tier-targets
  4. Scaling Policies:

    • Desired: 2
    • Minimum: 1
    • Maximum: 4
    • Scaling Policy: Target tracking → CPU 70%

🎨 Etapa 3: Configuración del Frontend (S3 + CloudFront)

Paso 3.1: Crear S3 Bucket

  1. Ir a S3 en AWS Console
  2. Create Bucket
  3. Configuración:
    • Name: multi-tier-frontend-[random-numbers]
    • Region: us-east-1
    • Block Public Access: Desactivar
    • Static Website Hosting: Activar

Paso 3.2: Crear Contenido Frontend

index.html:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Multi-Tier App</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
        }
        .container {
            background: rgba(255,255,255,0.1);
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 8px 32px rgba(0,0,0,0.1);
        }
        button {
            background: #4CAF50;
            color: white;
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }
        button:hover {
            background: #45a049;
        }
        #result {
            margin-top: 20px;
            padding: 15px;
            background: rgba(255,255,255,0.1);
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🚀 Aplicación Multi-Tier en AWS</h1>
        <p>Esta aplicación demuestra una arquitectura de 3 capas:</p>
        <ul>
            <li>Frontend: S3 + CloudFront (estás aquí)</li>
            <li>Backend: EC2 + Auto Scaling + ALB</li>
            <li>Database: RDS MySQL con Read Replicas</li>
        </ul>

        <button onclick="testBackend()">Probar Conexión Backend</button>
        <div id="result"></div>
    </div>

    <script>
        async function testBackend() {
            const resultDiv = document.getElementById('result');
            resultDiv.innerHTML = 'Conectando...';

            try {
                const response = await fetch('http://TU_ALB_DNS_NAME/index.php');
                const data = await response.text();
                resultDiv.innerHTML = `<h3>Respuesta del Backend:</h3>${data}`;
            } catch (error) {
                resultDiv.innerHTML = `<h3>Error:</h3><p style="color: #ff6b6b;">${error.message}</p>`;
            }
        }
    </script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Paso 3.3: Configurar CloudFront

  1. Ir a CloudFront
  2. Create Distribution
  3. Configuración:
    • Origin Domain: Tu S3 bucket endpoint
    • Origin Path: Vacío
    • Default Root Object: index.html
    • Cache Behavior: Redirect HTTP to HTTPS
    • Price Class: Use All Edge Locations

🧪 Etapa 4: Pruebas y Optimización

Paso 4.1: Verificar Conectividad

# 1. Probar RDS
mysql -h TU_RDS_ENDPOINT -u admin -p

# 2. Probar EC2
curl http://TU_ALB_DNS_NAME/index.php

# 3. Probar S3
curl https://TU_CLOUDFRONT_URL
Enter fullscreen mode Exit fullscreen mode

Paso 4.2: Monitoreo

  1. CloudWatch Dashboards:

    • CPU utilization de EC2
    • Latencia de ALB
    • Conexiones a RDS
    • Requests de CloudFront
  2. Alertas:

    • CPU > 80%
    • Latencia ALB > 500ms
    • Errores HTTP > 10

Paso 4.3: Optimizaciones

Para RDS:

  • Habilitar automated backups
  • Configurar maintenance window
  • Monitorear slow queries

Para EC2:

  • Usar AMI optimizada
  • Configurar logs en CloudWatch
  • Implementar health checks

Para S3/CloudFront:

  • Configurar GZIP compression
  • Optimizar TTL de cache
  • Usar S3 Transfer Acceleration

💰 Costos Estimados

Free Tier (12 meses):

  • EC2: 750 horas/mes t2.micro
  • RDS: 750 horas/mes db.t2.micro
  • S3: 5GB almacenamiento
  • CloudFront: 50GB transferencia

Después del Free Tier:

  • EC2 (2 t2.micro): ~$20/mes
  • RDS (db.t3.micro): ~$15/mes
  • ALB: ~$20/mes
  • S3: ~$1/mes
  • CloudFront: ~$5/mes

Total estimado: ~$61/mes


🛡️ Buenas Prácticas

Seguridad:

  1. Nunca exponer RDS públicamente
  2. Usar IAM roles en lugar de keys
  3. Configurar Security Groups restrictivos
  4. Activar AWS CloudTrail
  5. Usar HTTPS en todas las comunicaciones

Rendimiento:

  1. Implementar caching en múltiples niveles
  2. Usar Connection Pooling para RDS
  3. Optimizar queries de base de datos
  4. Configurar Auto Scaling adecuadamente

Disponibilidad:

  1. Usar múltiples AZs
  2. Implementar health checks
  3. Configurar automated backups
  4. Tener un plan de disaster recovery

🎉 Conclusión

¡Felicitaciones! Has construido tu primera aplicación web multi-tier en AWS. Has aprendido:

  • Arquitectura de 3 capas separadas y escalables
  • Servicios clave de AWS: EC2, RDS, S3, CloudFront, ALB
  • Auto Scaling para manejar carga variable
  • Seguridad con Security Groups y VPC
  • Monitoreo con CloudWatch

Próximos Pasos:

  1. Implementar CI/CD con AWS CodePipeline
  2. Agregar contenedores con ECS/EKS
  3. Implementar caching con ElastiCache
  4. Usar Infrastructure as Code con CloudFormation

Recursos Adicionales:


¿Te gustó este tutorial? ¡Déjame saber en los comentarios qué proyecto de AWS te gustaría ver siguiente!

Top comments (0)