Resumen
Este documento describe la arquitectura técnica del proyecto Pedido Sugerido para los tres Niveles definidos en la propuesta v2. Cada Nivel se presenta como un incremento sobre el anterior: el Nivel 1 establece la operación automatizada con un pipeline parametrizado por país, el Nivel 2 incorpora gestión formal del modelo (Feature Store, Model Registry, CI/CD) y el Nivel 3 cierra con automatización completa (retraining por drift, multi-modelo, gobernanza).
Los nombres de recursos AWS siguen el patrón verbose acordado en DOC-AF-03 (ej. aje-dev-ps-pipeline-codepipeline, aje-dev-ps-pipeline-sagemaker). La arquitectura completa al Nivel 3 se compone de ~45 recursos distintos orquestados como un solo sistema.
Decisiones técnicas transversales
Aplican a los tres Niveles. Documentadas acá para evitar repetición.
| Decisión | Valor adoptado | Razón |
|---|---|---|
| Región principal | us-east-2 (Ohio) |
Coincide con la cuenta aje-dev y los dominios SageMaker mlops-* ya existentes |
| Cuenta AWS | 832257724409 (aje-dev) hoy · cuentas separadas para qa/prod en futuro |
Aislamiento por ambiente |
| VPC | vpc-031ecad192b797a50 (VPC compartida AJE) |
Misma que usan los dominios mlops-mo, mlops-mo2, mlops-project-aje-mo |
| Network mode SageMaker | PublicInternetOnly |
Alineado con mlops-project-aje-mo. VpcOnly se considera para Nivel 3 si AJE lo requiere por compliance |
| Auth mode SageMaker Domain | IAM |
Más simple que IAM Identity Center para una primera fase. Migrable a IDC en handover si AJE lo solicita |
| Instance type Processing | ml.m5.4xlarge |
Heredado del modelo TEST México. Quota de cuenta: 4 instancias concurrentes (limita paralelismo) |
| Instance type Training (Nivel 2+) | ml.m5.2xlarge (propuesto) |
Más liviano para ALS; ajustar si la complejidad del modelo aumenta |
| Instance type Inference (Nivel 2+) | ml.m5.large (propuesto) |
Endpoint serverless en evaluación como alternativa |
| Storage encriptación | AES-256 (SSE-S3) por defecto | KMS-managed considerado en Nivel 3 si AJE lo requiere |
| Versionado S3 | Habilitado en buckets de inputs y outputs del pipeline | Mitiga riesgo de overwrite + permite rollback |
| Lifecycle S3 | 90 días (default, ajustable por bucket) | Equilibrio costo / retención. Configurable en DOC-AF-07 por requerimiento |
| CDK Synthesizer | DefaultStackSynthesizer con cdk-hnb659fds-* bootstrap roles |
Ya validado en producción. Usa los permisos del bootstrap, no el role SSO directo |
| CI/CD source | GitLab vía CodeConnections (aje-dev-ps-gitlab, AVAILABLE) |
Connection ya configurada y funcional |
| Schedule | EventBridge cron L-V, escalonado 10 min entre países (CR 10:00 UTC → PE 11:00 UTC) | Respeta quota AWS de 4 instancias concurrentes; evita falla por throttling |
Nivel 1 · Automatización · pipeline operativo
Objetivo: pipeline parametrizado por país que corre L-V sin intervención manual, con monitoreo operativo y código/datos versionados.
Diagrama de flujo · alto nivel
[ EventBridge × 7 ]
cron L-V escalonado
CR EC GT MX NI PA PE
│
▼
[ Lambda · aje-dev-ps-triggerfunction ]
recibe { code_country } y dispara el SM Pipeline
│
▼
┌──────────────────────────────────────┐
│ SageMaker Pipeline │
│ aje-dev-ps-pipeline-sagemaker │
│ │
│ ┌────────────┐ │
│ │ Limpieza │ ProcessingStep │
│ │ (Docker: │ image: processing │
│ │ processing)│ instance: ml.m5.4xl │
│ └─────┬──────┘ │
│ │ outputs CSV/parquet │
│ ▼ │
│ ┌────────────┐ │
│ │ Modelado │ ProcessingStep │
│ │ (Docker: │ image: spark │
│ │ spark) │ instance: ml.m5.4xl │
│ └─────┬──────┘ │
│ │ outputs modelo + top-N │
│ ▼ │
│ ┌────────────┐ │
│ │ Reglas │ ProcessingStep │
│ │ Negocio │ image: processing │
│ │ (Docker) │ instance: ml.m5.4xl │
│ └─────┬──────┘ │
│ │ output: recomendaciones │
└────────┼─────────────────────────────┘
│
▼
s3://aje-dev-analytics-artifacts-s3/ps-pipeline/<PAIS>/
─ ─ ─ Monitoreo cross-cutting ─ ─ ─
│
┌─────────────────┼──────────────────┐
▼ ▼ ▼
CloudWatch CloudWatch SNS Topic
Logs Dashboard aje-dev-ps-alert-topic
(cada step + 2 Alarms ↓
emite logs) (failed/stopped) suscripciones email
(definidas en DOC-AF-08)
Componentes Nivel 1 · tabla detallada
| # | Componente AWS | Nombre del recurso | Función |
|---|---|---|---|
| 1 | EventBridge Rule × 7 | aje-dev-ps-schedulerule-{CR/EC/GT/MX/NI/PA/PE}-eventbridge |
Cron L-V por país. Escalonado 10 min entre países |
| 2 | Lambda Function | aje-dev-ps-triggerfunction-lambda |
Recibe {code_country} del EventBridge y dispara sagemaker:StartPipelineExecution |
| 3 | IAM Role · Lambda | aje-dev-ps-lambdarole-iam |
Trust principal: lambda.amazonaws.com. Permite invocar SM Pipeline |
| 4 | SageMaker Pipeline | aje-dev-ps-pipeline-sagemaker |
Pipeline con 3 ProcessingSteps secuenciales |
| 5 | IAM Role · SageMaker exec | aje-dev-ps-sagemaker-executionrole-iam |
Trust principal: sagemaker.amazonaws.com. Adjuntas: AmazonSageMakerFullAccess + AmazonDynamoDBFullAccess + custom inline |
| 6 | ECR Repository × 2 | aje-dev-ps-processing · aje-dev-ps-spark |
Imágenes Docker. Versionado por tag (latest + SHA del commit) |
| 7 | DynamoDB Table | aje-dev-ps-configtable-dynamodb |
Configuración por país (partition key code_country). 7 items |
| 8 | S3 Bucket · inputs | aje-dev-analytics-artifacts-s3 (compartido con otros proyectos) |
Inputs del pipeline + outputs intermedios (ps-pipeline/<PAIS>/) |
| 9 | S3 Bucket · CodePipeline | aje-dev-ps-codepipelinebucket-s3 |
Artifacts del CI/CD del infra |
| 10 | CodePipeline | aje-dev-ps-pipeline-codepipeline |
4 stages: Source (GitLab) · DeployStack · Build · Deploy |
| 11 | CodeBuild × 3 | aje-dev-ps-deploystackproject-codebuild · buildproject-codebuild · deployproject-codebuild |
Deploy infra · Build Docker · Upsert SM Pipeline |
| 12 | CloudWatch Log Group | /aws/sagemaker/ProcessingJobs (implícito) + /aws/lambda/aje-dev-ps-triggerfunction-lambda |
Captura stdout/stderr de cada step |
| 13 | CloudWatch Alarm × 2 | aje-dev-ps-executionfailedalarm-cloudwatch · aje-dev-ps-executionstoppedalarm-cloudwatch |
Disparan SNS cuando hay fallo |
| 14 | CloudWatch Dashboard | aje-dev-ps-monitoringdashboard-cloudwatch |
Vista consolidada · ejecuciones por país · tendencias |
| 15 | SNS Topic | aje-dev-ps-alert-topic-sns |
Notificaciones de alarmas. Suscriptores en DOC-AF-08 |
| 16 | SageMaker Domain (opcional, ya existe) | aje-dev-ps-domain |
Studio access para el equipo de Tuxpas/AJE durante desarrollo |
Total componentes Nivel 1: 16
Nivel 2 · Gestión del modelo · trazabilidad y calidad
Objetivo: separar el flujo de entrenamiento (semanal) del de inferencia (diaria); registrar modelos con métricas en Model Registry; configurar Feature Store para features compartidas entre países; agregar CI/CD con gates de calidad.
Incremento sobre Nivel 1
────── NUEVOS componentes del Nivel 2 ──────
┌────────────────────────────────────────────┐
│ Pipeline de ENTRENAMIENTO (semanal) │
│ aje-dev-ps-trainpipeline-sagemaker │
│ │
│ Limpieza → ALS Train → Eval → Register │
│ │ │
└────────────────────────────┼───────────────┘
│
▼
┌──────────────────────────────────┐
│ Model Registry × 7 países │
│ aje-dev-ps-recmodel-EC-sagemaker │
│ aje-dev-ps-recmodel-MX-sagemaker │
│ ... (uno por país) │
│ │
│ Status: PendingApproval → │
│ Approved / Rejected │
└──────────────┬───────────────────┘
│ approval (Gate 3 humano)
▼
┌──────────────────────────────────┐
│ Pipeline de INFERENCIA (diario)│
│ aje-dev-ps-infpipeline-sagemaker│
│ │
│ Carga modelo → Inferencia → │
│ Reglas → Output │
└────────┬─────────────────────────┘
│
▼
Outputs (mismo que Nivel 1)
────── Feature Store ──────
┌──────────────────────────────────────────────┐
│ SageMaker Feature Store │
│ │
│ aje-dev-ps-cliente-features-featurestore │
│ - id_cliente, frecuencia, recencia, │
│ ticket_promedio, categoria_principal │
│ │
│ aje-dev-ps-producto-features-featurestore │
│ - cod_articulo_magic, popularidad, │
│ elasticidad, sustitutos │
└──────────────────────────────────────────────┘
────── CI/CD enriquecido ──────
┌──────────────────────────────────────────────┐
│ CodePipeline ya existente · stages nuevos: │
│ │
│ Build → Test → Staging → Approval → Prod │
│ ↑ │
│ Aprobación humana │
│ manual notificada por SNS │
└──────────────────────────────────────────────┘
────── Model Monitor ──────
┌──────────────────────────────────────────────┐
│ SageMaker Model Monitor │
│ │
│ Baseline · estadísticas del último │
│ entrenamiento aprobado │
│ │
│ Schedule diario · compara producción vs │
│ baseline (data drift) │
└──────────────────────────────────────────────┘
Componentes nuevos Nivel 2 · tabla
| # | Componente AWS | Nombre del recurso | Función |
|---|---|---|---|
| 17 | SageMaker Pipeline · train | aje-dev-ps-trainpipeline-sagemaker |
Pipeline semanal de entrenamiento |
| 18 | SageMaker Pipeline · inference | aje-dev-ps-infpipeline-sagemaker |
Pipeline diario de inferencia (reemplaza al pipeline-sagemaker de Nivel 1) |
| 19 | SageMaker Model Package Group × 7 | aje-dev-ps-recmodel-{EC/MX/PE/CR/GT/NI/PA}-sagemaker |
Registry por país. Versionado de modelos |
| 20 | SageMaker Feature Group × 2 | aje-dev-ps-cliente-features-featurestore · aje-dev-ps-producto-features-featurestore |
Features compartidas |
| 21 | SageMaker Model Monitor schedule | aje-dev-ps-datadrift-{pais}-monitor (uno por país) |
Detección de data drift diaria |
| 22 | S3 Bucket · features offline | aje-dev-ps-features-offline-s3 (propuesto) |
Storage offline de Feature Store (o reutilizar SageMaker default bucket) |
| 23 | EventBridge Rule · weekly train | aje-dev-ps-trainschedule-{pais}-eventbridge (opcional) |
Trigger semanal del pipeline de entrenamiento |
| 24 | IAM Role · train pipeline | aje-dev-ps-trainexecutionrole-iam (o reutilizar existente) |
Permisos adicionales para Feature Store + Model Registry |
| 25 | CloudWatch Alarm · drift | aje-dev-ps-datadriftalarm-{pais}-cloudwatch |
Dispara cuando Model Monitor detecta drift |
| 26 | CodeBuild · test stage (nuevo) | aje-dev-ps-testproject-codebuild |
Tests unitarios + integration tests antes del deploy |
| 27 | CodeBuild · staging stage (nuevo) | aje-dev-ps-stagingproject-codebuild |
Deploy a staging con validación |
| 28 | DynamoDB · model metrics | aje-dev-ps-modelmetrics-dynamodb |
Histórico de métricas por modelo registrado |
| 29 | CloudWatch Dashboard · model quality | aje-dev-ps-modelquality-dashboard-cloudwatch |
Dashboard de NDCG / Precision / Coverage por país |
Total nuevos Nivel 2: 13 → Total acumulado Nivel 2: 29 componentes
Nivel 3 · Automatización completa · replicable y autónomo
Objetivo: reentrenamiento automático cuando se detecta drift, multi-modelo por país con experimentos en grid, gobernanza completa (Model Cards + CloudTrail), e IaC final como plantilla replicable.
Incremento sobre Nivel 2
────── NUEVOS componentes del Nivel 3 ──────
┌────────────────────────────────────────────────┐
│ Retraining loop · automático por drift │
│ │
│ Model Monitor → Alarm → EventBridge → Lambda │
│ detecta drift activa trigger dispara │
│ │
│ ↓ │
│ │
│ Lambda invoca aje-dev-ps-trainpipeline- │
│ sagemaker en modo retraining │
│ │
│ ↓ │
│ │
│ Nuevo modelo registrado · pasa Gate 1 (regr.) │
│ + Gate 2 (métricas) · Gate 3 (humano si │
│ drift fue por concept) → deploy automático │
└────────────────────────────────────────────────┘
┌────────────────────────────────────────────────┐
│ Multi-modelo · SageMaker Experiments │
│ │
│ Grid de hiperparámetros ALS por país │
│ rank ∈ {10, 20, 50, 100} │
│ regParam ∈ {0.01, 0.1, 1.0} │
│ alpha ∈ {1, 10, 40} │
│ │
│ Selección automática por mejor NDCG@10 │
└────────────────────────────────────────────────┘
┌────────────────────────────────────────────────┐
│ Gobernanza │
│ │
│ Model Cards · metadata estandarizada por │
│ modelo (training data, métricas, owner, │
│ intended use, limitations) │
│ │
│ CloudTrail · trail dedicado del proyecto │
│ audit log: quién aprobó qué modelo, │
│ con qué datos, en qué momento │
└────────────────────────────────────────────────┘
┌────────────────────────────────────────────────┐
│ IaC final · CDK app completa │
│ │
│ aje-analytics-model-pedido-sugerido/infra/ │
│ ↳ Stack único parametrizable por stage │
│ y por country list │
│ │
│ → Replicable: nuevo modelo de AJE en días, │
│ no semanas │
└────────────────────────────────────────────────┘
Componentes nuevos Nivel 3 · tabla
| # | Componente AWS | Nombre del recurso | Función |
|---|---|---|---|
| 30 | Lambda · retrain trigger | aje-dev-ps-retraintrigger-lambda |
Recibe alarm de drift y dispara pipeline de retraining |
| 31 | EventBridge Rule · drift | aje-dev-ps-driftrule-{pais}-eventbridge (uno por país) |
Conecta CloudWatch alarm con Lambda de retrain |
| 32 | SageMaker Experiments | aje-dev-ps-recmodel-{pais}-experiment |
Tracks grid de hiperparámetros |
| 33 | SageMaker Model Cards | implícito en cada Model Package | Metadata estandarizada |
| 34 | CloudTrail · trail dedicado | aje-dev-ps-audittrail-cloudtrail |
Audit log del proyecto |
| 35 | S3 Bucket · CloudTrail logs | aje-dev-ps-audittrailbucket-s3 |
Storage del CloudTrail |
| 36 | DynamoDB · retrain history | aje-dev-ps-retrainhistory-dynamodb |
Histórico de retrains: trigger, modelo nuevo, aprobación |
| 37 | CloudWatch Alarm · concept drift | aje-dev-ps-conceptdriftalarm-{pais}-cloudwatch |
Métricas de calidad caen vs baseline aprobado |
| 38 | SNS Topic · governance | aje-dev-ps-governance-topic-sns |
Notificaciones de aprobación pendiente |
| 39 | IAM Role · retrain | aje-dev-ps-retrainrole-iam |
Trust: Lambda. Permisos: invocar pipeline + lectura Model Registry |
Total nuevos Nivel 3: 10 → Total acumulado Nivel 3: 39 componentes (más recursos auxiliares como log groups y bucket policies = ~45 recursos total)
Patrones recurrentes
Pattern 1 · Multi-país parametrizado
Todos los componentes que tienen versión por país siguen el mismo patrón:
- DynamoDB config table (
aje-dev-ps-configtable-dynamodb) con una fila porcode_country - Lambda recibe
{code_country}como event payload - SM Pipeline acepta
code_countrycomo parámetro - Outputs en S3 segregados por país:
s3://aje-dev-analytics-artifacts-s3/ps-pipeline/<PAIS>/ - En Nivel 2-3, Model Registry, Feature Store y experimentos también scoped por país
Pattern 2 · Gates de calidad en serie
En Nivel 2-3, los modelos pasan por tres gates antes de promoción a producción:
- Tests de regresión (automático) — schema, volumen, latencia, costo
- Métricas vs baseline (automático) — NDCG@10 > baseline + 0.01
- Aprobación humana (opcional según contexto) — analista de Athenea aprueba en consola SageMaker
Las reglas exactas se documentan en DOC-AF-04.
Pattern 3 · Observabilidad por capas
Cada Nivel agrega capa de observabilidad sobre el anterior:
- Nivel 1 · operacional (success/failure de pipeline) —
DOC-AF-08cataloga las alarmas - Nivel 2 · de modelo (data drift + métricas de calidad) — Model Monitor
- Nivel 3 · de gobernanza (audit trail con CloudTrail + Model Cards)
Decisiones técnicas anotadas
| Decisión | Opciones consideradas | Elección | Razón |
|---|---|---|---|
| Pipeline único multi-país vs N pipelines | A) un SM Pipeline parametrizado · B) 7 SM Pipelines independientes | A · uno parametrizado (propuesta) | Mantenibilidad. Cambio se propaga a los 7 países sin código duplicado. La parametrización vía DynamoDB ya está implementada |
| Train+Inference separados o unificados | A) un solo pipeline para todo · B) 2 pipelines distintos (Nivel 2) | B · separados (propuesta) | Cadencias distintas: training semanal (caro), inference diario (más liviano). Aislamiento de fallos. CI/CD independiente |
| Model Registry por país vs único compartido | A) un Model Package Group global · B) 7 model groups | B · uno por país | Aprobación y deploy independientes por país. Una falla en un país no bloquea otros. Coincide con la propuesta v2 |
| Feature Store online vs solo offline | A) solo offline · B) online + offline | A · solo offline (Nivel 2) | Las features se computan diariamente y se consumen en el pipeline de inferencia (no necesita serving online de baja latencia). Más barato. Se puede agregar online en futuras iteraciones |
| Endpoint persistente vs batch transform | A) endpoint persistente · B) batch transform diario | B · batch transform | La inferencia es diaria, no en tiempo real. Batch transform paga solo cuando corre. Endpoint persistente sería ~$200/mes extra sin uso |
| Drift detection con SageMaker Model Monitor vs custom | A) Model Monitor nativo · B) custom con Spark | A · Model Monitor | Producto AWS nativo. Genera reportes JSON estandar. Integración natural con CloudWatch alarms |
| Aprobación humana automatizable o requerida | A) automática si métricas pasan · B) siempre humana en Nivel 2 · C) humana solo en concept drift (Nivel 3) | C · humana solo en concept drift | Balance entre seguridad y velocidad. Reentrenos por data drift / preventivos no requieren aprobación si pasan gates 1+2. Concept drift sí merece revisión |
| CDK Synthesizer con bootstrap vs CliCredentials | A) DefaultStackSynthesizer · B) CliCredentialsStackSynthesizer | A · Default con bootstrap | Ya validado en producción. Más permisos pero menos fricción operativa. CliCredentials se exploró pero requiere muchos perms en el role del user |
| Naming verbose vs abreviado | A) dynamodb · B) ddb |
A · verbose (decisión de DOC-AF-03) | Coincide con stack ya desplegado. Menos ambigüedad al leer logs y referencias |
Próximos pasos
- Sesión 2 (Mié 20-may) · validar con AJE el diagrama de Nivel 1 (el menos cambiable) y aprobar conceptualmente los Niveles 2-3 (que se concretan en Touchpoints).
- Generar diagramas visuales (PNG + fuente draw.io) antes del cierre de la fase. La descripción ASCII de este documento queda como referencia de lectura, pero el entregable final es un PNG por Nivel.
- Touchpoint Nivel 2 (Lun 15-jun) · confirmar componentes propuestos del Nivel 2 (Feature Store schema, separación train/inference, gates de aprobación).
- Touchpoint Nivel 3 (Lun 6-jul) · confirmar mecánica multi-modelo y workflow de retraining con data observada de Niveles 1-2.