71be2abd2e
- 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
920 lines
26 KiB
Markdown
920 lines
26 KiB
Markdown
# Guia de Inicio Rapido - Entorno TEST SACC v4
|
|
# ================================================================
|
|
# Cuenta AWS TEST: 668889063715
|
|
# Region: mx-central-1
|
|
# Dominio: dev-sacc.ccsoft.mx
|
|
# Ultima actualizacion: 2026-06-02
|
|
#
|
|
# ATENCION: Este documento contiene comandos MANUALES para ejecutar
|
|
# en AWS Console y Bitbucket. NO ejecutar scripts automaticamente
|
|
# sin revisar los valores.
|
|
# ================================================================
|
|
|
|
---
|
|
|
|
## Tabla de Contenidos
|
|
|
|
1. [Prerrequisitos](#1-prerrequisitos)
|
|
2. [Configuracion Paso a Paso](#2-configuracion-paso-a-paso)
|
|
3. [Comandos de Verificacion](#3-comandos-de-verificacion)
|
|
4. [Estimacion de Costos](#4-estimacion-de-costos)
|
|
5. [Solucion de Problemas](#5-solucion-de-problemas)
|
|
6. [Limpieza (Destruir Entorno)](#6-limpieza-destruir-entorno)
|
|
|
|
---
|
|
|
|
## 1. Prerrequisitos
|
|
|
|
Antes de comenzar, asegurate de tener:
|
|
|
|
### Herramientas Instaladas
|
|
|
|
| Herramienta | Version Minima | Comando para verificar |
|
|
|-------------|----------------|------------------------|
|
|
| AWS CLI | 2.x | `aws --version` |
|
|
| Terraform | >= 1.5.0 | `terraform -version` |
|
|
| Git | Cualquiera | `git --version` |
|
|
| OpenSSH | Cualquiera | `ssh -V` |
|
|
|
|
### Accesos Requeridos
|
|
|
|
- [ ] Acceso a AWS Console para la cuenta **668889063715** (TEST) con permisos de administrador
|
|
- [ ] Acceso de solo lectura a AWS Console para la cuenta **523761210517** (PROD) - para referencia
|
|
- [ ] Acceso de administrador al repositorio Bitbucket `proyectosacc`
|
|
- [ ] Llave SSH descargada (una de las existentes: `ccsoft-dev-key` o `Sacc-dev`)
|
|
|
|
### Recursos Ya Existentes en Cuenta TEST
|
|
|
|
Estos recursos ya estan configurados en la cuenta 668889063715:
|
|
|
|
- [x] **Route53 Hosted Zone** para `dev-sacc.ccsoft.mx`
|
|
- [x] **IAM Role** `BitbucketProyectosaccCICDRoleDev` para CI/CD
|
|
- [x] **IAM Role** `proyectosacc-ec2-role-dev` para instancias EC2
|
|
- [x] **Key Pairs** `ccsoft-dev-key` y `Sacc-dev`
|
|
|
|
---
|
|
|
|
## 2. Configuracion Paso a Paso
|
|
|
|
### Paso 1: Obtener Tu IP Publica
|
|
|
|
Necesitas tu IP publica para restringir el acceso SSH en los Security Groups.
|
|
|
|
```bash
|
|
# Ejecutar en tu terminal
|
|
curl -s https://checkip.amazonaws.com
|
|
```
|
|
|
|
**Salida esperada:**
|
|
```
|
|
186.96.145.105
|
|
```
|
|
|
|
💡 **Tip:** Anota esta IP. La usaras en el formato `186.96.145.105/32`.
|
|
|
|
⚠️ **Advertencia:** Si tu IP cambia (IP dinamica), deberas actualizar los Security Groups.
|
|
|
|
---
|
|
|
|
### Paso 2: Crear/Validar Certificado SSL en ACM
|
|
|
|
CloudFront requiere un certificado SSL. El certificado **DEBE** estar en la region `us-east-1` (N. Virginia), aunque los recursos esten en `mx-central-1`.
|
|
|
|
#### 2.1 Solicitar Certificado
|
|
|
|
1. Ir a **AWS Console** -> **Certificate Manager (ACM)**
|
|
2. Cambiar la region a **US East (N. Virginia)** usando el selector de region arriba a la derecha
|
|
3. Clic en **"Request a certificate"**
|
|
4. Seleccionar **"Request a public certificate"**
|
|
5. Clic en **"Next"**
|
|
|
|
#### 2.2 Configurar Dominio
|
|
|
|
- **Fully qualified domain name:** `dev-sacc.ccsoft.mx`
|
|
- **Validation method:** DNS validation (recomendado)
|
|
- Clic en **"Request"**
|
|
|
|
#### 2.3 Validar por DNS
|
|
|
|
1. En la lista de certificados, encontraras uno con estado **"Pending validation"**
|
|
2. Clic en el **Certificate ID**
|
|
3. En la seccion **"Domains"**, clic en **"Create records in Route 53"**
|
|
4. Seleccionar el dominio `dev-sacc.ccsoft.mx`
|
|
5. Clic en **"Create records"**
|
|
|
|
#### 2.4 Esperar Validacion
|
|
|
|
- El estado cambiara a **"Issued"** (generalmente toma 5-15 minutos)
|
|
- Refrescar la pagina cada 2 minutos
|
|
|
|
#### 2.5 Copiar el ARN
|
|
|
|
Una vez emitido, copiar el ARN completo:
|
|
|
|
```
|
|
arn:aws:acm:us-east-1:668889063715:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
|
```
|
|
|
|
💡 **Tip:** Guarda este ARN en un archivo de texto temporal. Lo necesitaras en el Paso 3.
|
|
|
|
⚠️ **Advertencia:** Si no completas la validacion DNS, Terraform fallara al crear CloudFront.
|
|
|
|
---
|
|
|
|
### Paso 3: Completar terraform.tfvars
|
|
|
|
El archivo de variables esta ubicado en:
|
|
```
|
|
iac-duplicate/terraform/environments/test/terraform.tfvars
|
|
```
|
|
|
|
#### 3.1 Variables Requeridas (DEBEN ser modificadas)
|
|
|
|
Edita el archivo y completa estos valores:
|
|
|
|
```hcl
|
|
# =============================================================================
|
|
# VARIABLES OBLIGATORIAS - MODIFICAR ANTES DE APLICAR
|
|
# =============================================================================
|
|
|
|
# Tu IP publica para acceso SSH (obtenida en Paso 1)
|
|
# Formato: ["xxx.xxx.xxx.xxx/32"]
|
|
# Ejemplo: ["186.96.145.105/32"]
|
|
ssh_allowed_cidrs = ["TU_IP_AQUI/32"]
|
|
|
|
# Contrasena maestra de RDS
|
|
# REQUISITOS: Minimo 16 caracteres, incluir mayusculas, minusculas, numeros y simbolos
|
|
# NO usar: @, /, \"
|
|
# Ejemplo: "Sacc4_Test_2024!Secure"
|
|
rds_master_password = "TU_PASSWORD_SEGURO_AQUI"
|
|
|
|
# Llave publica SSH para usuario "thoth"
|
|
# Generar con: ssh-keygen -t ed25519 -f ~/.ssh/sacc4-thoth -C "thoth@ccsoft"
|
|
# Copiar el contenido del archivo ~/.ssh/sacc4-thoth.pub
|
|
thoth_public_key = "ssh-ed25519 AAAA... thoth@ccsoft"
|
|
|
|
# Llave publica SSH para usuario "osiris"
|
|
# Generar con: ssh-keygen -t ed25519 -f ~/.ssh/sacc4-osiris -C "osiris@ccsoft"
|
|
# Copiar el contenido del archivo ~/.ssh/sacc4-osiris.pub
|
|
osiris_public_key = "ssh-ed25519 AAAA... osiris@ccsoft"
|
|
|
|
# ARN del certificado SSL (obtenido en Paso 2)
|
|
# Dejar vacio "" si aun no tienes certificado
|
|
# Ejemplo: "arn:aws:acm:us-east-1:668889063715:certificate/..."
|
|
certificate_arn = ""
|
|
```
|
|
|
|
#### 3.2 Variables Recomendadas (revisar valores)
|
|
|
|
```hcl
|
|
# Nombre del bucket S3 para frontend
|
|
# DEBE ser unico a nivel global en AWS
|
|
frontend_bucket_name = "sacc4-frontend-test-668889063715"
|
|
|
|
# Tipo de instancia EC2
|
|
ec2_instance_type = "t3.small"
|
|
|
|
# Clase de instancia RDS
|
|
rds_instance_class = "db.t3.micro"
|
|
|
|
# Region y entorno (generalmente no cambian)
|
|
aws_region = "mx-central-1"
|
|
environment = "test"
|
|
project_name = "sacc4"
|
|
```
|
|
|
|
#### 3.3 Ejemplo Completo de terraform.tfvars
|
|
|
|
```hcl
|
|
# =============================================================================
|
|
# VARIABLES DE ENTORNO TEST - SACC v4
|
|
# Cuenta AWS: 668889063715
|
|
# =============================================================================
|
|
|
|
aws_region = "mx-central-1"
|
|
environment = "test"
|
|
project_name = "sacc4"
|
|
|
|
# Dominio principal para el entorno de test
|
|
domain_name = "dev-sacc.ccsoft.mx"
|
|
api_subdomain = "api.dev-sacc.ccsoft.mx"
|
|
|
|
# Networking
|
|
vpc_cidr = "10.3.0.0/16"
|
|
availability_zones = ["mx-central-1a", "mx-central-1b"]
|
|
public_subnet_cidrs = ["10.3.1.0/24", "10.3.2.0/24"]
|
|
private_subnet_cidrs = ["10.3.10.0/24", "10.3.11.0/24"]
|
|
|
|
# EC2
|
|
ec2_instance_type = "t3.small"
|
|
ec2_ami = "ami-0f553e2869648134e"
|
|
ec2_root_volume_size = 8
|
|
ec2_root_volume_type = "gp2"
|
|
ec2_root_volume_encrypted = true
|
|
|
|
# SSH - REEMPLAZAR con tu IP publica
|
|
ssh_allowed_cidrs = ["186.96.145.105/32"]
|
|
|
|
# Llaves SSH - REEMPLAZAR con tus llaves publicas reales
|
|
thoth_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII/RcJmEYOBpfq1tSLltV1pyNB55l1jA2zYr5ZNJ0f41 thoth@ccsoft"
|
|
osiris_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFo6CycfgIuCCSVZbhuPwqlAVDxY8YWb1xpvpqxSzMjR osiris@ccsoft"
|
|
|
|
# RDS
|
|
rds_instance_class = "db.t3.micro"
|
|
rds_engine = "mariadb"
|
|
rds_engine_version = "10.11.16"
|
|
rds_allocated_storage = 20
|
|
rds_max_allocated_storage = 100
|
|
rds_db_name = "ccsoft_sacc4_test"
|
|
rds_master_username = "sacc_admin_test"
|
|
rds_master_password = "Sacc4_Test_2024!Secure"
|
|
|
|
rds_backup_retention_period = 7
|
|
rds_backup_window = "03:00-04:00"
|
|
rds_maintenance_window = "Mon:04:00-Mon:05:00"
|
|
|
|
# Scheduling (apagado automatico para ahorrar costos en test)
|
|
enable_scheduling = true
|
|
schedule_timezone = "America/Mexico_City"
|
|
schedule_start_cron = "cron(0 13 ? * MON-FRI *)"
|
|
schedule_stop_cron = "cron(0 0 ? * TUE-SAT *)"
|
|
|
|
# Frontend
|
|
frontend_bucket_name = "sacc4-frontend-test-668889063715"
|
|
cloudfront_price_class = "PriceClass_100"
|
|
enable_cloudfront_logging = false
|
|
|
|
# Certificado SSL (dejar vacio si aun no esta listo)
|
|
certificate_arn = ""
|
|
|
|
# Tags
|
|
common_tags = {
|
|
Project = "proyectosacc"
|
|
ManagedBy = "terraform"
|
|
Team = "infra"
|
|
Purpose = "test-environment"
|
|
}
|
|
```
|
|
|
|
⚠️ **Advertencia:** NUNCA commitear `terraform.tfvars` al repositorio. El archivo ya esta en `.gitignore`.
|
|
|
|
💡 **Tip:** Si necesitas regenerar llaves SSH, ejecuta:
|
|
```bash
|
|
ssh-keygen -t ed25519 -f ~/.ssh/sacc4-thoth -C "thoth@ccsoft"
|
|
ssh-keygen -t ed25519 -f ~/.ssh/sacc4-osiris -C "osiris@ccsoft"
|
|
```
|
|
|
|
---
|
|
|
|
### Paso 4: Inicializar Backend de Terraform
|
|
|
|
Terraform necesita un bucket S3 y una tabla DynamoDB para guardar el estado.
|
|
|
|
#### 4.1 Configurar Credenciales AWS
|
|
|
|
```bash
|
|
# Usando AWS CLI (recomendado)
|
|
aws configure --profile test
|
|
# Ingresar:
|
|
# AWS Access Key ID: [tu access key de cuenta 668889063715]
|
|
# AWS Secret Access Key: [tu secret key]
|
|
# Default region name: mx-central-1
|
|
# Default output format: json
|
|
|
|
# Verificar que estas usando la cuenta correcta
|
|
aws sts get-caller-identity --profile test
|
|
```
|
|
|
|
**Salida esperada:**
|
|
```json
|
|
{
|
|
"UserId": "AROA...:usuario",
|
|
"Account": "668889063715",
|
|
"Arn": "arn:aws:sts::668889063715:assumed-role/..."
|
|
}
|
|
```
|
|
|
|
⚠️ **Advertencia:** Verifica que el Account sea **668889063715**. Si ves 523761210517, estas en PRODUCCION.
|
|
|
|
#### 4.2 Crear Backend (Bucket S3 + DynamoDB)
|
|
|
|
```bash
|
|
cd iac-duplicate/terraform/environments/test
|
|
|
|
# Crear bucket S3 para estado Terraform
|
|
aws s3api create-bucket \
|
|
--bucket sacc4-terraform-state-test-668889063715 \
|
|
--region mx-central-1 \
|
|
--create-bucket-configuration LocationConstraint=mx-central-1 \
|
|
--profile test
|
|
|
|
# Habilitar versionamiento
|
|
aws s3api put-bucket-versioning \
|
|
--bucket sacc4-terraform-state-test-668889063715 \
|
|
--versioning-configuration Status=Enabled \
|
|
--profile test
|
|
|
|
# Habilitar encriptacion
|
|
aws s3api put-bucket-encryption \
|
|
--bucket sacc4-terraform-state-test-668889063715 \
|
|
--server-side-encryption-configuration '{
|
|
"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]
|
|
}' \
|
|
--profile test
|
|
|
|
# Crear tabla DynamoDB para locks
|
|
aws dynamodb create-table \
|
|
--table-name sacc4-terraform-locks-test-668889063715 \
|
|
--attribute-definitions AttributeName=LockID,AttributeType=S \
|
|
--key-schema AttributeName=LockID,KeyType=HASH \
|
|
--billing-mode PAY_PER_REQUEST \
|
|
--region mx-central-1 \
|
|
--profile test
|
|
```
|
|
|
|
💡 **Tip:** Si los recursos ya existen, los comandos anteriores daran error. Esto es normal y puedes continuar.
|
|
|
|
#### 4.3 Inicializar Terraform
|
|
|
|
```bash
|
|
terraform init
|
|
```
|
|
|
|
**Salida esperada:**
|
|
```
|
|
Initializing the backend...
|
|
Successfully configured the backend "s3"!
|
|
|
|
Initializing provider plugins...
|
|
- Finding hashicorp/aws versions matching "~> 5.0"...
|
|
- Installing hashicorp/aws v5.x.x...
|
|
|
|
Terraform has been successfully initialized!
|
|
```
|
|
|
|
---
|
|
|
|
### Paso 5: Validar y Planificar
|
|
|
|
#### 5.1 Validar Sintaxis
|
|
|
|
```bash
|
|
terraform validate
|
|
```
|
|
|
|
**Salida esperada:**
|
|
```
|
|
Success! The configuration is valid.
|
|
```
|
|
|
|
#### 5.2 Verificar Plan
|
|
|
|
```bash
|
|
terraform plan -var-file="terraform.tfvars"
|
|
```
|
|
|
|
⚠️ **Advertencia:** Revisa CUIDADOSAMENTE la salida. Verifica que:
|
|
- No se vayan a destruir recursos existentes
|
|
- Los nombres de recursos sean correctos
|
|
- La region sea `mx-central-1`
|
|
|
|
El plan mostrara todos los recursos que se crearan:
|
|
- 1 VPC
|
|
- 2 Subnets publicas
|
|
- 2 Subnets privadas
|
|
- 1 Internet Gateway
|
|
- 1 Instancia EC2
|
|
- 1 Instancia RDS
|
|
- 1 Bucket S3
|
|
- 1 Distribucion CloudFront
|
|
- 2 Funciones Lambda (scheduling)
|
|
- Security Groups, IAM Roles, Route53 records
|
|
|
|
---
|
|
|
|
### Paso 6: Aplicar Infraestructura
|
|
|
|
```bash
|
|
terraform apply -var-file="terraform.tfvars"
|
|
```
|
|
|
|
1. Terraform pedira confirmacion: escribir **"yes"**
|
|
2. El proceso toma **15-25 minutos**
|
|
3. RDS es el recurso que mas tarda en crear (10-15 minutos)
|
|
|
|
**Salida esperada al finalizar:**
|
|
```
|
|
Apply complete! Resources: 35 added, 0 changed, 0 destroyed.
|
|
|
|
Outputs:
|
|
|
|
ec2_public_ip = "X.X.X.X"
|
|
rds_endpoint = "sacc4-test-db-prod.XXXXXXXX.us-east-1.rds.amazonaws.com"
|
|
frontend_url = "https://dev-sacc.ccsoft.mx"
|
|
```
|
|
|
|
💡 **Tip:** Guarda los outputs en un archivo para referencia:
|
|
```bash
|
|
terraform output -json > terraform-outputs.json
|
|
```
|
|
|
|
⚠️ **Advertencia:** Si el comando falla a mitad de ejecucion, ejecuta `terraform apply` nuevamente. Terraform reanudara desde donde se detuvo.
|
|
|
|
---
|
|
|
|
### Paso 7: Configurar Variables en Bitbucket
|
|
|
|
Estas variables permiten que el pipeline CI/CD despliegue automaticamente.
|
|
|
|
#### 7.1 Navegar a Configuracion
|
|
|
|
1. Ir a **Bitbucket** -> **Repositorio proyectosacc**
|
|
2. Clic en **"Repository settings"** (engranaje, barra lateral izquierda)
|
|
3. En la seccion **Pipelines**, clic en **"Repository variables"**
|
|
|
|
#### 7.2 Variables para Entorno TEST
|
|
|
|
| Variable | Valor | Secured |
|
|
|----------|-------|---------|
|
|
| `TEST_AWS_ACCESS_KEY_ID` | [Access Key de cuenta 668889063715] | Si |
|
|
| `TEST_AWS_SECRET_ACCESS_KEY` | [Secret Key de cuenta 668889063715] | Si |
|
|
| `TEST_AWS_SESSION_TOKEN` | [Session Token si aplica] | Si |
|
|
| `TEST_AWS_ACCOUNT_ID` | `668889063715` | No |
|
|
| `TEST_AWS_REGION` | `mx-central-1` | No |
|
|
| `TEST_AWS_ROLE_ARN` | `arn:aws:iam::668889063715:role/BitbucketProyectosaccCICDRoleDev` | No |
|
|
|
|
#### 7.3 Variables para Entorno PROD (solo referencia)
|
|
|
|
| Variable | Valor | Secured |
|
|
|----------|-------|---------|
|
|
| `PROD_AWS_ACCOUNT_ID` | `523761210517` | No |
|
|
| `PROD_AWS_REGION` | `mx-central-1` | No |
|
|
| `PROD_AWS_ROLE_ARN` | `arn:aws:iam::523761210517:role/BitbucketProyectosaccCICDRole` | No |
|
|
|
|
#### 7.4 Variables de Notificaciones (opcional)
|
|
|
|
| Variable | Valor | Secured |
|
|
|----------|-------|---------|
|
|
| `TELEGRAM_BOT_TOKEN` | [Token del bot de @BotFather] | Si |
|
|
| `TELEGRAM_CHAT_ID` | [ID del chat de Telegram] | No |
|
|
|
|
#### 7.5 Variables de Conexion SSH
|
|
|
|
| Variable | Valor | Secured |
|
|
|----------|-------|---------|
|
|
| `SSH_PRIVATE_KEY` | [Contenido completo de la llave privada .pem] | Si |
|
|
| `SSH_USER` | `ubuntu` | No |
|
|
| `SERVER_HOST` | [IP publica de EC2 despues de crearla] | No |
|
|
|
|
💡 **Tip:** La IP publica de EC2 la obtienes con:
|
|
```bash
|
|
cd iac-duplicate/terraform/environments/test
|
|
terraform output ec2_public_ip
|
|
```
|
|
|
|
⚠️ **Advertencia:** Marca como **"Secured"** todas las variables que contengan passwords, tokens o llaves privadas. Bitbucket las ocultara en los logs.
|
|
|
|
---
|
|
|
|
### Paso 8: Desplegar Aplicacion
|
|
|
|
Una vez configuradas las variables de Bitbucket:
|
|
|
|
```bash
|
|
# En tu repositorio local
|
|
git checkout test
|
|
git add .
|
|
git commit -m "feat: configurar entorno test"
|
|
git push origin test
|
|
```
|
|
|
|
El pipeline se ejecutara automaticamente:
|
|
1. **Setup Tools** - Instala dependencias
|
|
2. **Validate Terraform** - Valida sintaxis
|
|
3. **Plan Terraform** - Genera plan de cambios
|
|
4. **Apply Terraform** - Aplica infraestructura
|
|
5. **Deploy Application** - Configura servidor con Ansible
|
|
6. **Health Check** - Verifica que todo funciona
|
|
|
|
💡 **Tip:** Puedes monitorear el pipeline en Bitbucket -> Pipelines.
|
|
|
|
---
|
|
|
|
## 3. Comandos de Verificacion
|
|
|
|
Despues del despliegue, ejecuta estos comandos para verificar que todo funciona:
|
|
|
|
### 3.1 Verificar Infraestructura AWS
|
|
|
|
```bash
|
|
# Verificar EC2
|
|
aws ec2 describe-instances \
|
|
--region mx-central-1 \
|
|
--profile test \
|
|
--query 'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress,InstanceType]'
|
|
|
|
# Verificar RDS
|
|
aws rds describe-db-instances \
|
|
--region mx-central-1 \
|
|
--profile test \
|
|
--query 'DBInstances[*].[DBInstanceIdentifier,DBInstanceStatus,Endpoint.Address]'
|
|
|
|
# Verificar S3
|
|
aws s3 ls s3://sacc4-frontend-test-668889063715/ --profile test
|
|
|
|
# Verificar CloudFront
|
|
aws cloudfront list-distributions \
|
|
--profile test \
|
|
--query 'DistributionList.Items[*].[Id,Status,DomainName]'
|
|
|
|
# Verificar Lambda
|
|
aws lambda list-functions \
|
|
--region mx-central-1 \
|
|
--profile test \
|
|
--query 'Functions[*].[FunctionName,State]'
|
|
```
|
|
|
|
### 3.2 Verificar Conectividad
|
|
|
|
```bash
|
|
# Obtener IP de EC2
|
|
EC2_IP=$(terraform output -raw ec2_public_ip)
|
|
|
|
# Verificar SSH
|
|
ssh -i ~/.ssh/sacc4-test-key.pem ubuntu@$EC2_IP "echo 'Conexion SSH OK'"
|
|
|
|
# Verificar Nginx
|
|
ssh -i ~/.ssh/sacc4-test-key.pem ubuntu@$EC2_IP "sudo systemctl status nginx"
|
|
|
|
# Verificar servicios Java (puertos 8080-8085)
|
|
for port in 8080 8081 8082 8083 8084 8085; do
|
|
echo "Puerto $port: $(ssh -i ~/.ssh/sacc4-test-key.pem ubuntu@$EC2_IP "curl -s -o /dev/null -w '%{http_code}' http://localhost:$port/actuator/health" 2>/dev/null || echo 'FAIL')"
|
|
done
|
|
|
|
# Health check via dominio
|
|
curl -f https://dev-sacc.ccsoft.mx/api/health || echo "API no responde"
|
|
curl -f -I https://dev-sacc.ccsoft.mx || echo "Frontend no responde"
|
|
```
|
|
|
|
### 3.3 Verificar Base de Datos
|
|
|
|
```bash
|
|
# Obtener endpoint RDS
|
|
RDS_ENDPOINT=$(terraform output -raw rds_endpoint)
|
|
|
|
# Verificar conexion desde EC2
|
|
ssh -i ~/.ssh/sacc4-test-key.pem ubuntu@$EC2_IP \
|
|
"mysql -h $RDS_ENDPOINT -u sacc_app_user -p -e 'SELECT 1;'"
|
|
|
|
# Verificar que RDS no es publicamente accesible
|
|
aws rds describe-db-instances \
|
|
--region mx-central-1 \
|
|
--profile test \
|
|
--query 'DBInstances[*].PubliclyAccessible'
|
|
# Salida esperada: [false]
|
|
```
|
|
|
|
### 3.4 Verificar DNS
|
|
|
|
```bash
|
|
# Verificar que los registros DNS resuelven correctamente
|
|
dig +short dev-sacc.ccsoft.mx
|
|
dig +short api.dev-sacc.ccsoft.mx
|
|
|
|
# Verificar certificado SSL
|
|
curl -vI https://dev-sacc.ccsoft.mx 2>&1 | grep "SSL certificate"
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Estimacion de Costos
|
|
|
|
### Costo Mensual Aproximado (TEST)
|
|
|
|
#### Con Scheduling Habilitado (Recomendado)
|
|
|
|
El scheduling apaga EC2 y RDS automaticamente fuera de horario laboral:
|
|
|
|
| Servicio | Tipo | Horas/Dia | Costo/Mes (USD) |
|
|
|----------|------|-----------|-----------------|
|
|
| EC2 | t3.small | ~10 | ~$7 |
|
|
| RDS | db.t3.micro | ~10 | ~$4 |
|
|
| S3 | ~1GB | 24/7 | ~$0.20 |
|
|
| CloudFront | Bajo trafico | 24/7 | ~$0.50 |
|
|
| Route53 | 1 hosted zone | 24/7 | ~$0.50 |
|
|
| Lambda | 2 funciones | 24/7 | ~$0 |
|
|
| Data Transfer | Estimado | - | ~$1 |
|
|
| **TOTAL** | | | **~$13/mes** |
|
|
|
|
#### Sin Scheduling (24/7)
|
|
|
|
| Servicio | Tipo | Costo/Mes (USD) |
|
|
|----------|------|-----------------|
|
|
| EC2 | t3.small | ~$15 |
|
|
| RDS | db.t3.micro | ~$13 |
|
|
| S3 | ~1GB | ~$0.20 |
|
|
| CloudFront | Bajo trafico | ~$0.50 |
|
|
| Route53 | 1 hosted zone | ~$0.50 |
|
|
| Lambda | 2 funciones | ~$0 |
|
|
| Data Transfer | Estimado | ~$5 |
|
|
| **TOTAL** | | **~$35-40/mes** |
|
|
|
|
💡 **Tip:** El scheduling ahorra aproximadamente **$20-25/mes** apagando recursos en horario no laboral.
|
|
|
|
⚠️ **Advertencia:** Los costos pueden variar segun el uso real. Configurar un **AWS Budget** con alerta a $50/mes:
|
|
```bash
|
|
aws budgets create-budget --budget file://budget.json --notifications-with-subscribers file://notifications.json
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Solucion de Problemas
|
|
|
|
### Problema 1: Certificado ACM No Se Valida
|
|
|
|
**Sintoma:** CloudFront muestra error o Terraform falla con certificado no encontrado.
|
|
|
|
**Solucion:**
|
|
1. Verificar que el certificado esta en **us-east-1** (N. Virginia)
|
|
2. Verificar que los registros CNAME de validacion existen en Route53
|
|
3. Esperar 15-30 minutos despues de crear el registro DNS
|
|
4. Si persiste, eliminar el certificado y solicitar uno nuevo
|
|
|
|
```bash
|
|
# Verificar estado del certificado
|
|
aws acm describe-certificate \
|
|
--certificate-arn arn:aws:acm:us-east-1:668889063715:certificate/XXXX \
|
|
--region us-east-1 \
|
|
--query 'Certificate.Status'
|
|
```
|
|
|
|
---
|
|
|
|
### Problema 2: Security Group Bloquea SSH
|
|
|
|
**Sintoma:** `ssh: connect to host X.X.X.X port 22: Connection timed out`
|
|
|
|
**Solucion:**
|
|
1. Verificar que tu IP actual esta en `ssh_allowed_cidrs`
|
|
2. Si tu IP cambio, actualizar terraform.tfvars y re-aplicar:
|
|
|
|
```bash
|
|
# Obtener tu IP actual
|
|
curl -s https://checkip.amazonaws.com
|
|
|
|
# Editar terraform.tfvars con la nueva IP
|
|
terraform apply -var-file="terraform.tfvars" -target=module.security_groups
|
|
```
|
|
|
|
3. Verificar que el Security Group permite puerto 22 desde tu CIDR
|
|
|
|
---
|
|
|
|
### Problema 3: Contrasena RDS Demasiado Corta
|
|
|
|
**Sintoma:** Terraform falla con `InvalidParameterValue: Password must be at least 16 characters`
|
|
|
|
**Solucion:**
|
|
```hcl
|
|
# terraform.tfvars - Usar contrasena de 16+ caracteres
|
|
rds_master_password = "Sacc4_Test_2024!Secure"
|
|
```
|
|
|
|
Requisitos:
|
|
- Minimo 16 caracteres
|
|
- Al menos 1 mayuscula
|
|
- Al menos 1 minuscula
|
|
- Al menos 1 numero
|
|
- Al menos 1 simbolo
|
|
- NO usar: `@`, `/`, `\`, `"`
|
|
|
|
---
|
|
|
|
### Problema 4: Terraform State Lock
|
|
|
|
**Sintoma:** `Error acquiring the state lock: ConditionalCheckFailedException`
|
|
|
|
**Solucion:**
|
|
```bash
|
|
# Verificar si hay un lock activo
|
|
aws dynamodb get-item \
|
|
--table-name sacc4-terraform-locks-test-668889063715 \
|
|
--key '{"LockID":{"S":"sacc4-test/infrastructure/terraform.tfstate-md5"}}' \
|
|
--region mx-central-1
|
|
|
|
# Si el proceso anterior se murio, forzar unlock
|
|
terraform force-unlock <LOCK_ID>
|
|
```
|
|
|
|
⚠️ **Advertencia:** Solo usar `force-unlock` si estas SEGURO de que no hay otro proceso ejecutando Terraform.
|
|
|
|
---
|
|
|
|
### Problema 5: Bitbucket Pipeline Falla
|
|
|
|
**Sintoma:** Pipeline falla en paso "Apply Terraform" o "Deploy Application"
|
|
|
|
**Solucion:**
|
|
|
|
1. **Verificar credenciales AWS:**
|
|
```bash
|
|
# En tu local, verificar que las credenciales funcionan
|
|
aws sts get-caller-identity --profile test
|
|
```
|
|
|
|
2. **Verificar variables en Bitbucket:**
|
|
- Ir a Repository Settings -> Repository variables
|
|
- Confirmar que `TEST_AWS_ACCESS_KEY_ID` y `TEST_AWS_SECRET_ACCESS_KEY` estan correctas
|
|
- Confirmar que estan marcadas como "Secured"
|
|
|
|
3. **Verificar workspace de Terraform:**
|
|
```bash
|
|
# El pipeline debe seleccionar el workspace test
|
|
terraform workspace select test
|
|
```
|
|
|
|
4. **Verificar archivo terraform.tfvars:**
|
|
- Confirmar que existe en `iac-duplicate/terraform/environments/test/terraform.tfvars`
|
|
- Confirmar que tiene todos los valores requeridos
|
|
|
|
5. **Verificar IP en Security Group:**
|
|
- Si el pipeline no puede conectar por SSH, verificar que la IP del runner de Bitbucket esta permitida
|
|
|
|
---
|
|
|
|
### Problema 6: Bucket S3 Ya Existe
|
|
|
|
**Sintoma:** `Error creating S3 bucket: BucketAlreadyExists`
|
|
|
|
**Solucion:**
|
|
Los nombres de bucket S3 son unicos GLOBALMENTE en AWS. Cambiar el nombre:
|
|
|
|
```hcl
|
|
# terraform.tfvars
|
|
frontend_bucket_name = "sacc4-frontend-test-668889063715-$(date +%s)"
|
|
```
|
|
|
|
O usar un nombre diferente:
|
|
```hcl
|
|
frontend_bucket_name = "mi-empresa-sacc4-test-668889063715"
|
|
```
|
|
|
|
---
|
|
|
|
### Problema 7: RDS No Responde Desde EC2
|
|
|
|
**Sintoma:** La aplicacion no puede conectar a la base de datos.
|
|
|
|
**Solucion:**
|
|
```bash
|
|
# Verificar que RDS esta en estado "available"
|
|
aws rds describe-db-instances \
|
|
--region mx-central-1 \
|
|
--profile test \
|
|
--query 'DBInstances[*].DBInstanceStatus'
|
|
|
|
# Verificar Security Group de RDS permite trafico desde SG de EC2
|
|
aws ec2 describe-security-groups \
|
|
--region mx-central-1 \
|
|
--profile test \
|
|
--query 'SecurityGroups[*].[GroupName,IpPermissions]'
|
|
|
|
# Probar conexion desde EC2
|
|
ssh -i ~/.ssh/sacc4-test-key.pem ubuntu@[EC2_IP] \
|
|
"nc -zv [RDS_ENDPOINT] 3306"
|
|
```
|
|
|
|
---
|
|
|
|
## 6. Limpieza (Destruir Entorno)
|
|
|
|
⚠️ **ATENCION:** Esta accion es IRREVERSIBLE. Se destruiran TODOS los recursos del entorno TEST.
|
|
|
|
### 6.1 Metodo Seguro (Recomendado)
|
|
|
|
```bash
|
|
cd iac-duplicate/terraform/environments/test
|
|
|
|
# Verificar que estas en la cuenta correcta
|
|
aws sts get-caller-identity --profile test
|
|
# Confirmar: Account = 668889063715
|
|
|
|
# Crear backup de RDS (opcional pero recomendado)
|
|
aws rds create-db-snapshot \
|
|
--db-instance-identifier sacc4-test-db-prod \
|
|
--db-snapshot-identifier sacc4-test-final-$(date +%Y%m%d-%H%M%S) \
|
|
--region mx-central-1 \
|
|
--profile test
|
|
|
|
# Destruir infraestructura
|
|
terraform destroy -var-file="terraform.tfvars"
|
|
```
|
|
|
|
1. Terraform mostrara un plan de destruccion
|
|
2. Escribir **"yes"** para confirmar
|
|
3. El proceso toma **10-15 minutos**
|
|
|
|
### 6.2 Usar Script de Destruccion
|
|
|
|
Existe un script automatizado con confirmaciones adicionales:
|
|
|
|
```bash
|
|
cd iac-duplicate/scripts
|
|
./destroy-test-environment.sh
|
|
```
|
|
|
|
El script:
|
|
1. Pide confirmacion multiple (escribir "DESTRUIR" y luego "SI")
|
|
2. Crea snapshot final de RDS
|
|
3. Ejecuta `terraform destroy`
|
|
4. Opcionalmente elimina bucket de estado y tabla DynamoDB
|
|
|
|
### 6.3 Opciones del Script
|
|
|
|
```bash
|
|
# Omitir confirmaciones (USAR CON PRECAUCION)
|
|
./destroy-test-environment.sh --force
|
|
|
|
# Omitir backup de RDS
|
|
./destroy-test-environment.sh --skip-rds-backup
|
|
|
|
# Eliminar contenido de S3 antes de destruir
|
|
./destroy-test-environment.sh --delete-s3
|
|
|
|
# Conservar bucket de estado Terraform
|
|
./destroy-test-environment.sh --keep-state
|
|
```
|
|
|
|
### 6.4 Destruir desde Bitbucket
|
|
|
|
Tambien puedes destruir el entorno desde el pipeline:
|
|
|
|
1. Ir a **Bitbucket** -> **Pipelines** -> **Run pipeline**
|
|
2. Seleccionar branch **test**
|
|
3. Seleccionar pipeline **destroy-test**
|
|
4. Clic en **"Run"**
|
|
|
|
⚠️ **Advertencia:** Este pipeline destruira TODO el entorno de test sin pedir confirmacion adicional.
|
|
|
|
### 6.5 Verificar Destruccion Completa
|
|
|
|
```bash
|
|
# Verificar que no quedan instancias EC2
|
|
aws ec2 describe-instances --region mx-central-1 --profile test \
|
|
--filters "Name=instance-state-name,Values=running" \
|
|
--query 'Reservations[*].Instances[*].InstanceId'
|
|
# Salida esperada: null o lista vacia
|
|
|
|
# Verificar que no quedan instancias RDS
|
|
aws rds describe-db-instances --region mx-central-1 --profile test \
|
|
--query 'DBInstances[*].DBInstanceIdentifier'
|
|
# Salida esperada: null o lista vacia
|
|
|
|
# Verificar que no quedan distribuciones CloudFront activas
|
|
aws cloudfront list-distributions --profile test \
|
|
--query 'DistributionList.Items[?Status==`Deployed`].Id'
|
|
# Salida esperada: null o lista vacia
|
|
```
|
|
|
|
---
|
|
|
|
## Checklist Final
|
|
|
|
Antes de considerar el entorno como listo, verifica:
|
|
|
|
- [ ] Las 4 variables obligatorias estan completadas en `terraform.tfvars`
|
|
- [ ] `ssh_allowed_cidrs` con tu IP actual
|
|
- [ ] `rds_master_password` con 16+ caracteres seguros
|
|
- [ ] `thoth_public_key` con tu llave publica
|
|
- [ ] `osiris_public_key` con tu llave publica
|
|
- [ ] Certificado ACM creado y validado en us-east-1 (o dejado vacio)
|
|
- [ ] Backend S3 y DynamoDB creados
|
|
- [ ] `terraform validate` pasa sin errores
|
|
- [ ] `terraform plan` muestra solo recursos a CREAR (ninguno a destruir)
|
|
- [ ] Variables de Bitbucket configuradas
|
|
- [ ] Pipeline ejecutado exitosamente
|
|
- [ ] Health checks pasan (puertos 8080-8085)
|
|
- [ ] DNS resuelve correctamente (`dev-sacc.ccsoft.mx`)
|
|
- [ ] Conexion a RDS funciona desde EC2
|
|
- [ ] Scheduling configurado (ahorro de costos)
|
|
|
|
---
|
|
|
|
## Referencias Rapidas
|
|
|
|
| Recurso | Valor / Comando |
|
|
|---------|-----------------|
|
|
| Cuenta TEST | `668889063715` |
|
|
| Cuenta PROD | `523761210517` |
|
|
| Region | `mx-central-1` |
|
|
| Dominio TEST | `dev-sacc.ccsoft.mx` |
|
|
| API TEST | `api.dev-sacc.ccsoft.mx` |
|
|
| Pipeline | Rama `test` -> deploy automatico |
|
|
| Destruir | `./scripts/destroy-test-environment.sh` |
|
|
| Logs Terraform | `terraform output -json > outputs.json` |
|
|
|
|
---
|
|
|
|
*Documento generado para proyectosacc - SACC v4*
|
|
*NO modificar archivos existentes sin revision*
|