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.
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
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:
- Amazon Route 53: Gestiona el DNS para el dominio, proporcionando alta disponibilidad y escalabilidad global.
- 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.
- Internet Gateway: Permite la comunicación entre los recursos en la VPC y la Internet pública.
- Elastic Load Balancer (ELB): Distribuye el tráfico entrante entre las instancias de WordPress en diferentes zonas de disponibilidad.
- 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.
- 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.
- Amazon RDS (Aurora MySQL): Ofrece una base de datos gestionada y replicada entre múltiples zonas de disponibilidad, garantizando durabilidad y disponibilidad.
- 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.
- 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í?
- Infraestructura Modular: Uso de módulos de Terraform para gestionar componentes como redes, almacenamiento y balanceo de carga.
- Seguridad y Escalabilidad: Implementación de prácticas de seguridad con AWS KMS y escalabilidad a través de autoscaling.
- 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
Imágenes referenciales post despliegue
VPC
EFS
MEMCACHED
Aurora MySql
EC2 Connect ssm
ALB
Listeners
Target group
Autoscaling
Autoscaling policy
Cludfront
Cludfront behaivors
Record route53
Wordpress page
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 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━┛
🛠️ 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:
- 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.
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.
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!
Si deseas apoyar mi trabajo, puedes invitarme a un café. ¡Gracias por tu apoyo!