Commit Graph

46 Commits

Author SHA1 Message Date
Evert Daniel Romero Garrido 720aac1e0d docs: documentación completa y diagramas de arquitectura
- Agregar DOCUMENTACION_CAMBIOS_COMPLETOS.md con todos los cambios realizados
- Crear diagrama-arquitectura-aws.excalidraw: Arquitectura completa AWS
- Crear diagrama-pipeline-cicd.excalidraw: Flujo CI/CD Bitbucket to AWS
- Crear diagrama-seguridad-acceso.excalidraw: Seguridad y métodos de acceso

Refs: Documentación Mayo 2026
2026-05-07 11:23:04 -06:00
Evert Daniel Romero Garrido aaa2c06c30 feat(terraform): Add lifecycle rules and import blocks for existing resources
Lifecycle Rules:
- Add prevent_destroy = true to all 32+ resources
- Add ignore_changes = [tags] to prevent tag drift from causing recreation
- Add ignore_changes = [tags, user_data, ami, iam_instance_profile] for EC2
- Preserve existing create_before_destroy for security groups and ACM

Import Blocks (orphaned resources):
- Lambda: sacc4-stop-instances
- Lambda: sacc4-start-instances
- EventBridge: sacc4-stop-instances-schedule
- EventBridge: sacc4-start-instances-schedule

Data Sources:
- aws_instances.existing_api (detect EC2 duplicates)
- aws_db_instance.existing (detect RDS duplicates)
- aws_nat_gateways.existing (detect NAT GW duplicates)
- aws_cloudfront_distribution.existing (detect CloudFront duplicates)

Variables:
- db_identifier: for RDS duplicate detection
- cloudfront_distribution_id: for CloudFront duplicate detection

Validation Results:
- terraform validate: PASSED
- terraform plan: 0 to add, 1 to change, 0 to destroy
- No resources marked for recreation

Orphan EIP detected:
- eipalloc-0bdf9c47a80885c7a (78.13.177.201) unattached
- Requires manual cleanup or investigation

Refs: AWS Resource Validation - May 2026
2026-05-07 11:12:24 -06:00
Evert Daniel Romero Garrido 557feb02e0 feat(terraform): agregar lifecycle prevent_destroy a recursos críticos
- VPC: prevent_destroy = true
- EC2: prevent_destroy + ignore_changes ami
- RDS: prevent_destroy = true
- S3 frontend/artifacts: prevent_destroy = true
- Prevenir destrucción accidental de infraestructura PROD
2026-05-07 11:09:55 -06:00
Evert Daniel Romero Garrido 41b2347a33 fix(backend): corregir nombre del bucket S3 de estado y usar use_lockfile
- Bucket correcto: ccsoft-proyectosacc-terraform-state-prod
- Eliminar dynamodb_table deprecado, usar use_lockfile
- Resolver error de region mx-central-1 con Terraform 1.15.2
2026-05-07 10:54:11 -06:00
Evert Daniel Romero Garrido d73d636177 Merge PR #3: SSH passphrase support and Terraform security improvements 2026-05-07 10:46:43 -06:00
Evert Daniel Romero Garrido 7e0c764f3f feat(terraform): agregar permisos sudo para thoth y mejorar seguridad
- Configurar permisos sudo completos para usuario thoth:
  * Editar /etc/sacc4/sacc4.env
  * Gestionar servicios api-sacc4-*.service
  * Editar archivos systemd
  * Control total de /opt/sacc4
- Eliminar acceso SSH abierto (0.0.0.0/0)
- Agregar soporte AWS Systems Manager Session Manager
- Actualizar llave SSH a sacc-prod-key-2026
- Preservar tags de scheduling (AutoStart/AutoStop) en EC2 y RDS
- Agregar variable allowed_ssh_cidrs para acceso de emergencia

BREAKING CHANGE: SSH restringido, usar Session Manager como acceso principal
2026-05-07 09:44:44 -06:00
Evert Daniel Romero Garrido 2e3627fb66 feat(pipeline): agregar soporte para llaves SSH con passphrase en DEV
Cambios:
- Actualizar pipeline DEV para usar ssh-agent + expect con passphrase
- Instalar 'expect' en steps que requieren SSH (01, 06, 07, 08)
- Agregar configuración de ssh-agent para desbloquear llave automáticamente
- Requiere nueva variable de Bitbucket: SSH_PASSPHRASE_THOTH
- Actualizar documentación de conexión con credenciales de BD
- Agregar script de validación de conexión EC2→RDS
- Agregar validación de cuenta AWS (solo recursos DEV)

Refs: Llaves SSH regeneradas con passphrase por seguridad
2026-04-27 13:26:12 -06:00
Evert Daniel Romero Garrido 15e499d970 ci: actualizar pipeline con nuevas variables SSH y IPs
- Reemplaza DEV_SSH_PRIVATE_KEY_THOTH_PROYECTOSACC por SSH_PRIVATE_KEY_THOTH
- Reemplaza PROD_SSH_PRIVATE_KEY_THOTH_PROYECTOSACC por SSH_PRIVATE_KEY_THOTH
- Reemplaza DEV_SERVER_IP_PROYECTOSACC por DEV_INSTANCE_IP
- Reemplaza PROD_SERVER_IP_PROYECTOSACC por PROD_INSTANCE_IP
- Elimina dependencia de base64 para llaves SSH (ahora texto plano)
- Agrega documentación de conexión en DATOS_CONEXION.md
- Incluye llaves SSH generadas en directorio keys/
2026-04-27 10:20:05 -06:00
Evert Daniel Romero Garrido defce6933d feat(pipeline): Add SSH key rotation, health checks, and manual approval
Security & Operations Improvements:
- Add step 06_update_ssh_keys to rotate authorized_keys on EC2
  before each deployment, ensuring only current pipeline can access
- Add step 09_health_check with retry logic (12 retries, 10s interval)
  verifying API backend (/actuator/health), CloudFront, and RDS
- Add manual approval (trigger: manual) for production deployment
  with terraform plan saved as artifact (prod.tfplan)
- Document terraform auto-approve policy: dev automatic, prod manual
- Use DEV_DB_HOST and PROD_DB_HOST variables for RDS connectivity checks
- Reorder steps: 7 steps → 9 steps standard CCsoft pipeline

Closes pipeline security gaps and adds post-deploy verification.
2026-04-20 17:47:15 -06:00
Evert Romero f32b58fc46 fix(pipeline): implementar manejo robusto de state locks de Terraform
Problema:
- El pipeline fallaba con 'Error acquiring the state lock' cuando un proceso
  anterior de Terraform no liberaba el lock correctamente
- Los locks bloqueados requerían intervención manual

Solución implementada:
1. Nuevo script scripts/terraform-lock-cleanup.sh:
   - Verifica locks existentes en DynamoDB antes de ejecutar Terraform
   - Calcula antigüedad del lock (default: 30 minutos)
   - Elimina locks bloqueados automáticamente
   - Espera si el lock es reciente (operación en curso legítima)

2. Nuevo step 02_pre_terraform_check:
   - Ejecuta antes del step 03_terraform
   - Instala AWS CLI y configura credenciales
   - Limpia locks bloqueados antes de iniciar Terraform

3. Agregado -lock-timeout=5m a comandos Terraform:
   - terraform plan -lock-timeout=5m
   - terraform apply -lock-timeout=5m
   - Permite esperar si hay una operación legítima en curso

4. Aplicado a ambas ramas:
   - developer: cleanup para entorno dev
   - master: cleanup para entorno prod

Beneficios:
- Pipeline más robusto y autónomo
- Menos intervención manual para locks bloqueados
- Mejor manejo de concurrencia entre pipelines
- Previene corrupción de estado por locks huérfanos

Refs: Build #64 falló por state lock en DynamoDB
2026-04-17 11:11:06 -06:00
Evert Romero b1c0be4ea6 fix(pipeline): instalar AWS CLI v2 en cada step que lo requiere
El pipeline fallaba porque cada step corre en un contenedor fresco
y AWS CLI instalado en el step 01 no persistía para los steps
subsecuentes.

Cambios:
- Agregar instalación de AWS CLI v2 en steps 03, 05, 06, 07
- Tanto para ramas developer como master
- Usar instalación oficial desde awscli.amazonaws.com

Fixes pipeline fallido: bash: aws: command not found
2026-04-17 10:53:21 -06:00
Evert Romero 87a43fec71 Merge developer into master: SSH key fixes, tfvars updates, security group fix 2026-04-16 17:52:27 -06:00
Evert Romero 89363827cd chore(terraform): update pipeline_public_key in dev and prod tfvars 2026-04-16 17:03:39 -06:00
Evert Romero 7ea909e854 fix(terraform): permitir SSH desde internet para pipeline Bitbucket 2026-04-16 16:23:51 -06:00
Evert Romero 0cc3e11701 fix(terraform): corregir sintaxis HCL en trust policy OIDC
ForAnyValue:StringEquals debe ir entre comillas dentro de
jsonencode() para que Terraform lo interprete correctamente.
Sin las comillas, terraform init/plan falla con:
Missing attribute separator.
2026-04-16 16:10:43 -06:00
Evert Daniel Romero Garrido 0c6e5be070 fix(terraform): corregir OIDC audience para Bitbucket Cloud 2026-04-16 22:03:42 +00:00
Evert Daniel Romero Garrido ef9fc66171 fix(terraform): corregir OIDC audience para Bitbucket Cloud
Bitbucket Cloud genera tokens JWT con audience fijo:
ari:cloud:bitbucket::workspace/465016f8-d6fb-4ecb-ba6f-2248e938942b

El archivo oidc-bitbucket.tf solo aceptaba sts.amazonaws.com,
lo que causaba InvalidIdentityToken en cada terraform apply.
Ahora el OIDC provider y el rol IAM aceptan ambos audiences
mediante ForAnyValue:StringEquals.
2026-04-16 22:03:30 +00:00
Evert Daniel Romero Garrido 2f4a563f9e fix(terraform): corregir OIDC audience para Bitbucket Cloud
Bitbucket Cloud genera tokens JWT con audience fijo:
ari:cloud:bitbucket::workspace/465016f8-d6fb-4ecb-ba6f-2248e938942b

El archivo oidc-bitbucket.tf solo aceptaba sts.amazonaws.com,
lo que causaba InvalidIdentityToken en cada terraform apply.
Ahora el OIDC provider y el rol IAM aceptan ambos audiences
mediante ForAnyValue:StringEquals.
2026-04-16 21:54:55 +00:00
Evert Daniel Romero Garrido 63ba5553db Edited with Bitbucket 2026-04-16 21:51:56 +00:00
Amelia (Dev Agent) 3597ba89e5 fix(pipeline): hacer pasos de build y deploy condicionales
El repositorio proyectosacc actualmente solo contiene infraestructura
(Terraform, scripts, nginx). El código de la aplicación se agregará
en el futuro. Este cambio hace que los pasos 04_build, 05_publish,
06_install y 07_deploy verifiquen la existencia de archivos de
aplicación antes de ejecutar npm/gradle/aws s3/ssh, evitando
fallos del pipeline cuando no hay código que compilar o desplegar.
2026-04-16 15:26:59 -06:00
Evert Daniel Romero Garrido 6652b66662 Merge developer into master: OIDC fixes and backend region validation 2026-04-16 14:00:19 -06:00
Evert Daniel Romero Garrido dd2f31ec2a fix(pipeline): corregir OIDC token handling y backend region validation
- Escribe BITBUCKET_STEP_OIDC_TOKEN a archivo temporal para evitar
  OSError: File name too long en el decoder JWT
- Python lee token via stdin en lugar de pasar JWT como filename
- Agrega skip_region_validation = true en backend.dev.hcl y backend.prod.hcl
  para compatibilidad con mx-central-1
2026-04-16 13:37:36 -06:00
Evert Daniel Romero Garrido b338e68852 fix: revert step-level oidc to simple true for parsing compatibility 2026-04-16 13:06:54 -06:00
Evert Daniel Romero Garrido 7f8f531172 fix: move oidc audiences to options and step level per Atlassian docs 2026-04-16 12:30:51 -06:00
Evert Daniel Romero Garrido 40552bb5c7 fix: corregir lectura del token OIDC en aws-oidc-setup.sh 2026-04-16 12:12:36 -06:00
Evert Daniel Romero Garrido 1ab595aa83 fix: corregir lectura del token OIDC en aws-oidc-setup.sh 2026-04-16 12:12:26 -06:00
Evert Daniel Romero Garrido 675c55275b fix: mover oidc audiences a definitions para corregir Incorrect token audience 2026-04-16 12:06:00 -06:00
Evert Daniel Romero Garrido c9c34a4328 fix: mover oidc audiences a definitions para corregir Incorrect token audience 2026-04-16 12:05:49 -06:00
Evert Daniel Romero Garrido 65cc3b576b debug(oidc): print decoded JWT payload to diagnose audience mismatch 2026-04-16 11:58:22 -06:00
Evert Daniel Romero Garrido 4791fdcae6 debug(oidc): print decoded JWT payload to diagnose audience mismatch 2026-04-16 11:58:19 -06:00
Evert Daniel Romero Garrido 18b436e582 fix(oidc): install AWS CLI v2 inside aws-oidc-setup.sh if missing 2026-04-16 11:42:54 -06:00
Evert Daniel Romero Garrido ec40b94795 fix(oidc): explicit STS assume-role for Terraform S3 backend compatibility
The previous script only exported AWS_WEB_IDENTITY_TOKEN_FILE and
AWS_ROLE_ARN, expecting AWS CLI/Terraform to pick them up automatically.
However, Terraform's S3 backend does not use these variables implicitly.

Now we explicitly call 'aws sts assume-role-with-web-identity',
parse the JSON response, and export the temporary credentials:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_SESSION_TOKEN

Also exports AWS_REGION for Terraform S3 backend compatibility.

Fixes pipeline failure in step 03_terraform with:
InvalidIdentityToken: Incorrect token audience
2026-04-16 11:20:59 -06:00
Evert Daniel Romero Garrido e21fddf41b fix(pipeline): remove obsolete 02_repo-config step cloning non-existent repos
Removes cloning of ccsoft1/ci-cd-commons and ccsoft1/ci-cd-saac4

from both developer and master branch pipelines. proyectosacc is now

self-contained with local scripts and terraform code.
2026-04-16 11:00:24 -06:00
Evert Daniel Romero Garrido 0be9efe1b3 fix(ci): install AWS CLI v2 manually on Ubuntu 24.04 2026-04-16 10:39:43 -06:00
Evert Daniel Romero Garrido ce22f776ff feat(dns): simplify PROD Route 53 by using prod-sacc.ccsoft.mx directly
Switch PROD DNS from cross-account Route 53 management to a delegated
subdomain in the PROD AWS account (523761210517).

Changes:
- prod.tfvars: domain_name changed to prod-sacc.ccsoft.mx
- provider.tf: removed aws.route53 cross-account provider
- main.tf: removed prod-specific Route 53 resources and data sources;
  cert_validation and main records now use default provider for all envs
- outputs.tf: removed indexed references to main_prod resource
2026-04-16 10:33:13 -06:00
Evert Daniel Romero Garrido b31323bb49 feat(pipeline): agrega approval gate manual para deploy a PROD - IT-240
- Agrega paso 06b_notify_approval para notificar por Telegram cuando el pipeline espera aprobación manual
- Configura 07_deploy con deployment: production y trigger: manual
- Actualiza mensaje final de Telegram para indicar que el deploy fue aprobado y completado
2026-04-15 16:26:40 -06:00
Evert Daniel Romero Garrido f8ee2a218e fix(telegram): corrige escape de caracteres MarkdownV2 usando python3 2026-04-15 16:17:24 -06:00
Evert Daniel Romero Garrido 0c0126f3de feat(pipeline): implementa notificaciones enriquecidas de Telegram para IT-238
- Crea scripts/telegram-pipeline-notify.sh con detalles de branch, commit, build y autor
- Actualiza bitbucket-pipelines.yml para usar notificaciones locales en todos los ambientes
- Corrige bug donde 01_image-setup referenciaba ci-cd-commons antes de clonarlo
- Usa formato MarkdownV2 para mensajes en Telegram
2026-04-15 16:07:54 -06:00
Evert Daniel Romero Garrido 3e215f866f docs(oidc): actualiza documentacion con valores reales de configuracion DEV/PROD 2026-04-15 13:51:45 -06:00
Evert Daniel Romero Garrido cbae04ab3f fix(oidc): reemplaza placeholder por UUID real del repo proyectosacc 2026-04-15 12:51:48 -06:00
Evert Daniel Romero Garrido 744c5d1413 feat(iam): implementa autenticación OIDC entre Bitbucket Pipelines y AWS
- Agrega aws_iam_openid_connect_provider y roles IAM para DEV/PROD
- Actualiza bitbucket-pipelines.yml para usar OIDC en steps 03, 05, 07
- Crea script helper scripts/aws-oidc-setup.sh
- Agrega provider tls en terraform/provider.tf
- Documenta el flujo completo en docs/14-oidc-bitbucket-aws.md

Elimina la dependencia de AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY
estáticos en el pipeline, permitiendo autenticación sin credenciales
de larga vida via AssumeRoleWithWebIdentity.

Refs: cuenta DEV 668889063715, PROD 523761210517
2026-04-15 12:50:31 -06:00
Evert Daniel Romero Garrido bc3ff913cf chore(terraform): actualiza provider AWS a >=5.94.0 para soporte mx-central-1 y configura password RDS dev 2026-04-15 12:43:37 -06:00
Evert Daniel Romero Garrido cbea3e932b feat(ci): integra Terraform en pipeline de Bitbucket Pipelines
- Agrega paso 03_terraform para DEV y PROD con init, plan y apply
- Crea backend.dev.hcl para configuración explícita de estado DEV
- Refactoriza Route53/ACM en main.tf para soportar PROD cross-account
  usando count condicional sin romper estado de DEV
- Descomenta provider aws.route53 en provider.tf
- Añade domain_name faltante en prod.tfvars y confirma dev.tfvars
- Corrige output route53_record para recursos con count
- Elimina errored.tfstate corrupto local
- Incluye permiso sts:AssumeRole en IAM policy para Route53 cross-account
2026-04-14 19:40:57 -06:00
Evert Daniel Romero Garrido 3fe8cb1391 chore(ci): fix S3 artifacts bucket references in install step and secure terraform tfvars
- Use DEV_S3_ARTIFACTS_BUCKET and PROD_S3_ARTIFACTS_BUCKET in 06_install
  instead of generic S3_ARTIFACTS_BUCKET to prevent cross-env reads
- Add terraform/environments/*.tfvars to .gitignore to prevent secret leaks
- Update prod backend state bucket name to proyectosacc-specific bucket
- Add CI/CD credential policy documentation
2026-04-14 16:01:30 -06:00
Evert Daniel Romero Garrido 2cdeee0b84 chore(ci): update pipeline to use env-prefixed S3 bucket variables
Aligns bitbucket-pipelines.yml with CCsoft CI/CD convention
<Env>_S3_FRONTEND_BUCKET and <Env>_S3_ARTIFACTS_BUCKET.
Branches already use master/developer.
2026-04-14 15:31:18 -06:00
Evert Daniel Romero Garrido 85297b12a2 Initial commit: Terraform infrastructure, pipelines, docs and scripts 2026-04-14 14:53:05 -06:00