Ledger
449063140533Descripción
Ledger (adlperformance-es/ledger) — microservicio Rails API GraphQL (libro mayor de saldos) sobre ECS Fargate en la cuenta axa021.
Ledger — AWS (cuenta axa021)
Microservicio ledger (libro mayor contable de doble entrada / saldos de fidelización de AXA) migrado de Heroku a AWS ECS Fargate. Ya operativo con tráfico real (gift-sender / bemus consumiendo saldos); Heroku (ledger-axa-pro) queda como fallback unos días.
Manual de usuario: ISO-164 · Despliegue/migración: SYSOPS-1058.
Contexto
| Campo | Valor |
|---|---|
| Cuenta AWS | 449063140533 (axa021) |
| Región | eu-west-1 |
| Perfil SSO | axa021 (aws sso login --profile axa021) |
| Proyecto | Ledger — adlperformance-es/ledger (Ruby 3.2.5 / Rails 7.1.4, API-only) |
| Tipo | API GraphQL (POST /graphql, auth HTTP Basic), health GET /up. Sin worker |
| Cómputo | AWS ECS Fargate Spot |
| Base de datos | RDS PostgreSQL externa axa-production.dekuple.es (BD ledger_production / ledger_stg) |
| Repositorio | git@bitbucket.org:adlperformance-es/ledger.git |
| Endpoints | https://ledger.dekupleapp.com/graphql (pro) · https://ledger-stg.dekupleapp.com/graphql (stg) |
Ledger es un microservicio API-only GraphQL (única ruta POST /graphql). No tiene worker ni assets. Exporta tablas a BigQuery vía un cron diario. Es más simple que ERP/Moneta.
Arquitectura
Inventario de recursos
| Recurso | Valor |
|---|---|
| Cluster pro / stg | ledger-pro / ledger-stg |
| Servicio web | ledger-pro-web-service (Fargate Spot, autoescalado min 1 / max 3, CPU 70%) |
| Task def web | ledger-pro-web |
| Task def jobs | ledger-pro-jobs (base para el cron BigQuery) |
| Task def migraciones | ledger-pro-migrate |
| RDS (BD) | externa axa-production.dekuple.es — BD ledger_production / ledger_stg |
| ALB | axa021-gift-sender-stg-alb (compartido, regla host-based) |
| ECR | repositorio ledger |
| CodeBuild | proyecto ledger-build |
| Secrets Manager | ledger/{entorno}/rails-env, ledger/pro/google-cloud-credentials |
| Lambda redeploy | ledger-secrets-redeploy (regla EventBridge ledger-secrets-changed) |
| Subnets de despliegue | subnet-0feb8e23225c46265, subnet-0ac52bd4ab80a266f |
| Security Group tareas | sg-0f5cbcb688d2dbb15 (assignPublicIp=ENABLED) |
Despliegue (CodeBuild)
Despliegue manual y guiado desde el repo de ledger:
cd /path/to/ledger
./bin/aws-codebuild.sh
Pregunta rama y entornos (pro, stg). Lanza CodeBuild ledger-build: build Docker → push ECR → migración → update-service del servicio web (rolling). ~5-8 min/entorno. Seguimiento en consola CodeBuild → ledger-build.
Variables de entorno (Secrets Manager)
En ledger/{entorno}/rails-env (JSON), inyectadas como secrets[] en la task def.
aws secretsmanager get-secret-value --secret-id ledger/pro/rails-env \
--profile axa021 --region eu-west-1 | jq -r .SecretString | jq .
Auto-redeploy: al hacer PutSecretValue/UpdateSecret sobre un secret ledger/*, la regla EventBridge ledger-secrets-changed dispara el Lambda ledger-secrets-redeploy, que fuerza un nuevo deployment del servicio web del entorno (ledger/pro/rails-env → ledger-pro-web-service; ledger/stg/rails-env → ledger-stg-web-service).
rails-envGOOGLE_CLOUD_CREDENTIALS (JSON multilínea) rompe el build. Vive en su propio secret ledger/pro/google-cloud-credentials (solo lo usa el cron).
Lanzar tareas puntuales (one-off)
aws ecs run-task --profile axa021 --region eu-west-1 \
--cluster ledger-pro --task-definition ledger-pro-web \
--launch-type FARGATE \
--network-configuration 'awsvpcConfiguration={subnets=[subnet-0feb8e23225c46265,subnet-0ac52bd4ab80a266f],securityGroups=[sg-0f5cbcb688d2dbb15],assignPublicIp=ENABLED}' \
--overrides '{"containerOverrides":[{"name":"ledger-pro-web","command":["bundle","exec","rails","runner","puts ApiUser.count"]}]}'
Logs en CloudWatch: /ecs/ledger-pro-web.
Tareas programadas (Scheduler)
| Schedule | Hora (UTC) | Comando |
|---|---|---|
ledger-pro-cron-to-bigquery-0130 | 01:30 | bundle exec rake to_bigquery:all (sobre la task ledger-pro-jobs) |
Particularidades de ledger
- Cómputo en Fargate Spot; autoescalado 1–3 tareas (CPU objetivo 70%).
- Apagado programado 22:00–07:00 (Europe/Madrid): el servicio web no responde en esa franja.
- Sin worker (no hay delayed_job/Sidekiq) y sin assets (API pura).
- New Relic eliminado en la migración; observabilidad vía CloudWatch.
Observabilidad (CloudWatch)
- Logs:
/ecs/ledger-pro-web,/ecs/ledger-stg-web,/ecs/ledger-pro-jobs. - Alarmas:
ledger-pro-no-healthy-hostsyledger-stg-no-healthy-hosts→ email vía SNS (ledger-alarms). - No hay Grafana/Sentry/WAF dedicados.