Despliega un WordPress de Alta Disponibilidad en AWS con Terraform en 30 Minutos: Guía Paso a Paso

francotel - Sep 1 - - Dev Community

Introducción a WordPress

WordPress es una de las plataformas de gestión de contenidos (CMS) más populares del mundo, alimentando más del 40% de todos los sitios web en Internet. Su flexibilidad, facilidad de uso y una extensa comunidad de desarrolladores lo convierten en la opción preferida tanto para blogs personales como para sitios empresariales de gran escala.

wordpress 1

Uso Empresarial de WordPress

En el ámbito empresarial, WordPress no es solo una herramienta para blogs; es una plataforma robusta capaz de manejar sitios web complejos con múltiples funcionalidades. Las empresas lo utilizan para:

  • Sitios web corporativos: Representa una opción confiable para la presencia digital de la marca.
  • E-commerce: Gracias a plugins como WooCommerce, WordPress puede transformar un sitio en una tienda en línea completamente funcional.
  • Portales de noticias: Grandes medios de comunicación confían en WordPress por su capacidad de manejar un gran volumen de contenido.
  • Sitios web de membresía: Con plugins específicos, es posible crear comunidades en línea y sitios de membresía con contenido exclusivo.

Resumen de la Arquitectura

wordpress-ha-aws

La imagen de la arquitectura actualizada muestra un diseño distribuido en múltiples Zonas de Disponibilidad (Availability Zones) dentro de una Región de AWS, lo que proporciona redundancia y resiliencia. Los componentes principales ahora incluyen:

  1. Amazon Route 53: Gestiona el DNS para el dominio, proporcionando alta disponibilidad y escalabilidad global.
  2. Amazon CloudFront: Un servicio de CDN que distribuye el contenido del sitio web globalmente, mejorando la velocidad de carga y reduciendo la latencia para los usuarios.
  3. Internet Gateway: Permite la comunicación entre los recursos en la VPC y la Internet pública.
  4. Elastic Load Balancer (ELB): Distribuye el tráfico entrante entre las instancias de WordPress en diferentes zonas de disponibilidad.
  5. Instancias EC2 en un Auto Scaling Group: Asegura que siempre haya un número mínimo de instancias de WordPress en funcionamiento, escalando automáticamente en respuesta a la carga de trabajo.
  6. Amazon ElastiCache (Memcached): Implementa un sistema de caché distribuido en memoria que acelera las consultas a la base de datos, mejorando significativamente el rendimiento del sitio.
  7. Amazon RDS (Aurora MySQL): Ofrece una base de datos gestionada y replicada entre múltiples zonas de disponibilidad, garantizando durabilidad y disponibilidad.
  8. Amazon S3 y EFS: Utilizados para el almacenamiento de medios y archivos estáticos, permitiendo un acceso compartido y rápido desde cualquier instancia de WordPress.
  9. VPC con subnets públicas y privadas: Organiza la red para garantizar seguridad y control sobre el tráfico, utilizando subnets públicas para los recursos expuestos a Internet y subnets privadas para los recursos internos.

Este despliegue asegura que el sitio web sea capaz de manejar tráfico elevado, con una infraestructura escalable y tolerante a fallos, ideal para aplicaciones empresariales críticas.

📝 Contexto del Proyecto

El despliegue de WordPress en alta disponibilidad es fundamental para proyectos que requieren rendimiento constante, mínimas interrupciones y escalabilidad automática. Este enfoque arquitectónico está diseñado para manejar tráfico variable y garantizar que tu sitio web esté siempre disponible para los usuarios.

📚 ¿Qué Aprenderás Aquí?

  1. Infraestructura Modular: Uso de módulos de Terraform para gestionar componentes como redes, almacenamiento y balanceo de carga.
  2. Seguridad y Escalabilidad: Implementación de prácticas de seguridad con AWS KMS y escalabilidad a través de autoscaling.
  3. Optimización de Costos: Uso de herramientas como Infracost para visualizar y gestionar los costos de la infraestructura.

💻 Parte Práctica en GitHub

La guía detallada de implementación práctica está disponible en el repositorio de GitHub. Ahí encontrarás:

  • 🛠️ Código completo: Todos los archivos de Terraform necesarios para el despliegue.
  • 📄 README completo: Con instrucciones claras de cómo clonar el repositorio, configurar tu entorno y desplegar la infraestructura.
  • 📊 Makefile optimizado: Para ejecutar comandos Terraform de manera sencilla y eficiente.

👇 Explora el Repositorio y Ponlo en Práctica

Para una implementación completa, clona el repositorio y sigue las instrucciones detalladas:

git clone https://github.com/francotel/wordpress-ha-terraform-aws
cd wordpress-ha-terraform-aws
Enter fullscreen mode Exit fullscreen mode

Imágenes referenciales post despliegue

VPC

VPC

EFS

EFS

MEMCACHED

MEMCACHED

Aurora MySql

AURORA MYSQL

EC2 Connect ssm

ec2 ssm

ALB

ALB

Listeners

LISTENERS

Target group

TARGET GROUP

Autoscaling

ASG

Autoscaling policy

ASG POLICY

Cludfront

CLOUDFRONT

Cludfront behaivors

CLOUDFRONT BEHAIVORS

Request USA
Test 1

Request Europe
Test 2

Cache Hits Cloudfront
Metrics cdn

Record route53

r53 record

Wordpress page

WORDPRESS PAGE

Wordpress admin

WORDPRESS ADMIN

Infracost

Project: francotel/wordpress-ha-terraform-aws/tfplan

 Name                                                                   Monthly Qty  Unit                        Monthly Cost   

 module.aurora.aws_rds_cluster_instance.this["1"]                                                                               
 └─ Database instance (on-demand, db.t3.medium)                                 730  hours                             $77.38   

 module.aurora.aws_rds_cluster_instance.this["2"]                                                                               
 └─ Database instance (on-demand, db.t3.medium)                                 730  hours                             $77.38   

 module.elasticache.aws_elasticache_cluster.this[0]                                                                             
 └─ ElastiCache (on-demand, cache.t4g.small)                                  1,460  hours                             $61.32   

 module.networking.aws_nat_gateway.this[0]                                                                                      
 ├─ NAT gateway                                                                 730  hours                             $32.85   
 └─ Data processed                                              Monthly cost depends on usage: $0.045 per GB                    

 module.asg.aws_autoscaling_group.this[0]                                                                                       
 └─ module.asg.aws_launch_template.this[0]                                                                                      
    ├─ Instance usage (Linux/UNIX, on-demand, t3a.micro)                      1,460  hours                             $16.35   
    ├─ EC2 detailed monitoring                                                   14  metrics                            $4.20   
    └─ block_device_mapping[0]                                                                                                  
       └─ Storage (general purpose SSD, gp2)                                     40  GB                                 $4.80   

 module.alb.aws_lb.this[0]                                                                                                      
 ├─ Application load balancer                                                   730  hours                             $18.40   
 └─ Load balancer capacity units                                Monthly cost depends on usage: $5.84 per LCU                    

 module.kms.aws_kms_key.this[0]                                                                                                 
 ├─ Customer master key                                                           1  months                             $1.00   
 ├─ Requests                                                    Monthly cost depends on usage: $0.03 per 10k requests           
 ├─ ECC GenerateDataKeyPair requests                            Monthly cost depends on usage: $0.10 per 10k requests           
 └─ RSA GenerateDataKeyPair requests                            Monthly cost depends on usage: $0.10 per 10k requests           

 module.acm.aws_route53_record.validation[0]                                                                                    
 ├─ Standard queries (first 1B)                                 Monthly cost depends on usage: $0.40 per 1M queries             
 ├─ Latency based routing queries (first 1B)                    Monthly cost depends on usage: $0.60 per 1M queries             
 └─ Geo DNS queries (first 1B)                                  Monthly cost depends on usage: $0.70 per 1M queries             

 module.acm.aws_route53_record.validation[1]                                                                                    
 ├─ Standard queries (first 1B)                                 Monthly cost depends on usage: $0.40 per 1M queries             
 ├─ Latency based routing queries (first 1B)                    Monthly cost depends on usage: $0.60 per 1M queries             
 └─ Geo DNS queries (first 1B)                                  Monthly cost depends on usage: $0.70 per 1M queries             

 module.acm_cloudfront.aws_route53_record.validation[0]                                                                         
 ├─ Standard queries (first 1B)                                 Monthly cost depends on usage: $0.40 per 1M queries             
 ├─ Latency based routing queries (first 1B)                    Monthly cost depends on usage: $0.60 per 1M queries             
 └─ Geo DNS queries (first 1B)                                  Monthly cost depends on usage: $0.70 per 1M queries             

 module.acm_cloudfront.aws_route53_record.validation[1]                                                                         
 ├─ Standard queries (first 1B)                                 Monthly cost depends on usage: $0.40 per 1M queries             
 ├─ Latency based routing queries (first 1B)                    Monthly cost depends on usage: $0.60 per 1M queries             
 └─ Geo DNS queries (first 1B)                                  Monthly cost depends on usage: $0.70 per 1M queries             

 module.aurora.aws_rds_cluster.this[0]                                                                                          
 ├─ Storage                                                     Monthly cost depends on usage: $0.11 per GB                     
 ├─ I/O requests                                                Monthly cost depends on usage: $0.22 per 1M requests            
 ├─ Backup storage                                              Monthly cost depends on usage: $0.024 per GB                    
 ├─ Backtrack                                                   Monthly cost depends on usage: $0.013 per 1M change-records     
 └─ Snapshot export                                             Monthly cost depends on usage: $0.012 per GB                    

 module.cdn.aws_cloudfront_distribution.this[0]                                                                                 
 ├─ Invalidation requests (first 1k)                            Monthly cost depends on usage: $0.00 per paths                  
 └─ US, Mexico, Canada                                                                                                          
    ├─ Data transfer out to internet (first 10TB)               Monthly cost depends on usage: $0.085 per GB                    
    ├─ Data transfer out to origin                              Monthly cost depends on usage: $0.02 per GB                     
    ├─ HTTP requests                                            Monthly cost depends on usage: $0.0075 per 10k requests         
    └─ HTTPS requests                                           Monthly cost depends on usage: $0.01 per 10k requests           

 module.efs.aws_efs_file_system.this[0]                                                                                         
 └─ Storage (standard)                                          Monthly cost depends on usage: $0.33 per GB                     

 module.records.aws_route53_record.this["wordpress-ha-demo A"]                                                                  
 ├─ Standard queries (first 1B)                                 Monthly cost depends on usage: $0.40 per 1M queries             
 ├─ Latency based routing queries (first 1B)                    Monthly cost depends on usage: $0.60 per 1M queries             
 └─ Geo DNS queries (first 1B)                                  Monthly cost depends on usage: $0.70 per 1M queries             

 OVERALL TOTAL                                                                                                       $293.68 

*Usage costs can be estimated by updating Infracost Cloud settings, see docs for other options.

──────────────────────────────────
75 cloud resources were detected:
∙ 15 were estimated
∙ 58 were free
∙ 2 are not supported yet, rerun with --show-skipped to see details

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Project                                            ┃ Baseline cost ┃ Usage cost* ┃ Total cost ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━┫
┃ francotel/wordpress-ha-terraform-aws/tfplan        ┃ $294          ┃ $0.00       ┃ $294       ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━┛

Enter fullscreen mode Exit fullscreen mode

Infracost HTML

🛠️ Configuración de Memcached con W3 Total Cache

Para optimizar el rendimiento de tu sitio WordPress, este despliegue incluye Memcached como sistema de caché distribuido. Sin embargo, para aprovechar al máximo esta integración, es necesario configurar manualmente el plugin W3 Total Cache en tu instalación de WordPress (ya esta instalado). Sigue estos pasos:

  1. Configura Memcached en la sección de Database Cache del plugin, asegurándote de seleccionar Memcached como método de caché y estableciendo las configuraciones adecuadas según tu entorno.

memcached

memcached config

Nota: Esta configuración manual es crucial para que tu sitio web se beneficie del sistema de caché, mejorando tiempos de carga y reduciendo la carga en la base de datos.

🖥️ Uso de Golden Images para Despliegues Rápidos

Aunque este proyecto es demostrativo, se recomienda utilizar una golden image preconfigurada para entornos de producción. Una golden image es una AMI (Amazon Machine Image) que incluye toda la paquetería y configuraciones necesarias, como:

  • PHP y módulos requeridos para WordPress.
  • Servidor web (Nginx o Apache) con configuraciones de seguridad básicas.
  • Herramientas de monitoreo y agentes de logging.

packer ami image

Sugerencia: Crear y mantener una golden image reduce significativamente el tiempo de despliegue y minimiza problemas de configuración en los entornos productivos.

🛡️ Protección Adicional con AWS WAF y CloudFront

Para reforzar la seguridad de tu aplicación, se recomienda implementar AWS WAF (Web Application Firewall) junto con CloudFront. Esto permite:

  • Filtrar tráfico malicioso antes de que llegue a tu aplicación.
  • Bloquear patrones comunes de ataques como SQL injection y XSS (Cross-site scripting).
  • Implementar reglas personalizadas para proteger áreas específicas de tu sitio.

Consejo: Esta capa de seguridad es vital para sitios en producción, especialmente aquellos expuestos a un tráfico considerable.

📊 Implementación de Monitoreo y Alertas

Tener un sistema de monitoreo y alertas es esencial para mantener la disponibilidad y rendimiento de tu infraestructura. Algunas recomendaciones incluyen:

  • Amazon CloudWatch: Para monitorear métricas clave como el uso de CPU, memoria, y tráfico en tiempo real.
  • Alertas configuradas en SNS: Para notificaciones inmediatas sobre cambios en el estado de los recursos, errores o patrones inusuales.
  • Integración con herramientas externas como Grafana o Zabbix para un monitoreo más avanzado.

Importante: Un buen sistema de monitoreo permite actuar rápidamente ante problemas y garantiza que tu aplicación se mantenga operativa.


💬 ¿Dudas o Comentarios?

Este despliegue cubre un flujo completo y funcional, pero siempre hay margen para mejorar y ajustar según las necesidades específicas. Si tienes preguntas, dudas o quieres profundizar en algún aspecto, no dudes en dejar un comentario o contactarme directamente. ¡Estoy aquí para ayudarte a sacar el máximo provecho de este proyecto!

📢 ¡Sígueme y Apóyame!

Si encuentras útil este repositorio y quieres ver más contenido similar, ¡sígueme en LinkedIn para estar al tanto de más proyectos y recursos!

LinkedIn

Si deseas apoyar mi trabajo, puedes invitarme a un café. ¡Gracias por tu apoyo!

Buy Me a Coffee

. . . . . . . . . . . . . . . . . . . . . .