Hermes
461942014900Descripción
Cuenta AWS de campañas de fidelización Hermes. ~20 servicios App Runner independientes con RDS consolidadas. Región eu-west-1.
Contexto
| Campo | Valor |
|---|---|
| Cuenta AWS | 461942014900 (hermes) |
| Región | eu-west-1 |
| Proyecto | Hermes — campañas de fidelización multi-cliente |
| Cómputo | AWS App Runner (21 servicios) |
| Base de datos | Amazon RDS PostgreSQL — 7 instancias (3 consolidadas + 4 individuales) |
| Repositorio | Bitbucket (repositorio hermes) |
| ECR | 461942014900.dkr.ecr.eu-west-1.amazonaws.com/hermes |
Hermes es una plataforma Rails para campañas de fidelización. Cada cliente/campaña tiene su propio servicio App Runner (misma imagen Docker, distintas variables de entorno). Los crons se ejecutan en ECS Fargate via EventBridge.
Arquitectura
Inventario de servicios App Runner (producción)
| Servicio | URL App Runner | RDS (database) |
|---|---|---|
| hermes-turegalopelayo | wp9wxc26qr.eu-west-1.awsapprunner.com | group-one → hermes-turegalopelayo |
| hermes-regalosegurcaixaadeslas | 32f9aqf7mv.eu-west-1.awsapprunner.com | group-one → regalosegurcaixaadeslas |
| hermes-enegia-premios-pt | pu2brwpp3w.eu-west-1.awsapprunner.com | group-one → hermes-enegia-premios |
| hermes-directseguros-production | ykzjt8c3gb.eu-west-1.awsapprunner.com | individual → hermes-directseguros-pro |
| hermes-generico-pro | 6rsg3jcjqk.eu-west-1.awsapprunner.com | individual → hermes-generico-pro |
| hermes-flexirapid-pro | awemu3tmfd.eu-west-1.awsapprunner.com | individual → hermes-flexirapid-pro |
| hermes-porserdeasisa | deypbkye2m.eu-west-1.awsapprunner.com | individual → hermes-porserdeasisa-es |
| hermes-endesa-particulares | xqykifmdn7.eu-west-1.awsapprunner.com | group-two → endesa-particulares |
| hermes-cas004-production | 6dg3pt3ra3.eu-west-1.awsapprunner.com | group-two → hermes-cas004-production |
| hermes-accioncx-somosempresas | kg6jnik9gv.eu-west-1.awsapprunner.com | group-two → hermes-accioncx-somosempresas |
| hermes-labanquepostale | rqkqyd8e2q.eu-west-1.awsapprunner.com | group-two → hermes-monchoixcadeau-fr |
| hermes-premiosportutiempo | mtjn8q65v2.eu-west-1.awsapprunner.com | group-two → hermes-premiosportutiempo |
| hermes-retencion-regalosantalucia | vbe75fcvqh.eu-west-1.awsapprunner.com | group-two → hermes-regalosantalucia |
| hermes-sac-regalovivaz | pgtmartzgg.eu-west-1.awsapprunner.com | group-two → hermes-sac-regalovivaz |
| hermes-turegaloimq | ap2rbwmxec.eu-west-1.awsapprunner.com | group-two → hermes-turegaloimq |
| hermes-turegaloprima | wit397th2h.eu-west-1.awsapprunner.com | group-two → hermes-turegaloprima |
| hermes-turegalosecuritasdirect | dqmhqt3ijd.eu-west-1.awsapprunner.com | group-two → hermes-turegalosecuritasdirect |
| hermes-ofertasegurodirecto-pt | sh6p8tsfrm.eu-west-1.awsapprunner.com | group-two → ofertasegurodirecto-pt-aws |
Servicios develop
| Servicio | URL | RDS |
|---|---|---|
| hermes-develop-aws | skjfye8pbq.eu-west-1.awsapprunner.com | group-three → hermesdevelop |
| hermes-develop2-aws | gwcaeit9pg.eu-west-1.awsapprunner.com | group-three → hermesdevelop2 |
| hermes-develop-aws-actualizacion | 7sab6fdbbi.eu-west-1.awsapprunner.com | group-three → hermesdevelop_actualizacion |
Base de datos (RDS PostgreSQL)
Las bases de datos se han consolidado de 20 instancias individuales a 7 (3 consolidadas + 4 individuales grandes):
Instancias consolidadas
| Instancia | Clase | PG | Databases que contiene |
|---|---|---|---|
hermes-group-one | db.t4g.small | 17.4 | turegalopelayo, regalosegurcaixaadeslas, enegia-premios-pt |
hermes-group-two | db.t4g.small | 17.4 | accioncx-somosempresas, cas004, endesa-particulares, labanquepostale, ofertasegurodirecto-pt, premiosportutiempo, retencion-regalosantalucia, sac-regalovivaz, turegaloimq, turegaloprima, turegalosecuritasdirect |
hermes-group-three | db.t4g.micro | 17.4 | hermesdevelop, hermesdevelop2, hermesdevelop_actualizacion |
Instancias individuales (excluidas de consolidación por tamaño)
| Instancia | Clase | PG | Datos |
|---|---|---|---|
hermes-directseguros-pro | db.t4g.small | 17.9 | ~21.5 GB |
hermes-flexirapid-pro | db.t4g.small | 17.9 | ~11.2 GB |
hermes-generico-pro | db.t4g.small | 17.9 | ~8.9 GB |
hermes-porserdeasisa-es | db.t4g.micro | 17.9 | ~7.4 GB |
Infraestructura de red RDS
| Recurso | Valor |
|---|---|
| VPC | vpc-083a87f142d7e3965 (10.0.0.0/16) |
| Subnet Group | default-vpc-083a87f142d7e3965 |
| Security Group | sg-0dad34827a703542f |
| Puerto | 5432 |
| Acceso público | Sí (las consolidadas) |
| Master user | postgres (managed credentials en Secrets Manager para group-*) |
Credenciales de acceso a BD
Las credenciales de cada database están en Secrets Manager (apprunner-backup/hermes-*). Para conectar con DBeaver o psql:
# Ver credenciales de un servicio
aws secretsmanager get-secret-value \
--secret-id apprunner-backup/hermes-turegalopelayo \
--profile hermes --region eu-west-1 | jq -r .SecretString | jq .DATABASE_URL
Despliegue
El despliegue es automático por ECR: al pushear una imagen con un tag determinado al repositorio ECR hermes, los servicios App Runner que referencian ese tag se redespliegan automáticamente (regla AWSAppRunnerManagedRuleForECREvent).
Tags de imagen por entorno
Cada servicio App Runner está configurado para hacer auto-deploy al detectar un push del tag que tiene configurado. Los tags principales son:
latest/production— servicios de producciónpre-update-stable— servicios en proceso de actualizaciónpruebas_juan_sftp— develop/pruebas
Proceso de deploy (típico)
# 1. Login en ECR
aws ecr get-login-password --profile hermes --region eu-west-1 | \
docker login --username AWS --password-stdin 461942014900.dkr.ecr.eu-west-1.amazonaws.com
# 2. Build de la imagen
docker build -t hermes .
# 3. Tag y push (esto dispara el auto-deploy)
docker tag hermes:latest 461942014900.dkr.ecr.eu-west-1.amazonaws.com/hermes:<tag>
docker push 461942014900.dkr.ecr.eu-west-1.amazonaws.com/hermes:<tag>
Forzar redeploy sin cambiar imagen
aws apprunner start-deployment \
--service-arn arn:aws:apprunner:eu-west-1:461942014900:service/<nombre>/<id> \
--profile hermes --region eu-west-1
Pausar / Reanudar un servicio
# Pausar (deja de servir tráfico, ahorra costes)
aws apprunner pause-service \
--service-arn <arn> --profile hermes --region eu-west-1
# Reanudar
aws apprunner resume-service \
--service-arn <arn> --profile hermes --region eu-west-1
Ver logs de un servicio
aws logs tail /aws/apprunner/hermes-directseguros-production/application \
--since 1h --profile hermes --region eu-west-1 --follow
Variables de entorno
Las variables de entorno viven directamente en la configuración de App Runner (no en Secrets Manager como el ERP). Hay un backup de cada servicio en Secrets Manager (apprunner-backup/hermes-*) que se usa como fuente de verdad para restaurar o consultar.
Consultar variables actuales
# Desde el backup en Secrets Manager
aws secretsmanager get-secret-value \
--secret-id apprunner-backup/hermes-turegalopelayo \
--profile hermes --region eu-west-1 | jq -r .SecretString | jq .
Modificar una variable de entorno
Al cambiar una variable en App Runner, el servicio se redespliega automáticamente (~2-3 min):
# Vía consola: App Runner → servicio → Configuration → Environment variables
# Vía CLI (requiere pasar toda la configuración):
aws apprunner update-service \
--service-arn <arn> \
--source-configuration '{...}' \
--profile hermes --region eu-west-1
Después de modificar variables en App Runner, actualizar también el backup en Secrets Manager para mantenerlo sincronizado:
aws secretsmanager put-secret-value \
--secret-id apprunner-backup/hermes-<servicio> \
--secret-string '{"DATABASE_URL":"...", "RAILS_ENV":"production", ...}' \
--profile hermes --region eu-west-1
Rol IAM para acceso a Secrets
Los servicios App Runner usan el rol hermes-apprunner-instance-role que permite leer los secrets de apprunner-backup/* mediante la política SecretsManagerReadAccess.
Tareas programadas (ECS + EventBridge)
Cada servicio de producción tiene un cluster ECS dedicado (hermes-<servicio>-jobs) donde se ejecutan tareas cron disparadas por EventBridge Rules.
Patrón de tareas comunes
| Regla (patrón) | Frecuencia | Comando |
|---|---|---|
hermes-*-common-tasks-daily-tasks | Diaria 21:00 UTC | rake common_tasks:daily_tasks |
hermes-*-notices-update_status | Cada 10-15 min | rake notices:update_status |
hermes-*-to-bigquery | Diaria 21:00 UTC | rake to_bigquery |
hermes-*-import-unsubscribe-and-merged-csv | Horaria/diaria | rake import:unsubscribe_and_merged_csv |
hermes-*-export-prenotice-csv | Diaria 21:00 UTC | rake export:prenotice_csv |
Ejecutar tarea manualmente
aws ecs run-task \
--cluster hermes-directseguros-production-jobs \
--task-definition hermes-directseguros-common-tasks-daily-tasks \
--launch-type FARGATE \
--network-configuration 'awsvpcConfiguration={subnets=[subnet-0c9a2fe43d413e259,subnet-0e77111b718b6723e],securityGroups=[sg-0dad34827a703542f],assignPublicIp=ENABLED}' \
--profile hermes --region eu-west-1
Deshabilitar un cron
aws events disable-rule \
--name hermes-directseguros-common-tasks-daily-tasks \
--profile hermes --region eu-west-1
Monitorización y alertas
Lambdas de monitorización
| Lambda | Qué hace |
|---|---|
hermes-bigquery-error-monitor | Revisa tareas ECS fallidas y errores BigQuery, envía reporte diario (08:00 UTC) |
apprunner-monitor | Vigila estado de los servicios App Runner |
hermes-image-tag-monitor | Detecta cambios de tags en ECR → alerta SNS |
Alertas EventBridge
| Regla | Disparo |
|---|---|
hermes-ecs-task-failure-alert | Cualquier tarea ECS que falla → alerta inmediata |
hermes-task-definition-changes | Cambios en task definitions |
hermes-eventbridge-target-changes | Cambios en targets de EventBridge |
hermes-bigquery-daily-report | Reporte diario 08:00 UTC |
SNS Topics
AppRunnerErrors— errores de App Runnerhermes-image-tag-change-alerts— cambios de tags ECR
Observabilidad (Grafana)
Dashboards en: https://grafana.dekupleapp.com
Acceso con cuenta Google (@dekuple.es).
Folder Hermes-logs
| Dashboard | Qué muestra |
|---|---|
| Hermes - ECS Scheduled Jobs | Estado de tareas cron ECS |
| Hermes - RDS PostgreSQL | Métricas RDS (CPU, conexiones, storage) |
| Hermes - Anomalía de entregas | Detección de anomalías en entregas |
| Hermes - Detalle y Seguimiento de Entregas | Trazabilidad de entregas |
| Logs - hermes-* | Logs de aplicación de cada servicio App Runner |
Sentry
Excepciones Rails se envían a Sentry. DSN configurado por servicio en la variable SENTRY_DSN.
Networking
WAF (Web Application Firewall)
Todos los servicios App Runner (21/21, producción y develop) están protegidos por la WebACL hermes-apprunner-waf.
Reglas activas
| Prioridad | Regla | Acción | Descripción |
|---|---|---|---|
| 0 | Allow-CloudFront-IPs | Allow | Permite tráfico desde IPs de CloudFront |
| 1 | AWSManagedRulesCommonRuleSet | Count/Block | Reglas comunes AWS (excluidas: SizeRestrictions_BODY, CrossSiteScripting_BODY) |
| 2 | AWSManagedRulesKnownBadInputsRuleSet | Count/Block | Inputs maliciosos conocidos |
| 3 | GeoBlockNonEurope | Block | Bloquea tráfico fuera de Europa (UE + UK + Balkanes + Cáucaso) |
El único servicio que no tenía WAF era
hermes-generico-pro, asociado el 2026-06-15.
Default action
Allow — si no matchea ninguna regla, se permite.
Servicio no protegido
Si se crea un nuevo servicio App Runner, hay que asociarlo manualmente al WAF:
aws wafv2 associate-web-acl \
--web-acl-arn arn:aws:wafv2:eu-west-1:461942014900:regional/webacl/hermes-apprunner-waf/26e8c990-c08d-4d56-9c3e-356d7ed118e6 \
--resource-arn arn:aws:apprunner:eu-west-1:461942014900:service/<nombre>/<id> \
--profile hermes --region eu-west-1
| Recurso | Valor |
|---|---|
| VPC | vpc-083a87f142d7e3965 (10.0.0.0/16) — hermes-network |
| Subnets | subnet-0c9a2fe43d413e259 (eu-west-1a), subnet-0e77111b718b6723e (eu-west-1b) |
| SG PostgreSQL | sg-0dad34827a703542f |
| SG HTTP/HTTPS | sg-0e243af717a1146aa |
Los servicios App Runner usan un VPC Connector para acceder a las RDS dentro de la VPC. Las tareas ECS Fargate corren con assignPublicIp=ENABLED para acceder a APIs externas.
ECR
| Repositorio | URI | Tags principales |
|---|---|---|
hermes | 461942014900.dkr.ecr.eu-west-1.amazonaws.com/hermes | latest, pre-update-stable, tags por rama |
El push de un tag dispara automáticamente el redeploy de los servicios App Runner que lo referencian (AWSAppRunnerManagedRuleForECREvent).
Notas operativas
- 1 imagen, N servicios: todos los servicios App Runner usan la misma imagen Docker del repo
hermes, diferenciados solo por variables de entorno (DATABASE_URL, HOSTNAME, SUBDOMAIN, etc.). - Consolidación RDS completada: se pasó de 20 instancias individuales a 7 (ahorro ~$187/mes). Ver Plan de consolidación RDS para detalles de la migración.
- Variables en Secrets Manager (
apprunner-backup/hermes-*): son backups de las variables de App Runner. La fuente de verdad es la config de App Runner, pero se mantienen sincronizados para restauración y consulta. - Auto-scaling: todos los servicios usan la configuración
hermes-max-3-instances(min 1, max 3). - Servicios paused: si un servicio está en
PAUSED, no se puede hacerupdate-service; hay que hacerresume-serviceprimero.