Moneta
935538483843Descripción
Moneta (adlperformance-es/moneta) — app Rails web multi-tenant + worker, sobre ECS Fargate en la cuenta interna (DKP001).
Moneta — AWS (cuenta interna / DKP001)
La infraestructura de producción en AWS está creada y validada en paralelo (servicio web ×2 healthy, BD verificada), pero el tráfico real sigue en Heroku (moneta-dekuple-pro). El servicio worker está a 0 y el cron DISABLED a propósito, porque la BD moneta-pro la comparte el Heroku productivo (no duplicar jobs/cron hasta el cutover). Los 7 dominios todavía apuntan a Heroku.
Seguimiento del cutover: SYSOPS-1059. Manual de usuario: ISO-165.
Contexto
| Campo | Valor |
|---|---|
| Cuenta AWS | 935538483843 (DKP001 / interna) |
| Región | eu-west-1 |
| Proyecto | Moneta — adlperformance-es/moneta (Ruby on Rails 3.3.1) |
| Tipo | App web multi-tenant (diferenciada por Host), panel + portales de cliente |
| Cómputo | AWS ECS Fargate on-demand, 24/7 (sin apagado nocturno) |
| Base de datos | RDS PostgreSQL dekuple-interna (BD moneta-pro) |
| Puerto / health | 8080 / GET /up |
| Repositorio | git@bitbucket.org:adlperformance-es/moneta.git |
Moneta es una aplicación Rails web completa multi-tenant: el mismo código sirve a varios dominios de cliente diferenciados por el Host. El procesamiento en segundo plano usa delayed_job (servicio worker) y las tareas programadas corren en EventBridge Scheduler.
Arquitectura
Inventario de recursos
Clusters y servicios (producción)
| Recurso | Valor |
|---|---|
| Cluster pro / stg | moneta-pro / moneta-stg |
| Servicio web | moneta-pro-web-service (2 tareas; autoescalado min 2 / max 4, CPU 70%) |
| Servicio worker | moneta-pro-worker-service (desired 0 hasta el cutover) |
| Task def web | moneta-pro-web (1 vCPU / 2 GB, cmd puma) |
| Task def worker | moneta-pro-worker (0.5 vCPU / 1 GB, rake delayed:work) |
| Task def jobs | moneta-pro-jobs (0.5 vCPU / 1 GB, base para crons) |
| Task def migraciones | moneta-pro-migrate (la registra el buildspec en el deploy) |
Las task definitions siguen el patrón
moneta-{entorno}-{web|worker|migrate|jobs}(entornospro,stg).
Otros recursos
| Recurso | Nombre / ID |
|---|---|
| RDS (BD) | dekuple-interna.civxxbqigp3d.eu-west-1.rds.amazonaws.com — PostgreSQL 16, BD moneta-pro (compartida con Heroku hasta el cutover) |
| ALB | erp-alb (compartido; regla host-based → target group moneta-pro-web-tg) |
| Target group | moneta-pro-web-tg (HTTP 8080, health /up, matcher 200-399) |
| ECR | repositorio moneta |
| CodeBuild | proyecto moneta-build |
| Secrets Manager | moneta-pro-env / moneta-stg-env (variables), moneta-{entorno}-google-cloud-credentials (JSON SA, aparte) |
| Lambda redeploy | moneta-secrets-redeploy (regla EventBridge moneta-secrets-changed) |
| Subnets de despliegue | subnet-0c2c4062be3739d25, subnet-0dcf38f41ba7f9465 |
| Security Group tareas | sg-04cb848ad3fdacdc2 |
| Salida a internet | IP pública efímera (assignPublicIp=ENABLED). Los clientes que exigen IP fija entran por el proxy nginx 52.211.241.208 |
Despliegue (CodeBuild)
Despliegue manual y guiado desde el repo de moneta. No hay CI/CD automático por push.
cd /path/to/moneta
./bin/aws-codebuild.sh
Qué hace: (1) valida la cuenta AWS (935538483843); (2) menú de rama; (3) menú de entornos (pro, stg); (4) por entorno lanza aws codebuild start-build del proyecto moneta-build. El build (buildspec.yml): build Docker buildx (con cache de registro) → push ECR → registra task defs web/worker/migrate/jobs → migración one-shot (espera exit 0) → update-service de web y worker (rolling).
Seguimiento: consola CodeBuild → moneta-build → build history (~7 min/entorno).
Variables de entorno (Secrets Manager)
Las variables viven en moneta-pro-env / moneta-stg-env (JSON), inyectadas como secrets[] en las task definitions.
# Ver
aws secretsmanager get-secret-value --secret-id moneta-pro-env \
--profile interna --region eu-west-1 | jq -r .SecretString | jq .
# Actualizar (PUT con el JSON completo)
aws secretsmanager put-secret-value --secret-id moneta-pro-env \
--secret-string '{"CLAVE":"valor", ...}' --profile interna --region eu-west-1
Auto-redeploy: al hacer PutSecretValue/UpdateSecret sobre un secret moneta-*, la regla EventBridge moneta-secrets-changed dispara el Lambda moneta-secrets-redeploy, que ejecuta forceNewDeployment en los servicios web y worker del entorno (~2-3 min, sin downtime).
| Secret modificado | Servicios que se redespliegan |
|---|---|
moneta-pro-env | moneta-pro-web-service + moneta-pro-worker-service |
moneta-stg-env | moneta-stg-web-service + moneta-stg-worker-service |
*-envLa credencial GOOGLE_CLOUD_CREDENTIALS (JSON multilínea) rompe el build si va en moneta-{env}-env. Vive en su propio secret moneta-{env}-google-cloud-credentials.
- Primero quitar la referencia de la task definition (nueva revisión sin esa clave en
secrets[]). - Después borrar la clave del JSON del secret.
Al revés, las tareas nuevas fallan con
ResourceInitializationError.
Lanzar tareas puntuales (one-off)
aws ecs run-task --profile interna --region eu-west-1 \
--cluster moneta-pro --task-definition moneta-pro-web \
--launch-type FARGATE \
--network-configuration 'awsvpcConfiguration={subnets=[subnet-0c2c4062be3739d25,subnet-0dcf38f41ba7f9465],securityGroups=[sg-04cb848ad3fdacdc2],assignPublicIp=ENABLED}' \
--overrides '{"containerOverrides":[{"name":"moneta-pro-web","command":["bundle","exec","rails","runner","puts User.count"]}]}'
Logs en CloudWatch: /ecs/moneta-pro-web.
Tareas programadas (Scheduler)
Cron con EventBridge Scheduler (grupo moneta-pro-cron), que dispara un RunTask con la task def moneta-pro-jobs sobreescribiendo el comando. Logs en /ecs/moneta-pro-jobs.
| Schedule | Comando | Estado |
|---|---|---|
moneta-pro-cron (export BigQuery) | bundle exec rake to_bigquery:all | DISABLED (frecuencia por confirmar; se habilita en el cutover) |
Observabilidad
Grafana
Dashboards en kuma (Grafana), carpeta MONETA:
| Dashboard | Qué muestra |
|---|---|
ALB - moneta-pro | Requests, latencias, códigos HTTP del target group moneta-pro-web-tg |
Logs - moneta-pro-web | Logs de aplicación (web) |
Logs - moneta-pro-worker | Logs del worker (delayed_job) |
Logs - moneta-pro-jobs | Logs de tareas cron |
CloudWatch
- Logs:
/ecs/moneta-pro-web,/ecs/moneta-pro-worker,/ecs/moneta-pro-jobs(+/ecs/moneta-stg-*). - Alarma
moneta-pro-no-healthy-hosts(HealthyHostCount < 1) → SNSmoneta-alarms(email).
Dominios (multi-tenant)
Producción (7 dominios, aún en Heroku hasta el cutover): moneta.dekuple.es, admin.moneta.dekuple.es, cupones.moneta.dekuple.es, huchadigital.directseguros.es, endesapt.dekuple.es, www.miclubgaes.com, www.beneficiosmalvon.com. Staging (ya en erp-alb): stg.moneta.dekuple.es, admin.stg.moneta.dekuple.es, monetastg.dekupleapp.com, etc.
Notas operativas
- Multi-tenant por Host: una sola base de código sirve a todos los dominios; el enrutado al servicio web se hace por regla host-header en
erp-alb. - Worker compartiendo cola con Heroku: hasta el cutover, el worker de Fargate está a 0 para no duplicar el procesamiento de
delayed_jobs(Heroku sigue procesando). - Salida IP fija: los dominios de cliente que exigen IP fija pasan por el proxy nginx
52.211.241.208(que haceproxy_pass); el cutover de esos dominios se hará cambiando elproxy_passHeroku →erp-alb.