Add complete SACC v4 infrastructure project

- Terraform modules: VPC, EC2, RDS, S3, CloudFront, Route53, Lambda, IAM, Security Groups
- Ansible playbooks for server configuration
- Scripts: create-test-environment.sh, destroy-test-environment.sh, validate-environment.sh
- Documentation: README, QUICKSTART, AGENTS
- Jenkins pipeline for automated deployment
- Jenkins pipeline for environment destruction
This commit is contained in:
Jenkins CI
2026-06-03 04:39:01 +00:00
commit 71be2abd2e
27 changed files with 6424 additions and 0 deletions
+355
View File
@@ -0,0 +1,355 @@
# =============================================================================
# TERRAFORM.TFVARS.EXAMPLE - SACC v4
# =============================================================================
# Plantilla unificada para despliegue de infraestructura SACC v4
# en entornos TEST y PRODUCCION usando Terraform Workspaces.
#
# INSTRUCCIONES:
# 1. Copiar este archivo: cp terraform.tfvars.example terraform.tfvars
# 2. Completar las variables marcadas como [REQUERIDO]
# 3. Seleccionar workspace: terraform workspace select test|prod
# 4. terraform init
# 5. terraform plan
# 6. terraform apply
#
# CUENTAS AWS:
# TEST: 668889063715 (mx-central-1)
# PROD: 523761210517 (mx-central-1)
#
# NOTA DE SEGURIDAD:
# - NUNCA commitear terraform.tfvars (esta en .gitignore)
# - Las contrasenas deben tener minimo 16 caracteres
# - Restringir SSH a IPs especificas (no usar 0.0.0.0/0)
# =============================================================================
# =============================================================================
# SECCION 1: CONFIGURACION GENERAL
# =============================================================================
# Entorno de despliegue. Terraform workspace DEBE coincidir con este valor.
# Valores permitidos: "test", "prod"
# TEST: "test" (cuenta 668889063715)
# PROD: "prod" (cuenta 523761210517)
# [REQUERIDO] - No tiene valor por defecto para evitar errores accidentales
environment = "test"
# Nombre del proyecto (usado como prefijo en recursos)
# Valor por defecto: "sacc4"
project_name = "sacc4"
# Region AWS para despliegue
# NOTA: mx-central-1 es la unica region disponible para ambas cuentas
# Valor por defecto: "mx-central-1"
aws_region = "mx-central-1"
# =============================================================================
# SECCION 2: DOMINIO Y DNS (Route53)
# =============================================================================
# Dominio principal para la aplicacion
# TEST: "dev-sacc.ccsoft.mx"
# PROD: "sacc.ccsoft.mx"
# [REQUERIDO] - Debe existir como Hosted Zone en Route53 de la cuenta
# correspondiente ANTES de ejecutar terraform apply
domain_name = "dev-sacc.ccsoft.mx"
# Subdominio para la API backend
# TEST: "api.dev-sacc.ccsoft.mx"
# PROD: "api.sacc.ccsoft.mx"
# [REQUERIDO] - Se crea automaticamente como registro A apuntando a EC2
api_subdomain = "api.dev-sacc.ccsoft.mx"
# =============================================================================
# SECCION 3: NETWORKING (VPC)
# =============================================================================
# CIDR block para la VPC
# IMPORTANTE: No debe chocar con otras VPCs ni redes on-premise
# TEST: "10.3.0.0/16" (evita conflicto con prod 10.2.0.0/16)
# PROD: "10.2.0.0/16"
# Valor por defecto: "10.3.0.0/16"
vpc_cidr = "10.3.0.0/16"
# Zonas de disponibilidad
# mx-central-1 actualmente soporta: mx-central-1a, mx-central-1b
# Valor por defecto: ["mx-central-1a", "mx-central-1b"]
availability_zones = ["mx-central-1a", "mx-central-1b"]
# CIDRs para subnets publicas (una por AZ)
# Deben estar dentro del rango vpc_cidr
# TEST: ["10.3.1.0/24", "10.3.2.0/24"]
# PROD: ["10.2.1.0/24", "10.2.2.0/24"]
# Valor por defecto: ["10.3.1.0/24", "10.3.2.0/24"]
public_subnet_cidrs = ["10.3.1.0/24", "10.3.2.0/24"]
# CIDRs para subnets privadas (una por AZ)
# RDS y recursos internos se despliegan aqui
# TEST: ["10.3.10.0/24", "10.3.11.0/24"]
# PROD: ["10.2.10.0/24", "10.2.11.0/24"]
# Valor por defecto: ["10.3.10.0/24", "10.3.11.0/24"]
private_subnet_cidrs = ["10.3.10.0/24", "10.3.11.0/24"]
# =============================================================================
# SECCION 4: EC2 - SERVIDOR DE APLICACION
# =============================================================================
# Tipo de instancia EC2
# TEST: "t3.small" (costo optimizado)
# PROD: "t3.medium" (instancia actual: 78.13.201.205)
# Valor por defecto: "t3.small"
# NOTA: Para produccion, t3.medium con 4GB RAM minimo recomendado
ec2_instance_type = "t3.small"
# AMI ID de Ubuntu 22.04 LTS (Jammy)
# Verificar AMI actualizada en: https://cloud-images.ubuntu.com/locator/ec2/
# Para mx-central-1, buscar "Ubuntu 22.04 LTS amd64"
# Valor por defecto: "ami-0f553e2869648134e" (Ubuntu 22.04 LTS)
# NOTA: La AMI puede variar por cuenta. Verificar en consola AWS.
ec2_ami = "ami-0f553e2869648134e"
# Tamano del volumen root en GB
# PROD actual: 8GB (7.6G usados 60%)
# Recomendado: 20GB para logs y artefactos
# Valor por defecto: 8
ec2_root_volume_size = 8
# Tipo de volumen root
# Opciones: gp2, gp3, io1, io2
# Valor por defecto: "gp2"
ec2_root_volume_type = "gp2"
# Encriptar volumen root
# Valor por defecto: true
# RECOMENDADO: Siempre true en produccion
ec2_root_volume_encrypted = true
# =============================================================================
# SECCION 5: ACCESO SSH (CRITICO - SEGURIDAD)
# =============================================================================
# Lista de CIDRs permitidos para acceso SSH (puerto 22)
# FORMATO: ["xxx.xxx.xxx.xxx/32"] para IP individual
# ["203.0.113.0/24"] para rango de oficina
# ["10.8.0.0/24"] para VPN
#
# [REQUERIDO] - Debe contener al menos tu IP publica actual
# WARNING: [] vacio permite SOLO acceso desde la VPC (mas seguro pero requiere bastion)
# PROD actual incluye IPs de: Libra-Totalplay, Leaseweb, Empresa
#
# Ejemplo TEST: ["186.96.145.105/32", "187.234.90.175/32"]
# Ejemplo PROD: ["186.96.145.105/32", "207.244.97.190/32", "187.234.90.175/32"]
ssh_allowed_cidrs = []
# Llave publica SSH para usuario "thoth"
# Generar par de llaves: ssh-keygen -t ed25519 -f sacc4-thoth-key -C "thoth@ccsoft"
# El usuario thoth se usa para despliegues (UID 1001, grupo duat GID 1006)
# [REQUERIDO] - Copiar contenido de sacc4-thoth-key.pub
thoth_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII/RcJmEYOBpfq1tSLltV1pyNB55l1jA2zYr5ZNJ0f41 thoth@ccsoft"
# Llave publica SSH para usuario "osiris"
# Generar par de llaves: ssh-keygen -t ed25519 -f sacc4-osiris-key -C "osiris@ccsoft"
# El usuario osiris ejecuta los servicios Java (UID 997, grupo duat GID 1006)
# [REQUERIDO] - Copiar contenido de sacc4-osiris-key.pub
osiris_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFo6CycfgIuCCSVZbhuPwqlAVDxY8YWb1xpvpqxSzMjR osiris@ccsoft"
# =============================================================================
# SECCION 6: RDS - BASE DE DATOS
# =============================================================================
# Clase de instancia RDS
# TEST: "db.t3.micro" (costo optimizado, eligible free tier)
# PROD: "db.t3.micro" (instancia actual en produccion)
# Valor por defecto: "db.t3.micro"
rds_instance_class = "db.t3.micro"
# Motor de base de datos
# PROD actual usa: MariaDB 10.6
# Valor por defecto: "mariadb"
# NOTA: No cambiar a menos que se migre intencionalmente
rds_engine = "mariadb"
# Version del motor
# PROD actual: 10.6
# TEST recomendado: 10.11.16 (version compatible mas reciente)
# Valor por defecto: "10.11.16"
rds_engine_version = "10.11.16"
# Almacenamiento asignado en GB
# Valor por defecto: 20
# Recomendado: 50GB+ para produccion con crecimiento
rds_allocated_storage = 20
# Almacenamiento maximo para auto-scaling
# RDS expande automaticamente hasta este limite
# Valor por defecto: 100
rds_max_allocated_storage = 100
# Nombre de la base de datos inicial
# TEST: "ccsoft_sacc4_test"
# PROD: "ccsoft_sacc4"
# Valor por defecto: "ccsoft_sacc4_test"
rds_db_name = "ccsoft_sacc4_test"
# Usuario master/administrador de RDS
# TEST: "sacc_admin_test"
# PROD: "sacc_admin_prod"
# Valor por defecto: "sacc_admin_test"
# NOTA: Este usuario NO es el que usa la aplicacion. La app usa un usuario
# adicional creado automaticamente: "sacc_app_user"
rds_master_username = "sacc_admin_test"
# Contrasena master de RDS
# [REQUERIDO] - MINIMO 16 caracteres, debe incluir:
# - Mayusculas, minusculas, numeros, simbolos
# - No usar caracteres especiales problematicos: @, /, \"
# Ejemplo: "Sacc4_Test_2024!Secure"
# NOTA DE SEGURIDAD: Esta contrasena se usa tambien para el usuario sacc_app_user
rds_master_password = "CambiarEstaPassword123!Segura"
# Periodo de retencion de backups automaticos (dias)
# TEST: 7 dias (minimo para desarrollo)
# PROD: 30 dias (recomendado para produccion)
# Valor por defecto: 7
rds_backup_retention_period = 7
# Ventana de backup (hora UTC)
# Formato: "hh:mm-hh:mm"
# Valor por defecto: "03:00-04:00" (9pm-10pm CST)
rds_backup_window = "03:00-04:00"
# Ventana de mantenimiento
# Formato: "Ddd:hh:mm-Ddd:hh:mm"
# Valor por defecto: "Mon:04:00-Mon:05:00"
rds_maintenance_window = "Mon:04:00-Mon:05:00"
# =============================================================================
# SECCION 7: SCHEDULING (APAGADO AUTOMATICO - SOLO TEST)
# =============================================================================
# Habilitar apagado automatico de EC2 y RDS para ahorrar costos
# RECOMENDADO: true para TEST, false para PROD
# TEST: true (apaga fines de semana)
# PROD: false (siempre encendido)
# Valor por defecto: true
enable_scheduling = true
# Zona horaria para las reglas de scheduling
# Valor por defecto: "America/Mexico_City"
schedule_timezone = "America/Mexico_City"
# Cron para INICIO de instancias (hora de Mexico)
# Por defecto: 8:00 AM Lunes-Viernes (13:00 UTC)
# Formato AWS cron: cron(minutes hours day-of-month month day-of-week year)
# Valor por defecto: "cron(0 13 ? * MON-FRI *)"
schedule_start_cron = "cron(0 13 ? * MON-FRI *)"
# Cron para APAGADO de instancias (hora de Mexico)
# Por defecto: 7:00 PM Lunes-Viernes (00:00 UTC siguiente dia)
# Valor por defecto: "cron(0 0 ? * TUE-SAT *)"
schedule_stop_cron = "cron(0 0 ? * TUE-SAT *)"
# =============================================================================
# SECCION 8: FRONTEND (S3 + CloudFront)
# =============================================================================
# Nombre del bucket S3 para alojar el frontend React
# DEBE ser unico a nivel global en AWS
# TEST: "sacc4-frontend-test-668889063715"
# PROD: "sacc4-frontend-prod-523761210517"
# [REQUERIDO] - Debe incluir ID de cuenta para garantizar unicidad
# NOTA: Si el bucket ya existe, Terraform fallara. Verificar primero.
frontend_bucket_name = "sacc4-frontend-test-668889063715"
# Clase de precio de CloudFront
# Opciones:
# "PriceClass_100" - Norteamérica y Europa (mas economico)
# "PriceClass_200" - + Asia y Oceania
# "PriceClass_All" - Global
# Valor por defecto: "PriceClass_100"
cloudfront_price_class = "PriceClass_100"
# Habilitar logging de CloudFront
# Valor por defecto: false
# Recomendado: true en produccion para debugging
enable_cloudfront_logging = false
# =============================================================================
# SECCION 9: CERTIFICADOS SSL (ACM)
# =============================================================================
# ARN del certificado SSL en ACM
# [REQUERIDO PARA HTTPS/PROD]
# Para CloudFront, el certificado DEBE estar en us-east-1 (N. Virginia)
# Aunque los recursos esten en mx-central-1
#
# Como obtener:
# 1. Ir a AWS Console -> Certificate Manager (region us-east-1)
# 2. Solicitar certificado para el domain_name
# 3. Validar via DNS (Route53) o Email
# 4. Copiar el ARN aqui
#
# TEST: "arn:aws:acm:us-east-1:668889063715:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
# PROD: "arn:aws:acm:us-east-1:523761210517:certificate/bfb41df2-79f1-40e5-95ad-404d4fe306e4"
#
# NOTA: Dejar vacio "" si aun no se tiene certificado. CloudFront se creara
# con HTTP solo y se actualizara manualmente despues.
certificate_arn = ""
# =============================================================================
# SECCION 10: TAGS Y METADATOS
# =============================================================================
# Tags comunes aplicados a TODOS los recursos
# Valor por defecto: ver abajo
# NOTA: Se agregan automaticamente tags adicionales por el provider:
# Environment, AccountId, CostCenter
common_tags = {
Project = "proyectosacc"
ManagedBy = "terraform"
Team = "infra"
Purpose = "test-environment"
}
# =============================================================================
# SECCION 11: VARIABLES AVANZADAS (opcional - modificar con precaucion)
# =============================================================================
# Configuracion de pool de conexiones HikariCP (aplicacion Java)
# Estos valores se inyectan via variables de entorno systemd
# Valores de PROD actual para referencia:
# max_pool_size = 4
# min_idle = 0
# idle_timeout = 300000
# max_lifetime = 1800000
# connection_timeout = 30000
# =============================================================================
# REFERENCIA RAPIDA: VALORES POR ENTORNO
# =============================================================================
# TEST PROD
# -------------------------------------------------------------------------
# Cuenta AWS: 668889063715 523761210517
# Region: mx-central-1 mx-central-1
# VPC CIDR: 10.3.0.0/16 10.2.0.0/16
# Dominio: dev-sacc.ccsoft.mx sacc.ccsoft.mx
# API: api.dev-sacc.ccsoft.mx api.sacc.ccsoft.mx
# EC2: t3.small t3.medium
# RDS: db.t3.micro db.t3.micro
# Scheduling: true (ahorro) false (24/7)
# AMI Ubuntu: ami-0f553e2869648134e ami-0f553e2869648134e
# -------------------------------------------------------------------------
# =============================================================================
# CHECKLIST PRE-DESPLIEGUE
# =============================================================================
# [ ] Crear/workspac: terraform workspace new test|prod
# [ ] Configurar credenciales AWS para la cuenta correcta
# [ ] Verificar que domain_name existe en Route53
# [ ] Solicitar certificado SSL en ACM (us-east-1)
# [ ] Generar llaves SSH para thoth y osiris
# [ ] Obtener IP publica actual para ssh_allowed_cidrs
# [ ] Definir contrasena segura para RDS (16+ caracteres)
# [ ] Verificar que frontend_bucket_name es unico globalmente
# [ ] Revisar CIDRs para evitar conflictos de red
# [ ] Ejecutar: terraform plan (revisar sin aplicar)
# =============================================================================