- 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
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
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.
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
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
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.
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.
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.
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.
- 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
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
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.
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
- 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
- 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
- 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
- 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
- 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
Aligns bitbucket-pipelines.yml with CCsoft CI/CD convention
<Env>_S3_FRONTEND_BUCKET and <Env>_S3_ARTIFACTS_BUCKET.
Branches already use master/developer.