Este repositorio fue creado como demostración de una forma de escribir módulos de terraform en forma reutilizable.
Provee un set de herramientas ofrecidas como solucion integral para la implementacion y gestion de infraestructura. Provee templates prearmados, probados y validados para que cualquier operados pueda implementar servicios confiables.
Caracteristicas:
- ⚡️ Implementa infraestructura confiable y alineada a las buenas prácticas.
- 💸 Reduce costosos tiempos de diseño e implementación.
- 💥 Evita errores comunes y vulnerabilidades.
Nuestro proyecto de Terraform se organiza en tres directorios principales, cada uno con un propósito específico.
Este es el punto de partida para los ingenieros cloud en su trabajo diario. Aquí es donde configuran la infraestructura necesaria para diferentes proyectos y ambientes. Piensa en este directorio como el lugar donde se "personaliza" la infraestructura para cada caso específico.
Este directorio actúa como un "intermediario" entre los workspaces y los módulos. Su función principal es:
- Estandarizar las versiones de Terraform y los módulos que se utilizan en toda la empresa.
- Proporcionar una interfaz consistente para que los equipos de toda la organización puedan crear y gestionar recursos de manera uniforme.
- Simplificar el uso de módulos complejos, ofreciendo configuraciones predefinidas y adaptadas a las necesidades de la empresa.
Aquí es donde se desarrollan los módulos propios de la empresa. Estos módulos pueden:
- Utilizar módulos públicos de Terraform.
- Combinar módulos públicos con recursos adicionales para satisfacer necesidades específicas.
- Crear recursos desde cero cuando sea necesario.
![directorios](images/directorios.png)
Los ingenieros trabajan principalmente en la carpeta "workspaces", donde configuran la infraestructura necesaria.
Cuando necesitan un servicio, lo solicitan a través de los "wrappers", que aseguran que todos usen las mismas versiones y estándares.
Los "wrappers" llaman a los módulos en la carpeta "modules", que son como recetas personalizadas que pueden incluir ingredientes (módulos) públicos o propios.
- Mantener un estándar en toda la organización.
- Adaptar módulos públicos a las necesidades específicas sin tener que modificarlos directamente.
- Centralizar la lógica de creación de recursos, facilitando el mantenimiento y las actualizaciones.
Capa | Descripción | Scope |
---|---|---|
1. Organization | Servicios globales para todos los ambientes | Cuenta root AWS |
2. Base | Servicios fundamentales para un ambiente específico | Cuenta AWS > Ambiente |
3. Foundation | Servicios complementarios para un ambiente específico | Cuenta AWS > Ambiente |
4. Project | Servicios a nivel de proyecto | Cuenta AWS > Ambiente > Proyecto |
5. Workload | Servicios para alojar cargas de trabajo específicas | Cuenta AWS > Ambiente > Proyecto > Workload |
La capa Organization define servicios y configuraciones globales que aplican a todos los ambientes y proyectos.
Existe para centralizar la gestión de recursos compartidos y políticas que afectan a toda la infraestructura de la organización.
Servicios:
* N/A
La capa Base establece los componentes fundamentales necesarios en un ambiente específico.
Proporciona la infraestructura básica sobre la cual se construirán las demás capas. Su propósito es crear una base consistente para cada ambiente.
Servicios:
* VPC
* Route53
La capa Foundation complementa la capa Base con servicios adicionales necesarios para el funcionamiento general del ambiente. Agrega funcionalidades que son comunes a múltiples proyectos dentro del mismo ambiente.
Servicios:
* ACM ( Cerificados SSL ) ( requiere de DNS )
La capa Project se enfoca en los servicios requeridos por un proyecto específico dentro de un ambiente.
Existe para agrupar y gestionar recursos compartidos entre diferentes cargas de trabajo del mismo proyecto.
Servicios:
* Cluster de ECS ( Es donde se van a correr los contenedores )
* Clusters de RDS ( Base de Datos / Relacional )
* Servicio ALB ( Balanceador de Carga )
* Servicio S3
La capa Workload representa la implementación de una aplicación o servicio específico.
Define y configura los recursos directamente relacionados con la ejecución de una carga de trabajo particular, permitiendo su gestión independiente.
Servicios:
* Contenedores de ECS ( ECS Services / Tasks )
Antes de comenzar, asegúrate de tener lo siguiente:
- Repositorio clonado en tu máquina local.
- Terraform instalado en tu PC.
- Acceso a una cuenta de AWS con credenciales de administrador (para configurar el provider de Terraform).
- Una zona DNS disponible (para crear y habilitar una subzona DNS en Route53 en AWS).
Sigue estos pasos en orden para aplicar las diferentes capas de la infraestructura:
- Navega al directorio
base/development
. - Ajusta el archivo
locals.tf
según sea necesario:- Modifica
public_domain
yprivate_domain
. - Opcionalmente, ajusta las variables
company
yenv
. - Si es necesario, modifica
VPC_CIDR
.
- Modifica
Ejemplo de locals.tf
:
locals {
metadata = {
aws_region = "us-east-2"
environment = "Development"
public_domain = "democorp.cloud"
private_domain = "democorp"
key = {
company = "dmc"
region = "use2"
env = "dev"
}
}
common_name = join("-", [
local.metadata.key.company,
local.metadata.key.env
])
vpc_cidr = "10.100.0.0/16"
}
- Ejecuta los siguientes comandos:
terraform init terraform apply
Resultado: Se crea la VPC, una instancia EC2 para usar como NAT Gateway y la zona de Route53.
- Navega al directorio correspondiente.
- Ajusta el archivo
locals.tf
de manera similar a la capa BASE. - Ejecuta:
terraform init terraform apply
Resultado: Se crea el certificado de ACM.
- Navega al directorio correspondiente.
- Ajusta el archivo
locals.tf
. - Ejecuta:
terraform init terraform apply
Resultado: Se crean el cluster de base de datos (MySQL), cluster de ECS y ALB público.
- Navega al directorio correspondiente.
- Ajusta el archivo
locals.tf
. - Ejecuta:
terraform init terraform apply
Resultado: Se crea un contenedor de WordPress en el servicio de ECS, los registros DNS y las reglas de Load Balancer para acceder al servicio públicamente.
- Asegúrate de aplicar las capas en el orden especificado.
- Revisa cuidadosamente los cambios propuestos antes de aplicarlos.
- Considera usar variables de entorno o un archivo de variables para manejar configuraciones sensibles.
- Las claves de acceso a la base de datos estan almacenadas dentro del Secrets Managers. Revisar el archivo main.tf en
workspaces/workload/core/development/main.tf
si se quiere acceder a la base de datos sin autenticación. - Se debe crear la base de datos dentro del phpmyadmin bajo el nombre asignado de la variable "WORDPRESS_DATABASE_NAME" en
workspaces/workload/core/development/main.tf
.
Para obtener ayuda adicional o reportar problemas, contacte a:
- Email: support@your-company.com