🔒 Documento Confidencial — Revisión Técnica + Demo Plataforma

CIRO AI + Singularity Data Lake

Plataforma de Inteligencia de Datos para SAP — Arquitectura, Seguridad y Demo Interactivo

Presentación completa para Grupo Avícola Campestre. Incluye demo de la plataforma CIRO AI, visualizaciones dinámicas, conectores, seguridad, y comparación con Microsoft Fabric.

📅 Marzo 2026
🏢 Grupo Avícola Campestre
☁️ AWS us-east-1
📊 350M+ filas procesadas
350M+
Filas Procesadas en Data Lake
90
Tablas SAP en Glue Catalog
535 GB
Almacenados en S3 Iceberg
0
Servicios Expuestos Públicamente
🖥️

Infraestructura — Specs Reales de Producción

Datos reales de la infraestructura desplegada en AWS us-east-1 para Campestre

ELI5
🏗️
Las Máquinas que Hacen el Trabajo Pesado
Imagina que montas una fábrica para procesar datos. Necesitas camiones (EC2) para recoger los datos de SAP, una banda transportadora (Kafka) para moverlos rápido, robots (Spark) que los limpian y organizan, una bodega gigante (S3) para guardarlos, y un mostrador (Redshift) donde cualquiera puede consultarlos. Aquí te explicamos cada máquina, con sus especificaciones reales — como la ficha técnica de un carro.

🏭 EC2 Extractor — El Camión de Datos

🖥️
Singularity-Extractor
ID: i-0a3fb855f216b076c
c5.4xlarge
🧠 vCPUs 16 vCPUs (8 cores × 2 threads)
💾 RAM 32 GB DDR4
💿 Storage 50 GB gp3 (3,000 IOPS / 125 MB/s)
🌐 Red Hasta 10 Gbps
📊 EBS Bandwidth 4,750 Mbps / 20,000 IOPS
🏗️ Arquitectura x86_64 (Intel Xeon Cascade Lake)
🌐 IP Pública ❌ Ninguna (solo VPC privada)
🔑 IP Privada 10.0.1.34
ELI5
🚛
¿Qué es un EC2?
EC2 es como alquilar una computadora en la nube de Amazon. En vez de comprar un servidor físico y ponerlo en tu oficina, Amazon te presta uno que vive en su data center. Puedes elegir qué tan poderoso quieres: poquitos músculos (t3.micro) o una bestia como la nuestra (c5.4xlarge).

La "c5" significa que es de la familia "Compute Optimized" — diseñada para procesar datos rápido. "4xlarge" es el tamaño: tiene 16 cerebros (vCPUs) y 32 GB de memoria. Esto le permite extraer tablas de SAP en paralelo: mientras un hilo lee VBRK (facturas), otro lee KNA1 (clientes), otro LIKP (entregas)... todos al mismo tiempo.

¿Por qué c5 y no otra? Porque la extracción SAP es CPU-intensiva (procesar RFC, deserializar, comprimir datos). No necesitamos una con mucha memoria (r5) ni con GPUs (p4).

🔒 Security Groups Reales

Inbound: TCP 8000192.168.200.0/24 (SAP OData via VPN)
Outbound: TCP 8000192.168.200.0/24 (SAP servers)
Outbound: TCP 4430.0.0.0/0 (HTTPS health checks)

📊 Throughput y Volumen de Datos

Data Flow Analytics — Métricas Reales de Producción
535 GB
Almacenado en S3
Creciendo ~26 GB/día
350M+
Filas Totales
~500K filas/min peak
90
Tablas Iceberg
34 SAP core + vistas
3
Glue Databases
dev, prd, campestre_prd
📦 Volumen por Módulo SAP (filas)
💰 Finanzas (BKPF, FAGLFLEXA, GLT0, BSIK, BSAD)~200M filas
200M
🛒 Ventas (VBRK, VBRP, VBAK, VBAP, VBFA)~99M filas
99M
📦 Logística (LIKP, LIPS, MKPF, MARD)~9M filas
9M
🏭 Producción (AFKO, AUFK) + Custom (ZSD_GEST_MERMA*)~40M filas
40M
📋 Maestros (KNA1, MAKT, MARA, MARC, EKKO, EKPO, T001...)~1.5M filas
1.5M

📨 MSK Kafka — La Banda Transportadora

📨
singularity-campestre-kafka-prd
MSK Serverless
ACTIVE
🏗️ TipoMSK Serverless (auto-scaling)
🔐 AuthIAM Authentication (SASL)
🔒 CifradoTLS 1.3 en tránsito
📊 Topics~34 (1 por tabla SAP)
🌐 RedVPC Privada (2 subnets)
💰 CostoPay-per-use (~$200/mes)
ELI5
📬
¿Qué es Kafka / MSK?
Imagina una oficina de correos super rápida. Cuando el Extractor saca datos de SAP, en vez de guardarlos directo, los mete en buzones (topics). Hay un buzón para facturas (vbrk), otro para clientes (kna1), otro para entregas (likp)...

Spark (los robots) revisan estos buzones y procesan las cartas. Lo genial es que la oficina de correos nunca pierde una carta y puede manejar miles de cartas por segundo. Si Spark está ocupado, las cartas esperan seguras en el buzón.

"MSK" es la versión de Amazon de Kafka — ellos se encargan de mantener la oficina de correos funcionando 24/7. "Serverless" significa que no tenemos que decidir cuántos empleados contratar — Amazon agrega más automáticamente.

⚡ EMR Spark — Los Robots Procesadores

singularity-campestre-spark-prd
EMR Serverless · emr-6.15.0
STARTED
🏗️ TipoEMR Serverless (auto-scaling)
🧠 ExecutorsHasta 20 (auto-scale)
📊 ReleaseEMR 6.15.0 (Spark 3.4, Iceberg 1.3)
🔧 Jobsiceberg_consumer.py + analytics_suite.py
📈 Throughput~500K filas/min (peak)
💰 CostoPay-per-use (~$150/mes)
ELI5
🤖
¿Qué es Spark / EMR?
Spark es como tener un ejército de robots que trabajan juntos para organizar datos. Cuando llegan 39 millones de registros de facturas, un solo robot tardaría horas. Pero Spark los divide en pedacitos y pone a trabajar 20 robots en paralelo — terminan en minutos.

EMR (Elastic MapReduce) es el jefe de los robots. Se encarga de contratarlos (levantar servidores), darles instrucciones, y despedirlos cuando terminan (para no pagar de más). "Serverless" significa que solo pagas cuando los robots están trabajando — si no hay datos, el costo es $0.

Nuestros robots hacen dos trabajos: iceberg_consumer (lee de Kafka y escribe en S3) y analytics_suite (calcula KPIs, detecta anomalías, genera tendencias).

📊 Redshift Serverless — El Mostrador de Consultas

📊
cs-avicola-dl-wg
Redshift Serverless
AVAILABLE
⚡ Capacidad128 RPU (Redshift Processing Units)
🗄️ Databasecs_avicola_dl
🔗 Endpointcs-avicola-dl-wg.794038226747.us-east-1.redshift-serverless.amazonaws.com
🚪 Puerto5439
🔐 CifradoAWS-Owned KMS Key
🔌 Power BIODBC DirectQuery
💰 CostoPay-per-use (~$250/mes)
ELI5
🏪
¿Qué es Redshift?
Redshift es como un mostrador de información super rápido. Mientras S3 es la bodega donde guardas todo, Redshift es el lugar donde la gente va a hacer preguntas.

"¿Cuánto vendimos en enero?" — Redshift busca entre millones de registros y te responde en segundos. Power BI se conecta directamente a este mostrador para crear dashboards bonitos.

Con Redshift Spectrum, ni siquiera necesita copiar los datos de S3 — los lee directamente de la bodega. Es como si el empleado del mostrador pudiera ver todo lo que hay en la bodega sin moverse. 128 RPU significa que tiene 128 "trabajadores" listos para responder preguntas.

🔐 VPN Connection — El Túnel Seguro

🔐
ciro-dev-claro-vpn
IPsec Site-to-Site VPN
AVAILABLE
TipoIPsec (ipsec.1)
ISPClaro Guatemala
Tunnels2 (HA redundante)
Managed ByTerraform
☁️

Servicios AWS — Explicados Como Para un Niño de 5 Años

Cada servicio que usamos, qué hace, y por qué lo elegimos — sin jerga técnica

🪣
Amazon S3
Simple Storage Service
¿Qué es S3?
S3 es una bodega infinita en la nube. Puedes guardar desde un archivo pequeño hasta petabytes de datos. Nunca se llena, nunca pierde nada (99.999999999% durabilidad — 11 nueves), y cuesta centavos por GB.

Nuestro bucket ciro-singularity-data-lake-dev tiene 535 GB de datos en formato Apache Iceberg. Iceberg es como poner los datos en cajas organizadas con etiquetas en vez de tirarlos en un montón.
Bucketciro-singularity-data-lake-dev
Tamaño535 GB (y creciendo)
CifradoSSE-KMS (BucketKey enabled)
VersionadoEnabled
Acceso Público100% Bloqueado
Prefijoswarehouse/, iceberg/, spark-jobs/, logs/...
📚
AWS Glue
Data Catalog
¿Qué es Glue?
Glue es el catálogo de la biblioteca. Los datos están guardados en S3 (los estantes), pero sin el catálogo, nadie sabría qué hay ni dónde encontrarlo. Glue sabe que la tabla vbrk tiene columnas como vbeln (número factura), netwr (monto), fkdat (fecha)...

Cuando Athena o Redshift quieren leer datos, le preguntan a Glue: "¿Dónde están las facturas?" Y Glue responde: "En s3://ciro-singularity-.../warehouse/vbrk_v2/, tienen 15 columnas, formato Parquet".
Databasessingularity_db_dev, singularity_db_prd, singularity_campestre_db_prd
Tablas (dev)90 tablas
Tablas (prd)38 tablas core
Multi-tenantorg_1, org_2, org_3, org_17
🔍
Amazon Athena
Serverless SQL Engine
¿Qué es Athena?
Athena es como un empleado que responde preguntas. Le dices en SQL: "Dame las ventas por región del último mes" y va a la bodega (S3), busca los archivos correctos, y te da la respuesta. No necesita instalación ni servidor — solo pagas por los datos que lee.

CIRO AI usa Athena para responder las preguntas de los usuarios en el chat. Cuando alguien pregunta "¿Cuánto vendimos en enero?", CIRO genera un SQL y lo envía a Athena.
🔑
AWS Secrets Manager
Credential Vault
¿Qué es Secrets Manager?
Es una bóveda de contraseñas ultra-segura. Las credenciales de SAP (usuario, contraseña, IP del servidor) viven aquí — nunca en código, nunca en un archivo de texto.

Solo el EC2 Extractor puede abrirla, y solo cuando está ejecutándose. Las contraseñas se cambian automáticamente. Todo acceso queda registrado en CloudTrail.
🔐
AWS KMS
Key Management Service
¿Qué es KMS?
KMS es el fabricante de candados. Crea llaves de cifrado que protegen tus datos. Cada tenant tiene 2 llaves propias: una para cifrar los archivos en S3, otra para cifrar las credenciales.

Ni siquiera Amazon puede leer tus datos sin tu llave KMS. Las llaves se rotan automáticamente cada año. KMS ID actual: 382bfc35-c7d1-404b-a0f6-c10b0bc1e630
📋
AWS CloudTrail
Audit & Compliance
¿Qué es CloudTrail?
CloudTrail es como cámaras de seguridad en cada rincón. Cada acción — leer un archivo, crear una tabla, cambiar un permiso — queda registrada con quién, qué, cuándo, y desde dónde.

Si algo raro pasa, podemos rebobinar y ver exactamente qué ocurrió. Los registros se guardan por 90 días. Alertas automáticas si: alguien usa cuenta root, cambia políticas IAM, o intenta acceder a secretos sin permiso.
AWS Lambda
Serverless Functions
¿Qué es Lambda?
Lambda es como un guardia de seguridad que se despierta cada 5 minutos, revisa que todo esté funcionando, y vuelve a dormir. No pagas cuando duerme. Nuestro Watchdog Lambda monitorea que el pipeline (Kafka → Spark → S3) esté sano. Si algo falla, envía una alerta inmediatamente.
👤
AWS IAM
Identity & Access Management
¿Qué es IAM?
IAM es el departamento de gafetes. Cada servicio (EC2, Spark, Redshift) tiene un gafete (rol) que dice exactamente qué puede hacer. El Extractor solo puede escribir en Kafka y leer secretos. Spark solo puede leer/escribir en S3 del tenant correcto. Nadie tiene permiso de más.
🔌

Fuentes de Datos — No Solo SAP

Singularity puede conectarse a cualquier fuente de datos estructurada o semi-estructurada. Aquí están todas las opciones.

ELI5
🔌
¿De Dónde Podemos Jalar Datos?
Piensa en Singularity como un pulpo inteligente con muchos tentáculos. Cada tentáculo puede agarrar datos de un lugar diferente: SAP, bases de datos, archivos Excel, APIs de internet, Google Sheets, y más. Lo mejor es que todos los datos llegan al mismo lugar (el Data Lake), así puedes cruzar información de SAP con datos de tu CRM, tu e-commerce, o incluso hojas de cálculo.

✅ Conectores Activos (Disponibles Hoy)

EN USO
🏭
SAP ECC / R/3
Conexión nativa vía RFC (pyrfc). Sin intermediarios. Lectura de todas las tablas estándar y Z-custom.
RFC 3200-3399
LISTO
🐘
PostgreSQL
JDBC/psycopg2. Cualquier versión 10+. Soporte para schemas, vistas materializadas, y funciones.
JDBC 5432
LISTO
🐬
MySQL / MariaDB
JDBC nativo. Compatible con MySQL 5.7+, MariaDB 10+. Aurora MySQL compatible.
JDBC 3306
LISTO
📁
CSV / Excel
Upload directo desde CIRO. Soporte para .csv, .xlsx, .tsv. Detección automática de tipos de datos.
File Upload

🔵 Listos Para Activar (Sin Costo Adicional de Setup)

Estos conectores ya están desarrollados en la plataforma. Solo requieren configuración de credenciales.

INCLUIDO
🔷
SQL Server
Microsoft SQL Server 2016+. JDBC via mssql-jdbc. Azure SQL Database compatible.
JDBC 1433
INCLUIDO
🟠
Oracle Database
Oracle 12c+. JDBC via ojdbc. Compatible con Oracle Cloud, RDS Oracle, y on-premise.
JDBC 1521
INCLUIDO
🌐
REST APIs
Cualquier API REST con JSON. OAuth2, API Key, o Bearer Token. Paginación automática.
HTTPS 443
INCLUIDO
📊
Google Sheets
Conexión vía Google Sheets API v4. Sync automático con detección de cambios.
API v4
INCLUIDO
🍃
MongoDB
MongoDB 4+. Soporte para collections, aggregations, y Atlas cloud. Datos semi-estructurados → tabular.
Driver 27017
INCLUIDO
📦
JSON / Parquet
Archivos .json, .jsonl, .parquet, .avro. Upload o desde S3 externo. Schema inference automático.
File Upload / S3
INCLUIDO
🪣
Amazon S3
Leer archivos desde cualquier bucket S3 externo. CSV, Parquet, JSON. Cross-account con IAM roles.
S3 API
INCLUIDO
🐦
SQLite
Archivos .db / .sqlite. Upload directo. Ideal para aplicaciones móviles y datos locales.
File Upload

🟡 Conectores Premium (Requieren Setup Adicional)

Estos conectores requieren desarrollo o configuración adicional. Se cobra un fee único de setup.

SETUP: $500
🏢
SAP S/4HANA
OData APIs + CDS Views. Requiere configuración de communication arrangements en S/4. Cloud y on-prem.
OData v4
SETUP: $500
☁️
SAP Business One
Service Layer API o HANA DB directo. Para PyMEs con SAP B1. Cloud y on-prem.
REST / HANA
SETUP: $750
🧲
Salesforce
Bulk API 2.0 + Streaming. Objetos estándar y custom. OAuth2 connected app.
REST + Bulk API
SETUP: $500
🛒
Shopify
Admin API + GraphQL. Órdenes, productos, clientes, inventario. Para e-commerce.
GraphQL
SETUP: $500
📱
HubSpot
CRM API. Contactos, empresas, deals, tickets, marketing. OAuth2 + webhooks.
REST API v3
SETUP: $500
📊
QuickBooks
Accounting API. Facturas, pagos, cuentas, reportes financieros. OAuth2.
REST API
SETUP: $1,000
🏗️
ERP Custom
Cualquier ERP con API REST, SOAP, ODBC, o base de datos accesible. Requiere análisis técnico.
Custom
SETUP: $750
🌊
Streaming IoT
MQTT, Kafka externo, AWS IoT Core. Datos de sensores, PLCs, SCADA. Tiempo real.
MQTT / Kafka

💰 ¿Cuándo Hay Cobro Adicional?

ELI5
💸
¿Cuándo Cuesta Extra Conectar Algo Nuevo?
Piensa en los conectores como enchufes. Algunos enchufes ya están instalados en tu casa (PostgreSQL, MySQL, CSV, APIs) — solo tienes que enchufar el cable (configurar credenciales) y funciona. Esto no cuesta extra.

Pero otros enchufes necesitan un electricista (nuestro equipo) para instalarlos: Salesforce necesita configurar OAuth, SAP S/4 necesita communication arrangements, Shopify necesita una app privada. El electricista cobra una sola vez por la instalación.

Una vez instalado, el enchufe funciona para siempre sin costos adicionales de conector. Lo único que crece es el storage en S3 (centavos por GB) si los datos nuevos hacen crecer el Data Lake significativamente.
🟢
Sin Costo Adicional
$0
Solo configurar credenciales
PostgreSQL / MySQL / MariaDB
CSV / Excel / JSON / Parquet
REST APIs (genéricas)
Google Sheets
MongoDB
S3 externo
SQL Server / Oracle
SQLite
📈
Costo Mensual Recurrente
Variable
Solo crece si crece tu uso
📊 S3 Storage: ~$0.023/GB/mes
📊 Kafka: basado en throughput
📊 Spark: basado en procesamiento
📊 Athena: $5 por TB escaneado
📊 Redshift: basado en RPU-hours
Campestre actual: ~$760/mes total

🗺️ Mapa Visual de Integración

Data Sources → Singularity Data Lake → Consumers
📥 Fuentes de Datos
🏭 SAP ECC Activo
🐘 PostgreSQL Listo
🐬 MySQL Listo
🌐 REST APIs Listo
📁 CSV/Excel Listo
🧲 Salesforce $750
🛒 Shopify $500
🌊 IoT $750
⚡ Singularity Pipeline
🏔️
Singularity Data Lake
📨 Kafka ⚡ Spark 🪣 S3 Iceberg 📚 Glue
535 GB · 350M+ filas · 90 tablas
Cifrado KMS · Multi-tenant · Iceberg format
📤 Consumidores
🤖 CIRO AI Chat
📊 CIRO Dashboards
📈 Power BI
🔍 Athena SQL
📊 Redshift BI
🔮 AI Forecasting
ELI5
🎯
¿Por Qué Conectar Más Fuentes?
Hoy Campestre conecta SAP y ya puede ver ventas, inventarios, producción. Pero imagina agregar:

📱 CRM (Salesforce/HubSpot) → Cruzar datos de SAP con pipeline de ventas. "¿Qué clientes del CRM no tienen pedidos en SAP?"
🛒 E-commerce (Shopify) → Unificar ventas online con ventas SAP. "¿El canal online es más rentable que distribuidores?"
🌊 IoT (Sensores) → Datos de temperatura de las plantas avícolas directo al Data Lake. "¿La mortalidad sube cuando la temp pasa de 35°C?"
📊 Google Sheets → Esos Excel que el equipo de producción mantiene a mano. "Centralizar TODO en un solo lugar."

El poder real del Data Lake es que todo vive junto. Puedes hacer preguntas que cruzan 3-4 fuentes diferentes en una sola consulta.
🌊

Flujo de Datos en Tiempo Real

Datos fluyendo desde múltiples fuentes hacia Singularity — aislamiento total por tenant

Singularity Data Lake — Flujo en Tiempo Real
🏭
SAP ECC
RFC · 350M filas
🐘
PostgreSQL
JDBC · 5M filas
🐬
MariaDB
JDBC · 2M filas
📁
CSV / Excel
Upload · 50K filas
📨
Kafka MSK
~106 partitions

Spark EMR
500K+ filas/min
🏔️
Iceberg S3
Cifrado KMS
📚
Glue Catalog
Auto-sync
🔍
Athena SQL
Ad-hoc queries
📊
Redshift BI
Power BI
🤖
CIRO AI
Chat + Insights
ELI5
🏭
De la Fábrica al Tesoro
Imagina que SAP es una fábrica gigante que produce datos todo el día: facturas, pedidos, inventarios. Un cartero especial (EC2 Extractor) recoge esos datos y los pone en un tren rápido (Kafka) que los lleva a una fábrica de organización (Spark) donde se limpian y ordenan. Al final, se guardan en un cofre del tesoro (Iceberg en S3) donde cualquier herramienta — CIRO AI, Athena, Power BI — puede consultarlos en menos de 1 minuto desde que salieron de SAP.
🤖

CIRO AI Chat — Texto a Visualización

Pregunta en español natural → obtén gráficos, tablas, SQL, mapas, y forecasts instantáneamente

CIRO AI Chat — Conversación Inteligente
Claude Sonnet 4.6 Modo Analítica
💬 Conversaciones
📊 Análisis de Ventas Q1
📈 Forecast Producción
🗺️ Mapa de Entregas
💰 Margen por Cliente
📦 Inventario Crítico

💬 Lenguaje Natural a SQL

"¿Cuáles son los 10 clientes con más facturación?" → CIRO genera el SQL, ejecuta la consulta, y crea un gráfico de barras automáticamente.

📊 50+ Visualizaciones

Barras, líneas, waterfall, variance, sankey, treemap, mapas, KPIs, gauges, small multiples, IBCS-compliant y más.

🔮 Forecasting + Anomalías

Detección automática de tendencias, anomalías Z-score, y pronósticos. "¿Cómo se proyectan las ventas para Q2?"

📊

BSC Dashboard — Balanced Scorecard

Dashboard Kaplan-Norton con KPIs, varianza, drill-down, strategy map, y AI insights

BSC Dashboard — Grupo Avícola Campestre
📅 Q1 2026 Actual vs Plan
67% en meta · 22% riesgo · 11% crítico
💰 FINANCIERA 92%
Ingresos NetosQ148.2M▲ +8.3%
Margen Bruto34.7%▲ +2.1pp
EBITDAQ22.5M▲ +12.4%
ROI18.9%▼ -0.8pp
👥 CLIENTE 88%
Satisfacción Cliente4.6/5.0▲ +0.3
Retención94.2%▲ +1.8pp
Nuevos Clientes847▲ +23%
Entregas a Tiempo91.3%▼ -2.1pp
⚙️ PROCESOS 76%
Merma Producción3.2%▲ -0.5pp
Ciclo de Orden2.4 días▲ -0.3d
Utilización Planta87.1%▼ -4.2pp
Órdenes Producción12,847▲ +15%
📚 APRENDIZAJE 71%
Capacitación (hrs)24.3▲ +4.1
Innovación (proyectos)8▲ +3
Automatización62%▲ +11pp
Rotación Personal8.7%▼ +1.2pp
🤖 AI Insights — Generados por CIRO AI
📌 Margen bruto creció +2.1pp impulsado por reducción de merma (-0.5pp) y mejor mix de productos premium.
⚠️ Entregas a tiempo bajó -2.1pp — correlación detectada con baja utilización de planta (-4.2pp). Recomendación: optimizar scheduling en plantas P3 y P7.
📈 Forecast Q2: Ingresos proyectados Q155-162M (+5-9%) basado en tendencia de nuevos clientes y estacionalidad avícola.
🗺️

Mapas Dinámicos Geoespaciales

Visualización 3D con Deck.gl — clusters, heatmaps, rutas, y análisis geográfico

CIRO Maps — Entregas Guatemala
🔵 Scatterplot 🔥 Heatmap ⬡ Hexagon
🌎 Guatemala · Centroamérica
Plantas
Clientes
Almacenes
Entregas Hoy
🔧

Transformation Studio — SQL Visual

Construye transformaciones complejas con drag-drop, JOINs visuales, y asistente IA

Transformation Studio — Análisis de Ventas por Región
📋 Tablas Fuente
🟦 VBRK 2.6M
🟦 VBRP 39M
🟦 KNA1 11.7K
🟦 MAKT 15K
🟦 LIKP 2.1M
🟦 EKKO 671K
🟩 pg_orders 500K
📁 Vistas Guardadas
⭐ Ventas x Región
⭐ Top Productos
⭐ Merma Mensual
🧾
VBRK
Facturas
LEFT
👤
KNA1
Clientes
LEFT
📦
VBRP
Ítems
📊
Vista
ventas_x_region
SELECT k.name1 AS cliente, k.regio AS region,
    SUM(v.netwr) AS total_ventas,
    COUNT(DISTINCT v.vbeln) AS num_facturas
FROM singularity.vbrk v
LEFT JOIN singularity.kna1 k ON v.kunag = k.kunnr
LEFT JOIN singularity.vbrp p ON v.vbeln = p.vbeln
GROUP BY k.name1, k.regio ORDER BY total_ventas DESC
🎨

Generador de Visualizaciones

50+ tipos de gráficos con IA que recomienda la mejor visualización para tus datos

Widget Creator — Nuevo Gráfico
✅ 1. Fuente de Datos
📊 2. Tipo de Visualización
🎨 3. Configurar y Crear
Selecciona el tipo de visualización
🤖 IA Recomienda
📊 Gráfico de Barras Apiladas
Confianza: 94% — Tus datos tienen 1 dimensión categórica y 3 métricas numéricas. Ideal para comparar composición.
Vista Previa
🏔️

Data Lake — Panel de Control

Monitoreo en tiempo real del pipeline, jobs Spark, resultados analíticos, e infraestructura

Singularity — Deployment Dashboard
● Pipeline Activo
350M
Filas Procesadas
99.2%
Tasa de Éxito
90+
Tablas Iceberg
~1 min
Latencia SAP→Query
📊 Analytics 🏗️ Infraestructura 📋 Resultados ⚙️ Configuración
🚀 Jobs Spark en Ejecución
iceberg_consumer.py● Running
Batch 51 · 34 tablas8,019,211 filas escritas
analytics_suite.py⏳ Queued
KPIs, anomalías, tendencias — se ejecuta después del consumer
🏗️ Componentes
EC2 Extractor c5.4xlarge
MSK Kafka ~100 parts
EMR Spark 20 executors
Redshift 128 RPU
Lambda Watchdog cada 5 min
🏠

Aislamiento Multi-Tenant

Cada organización tiene recursos completamente aislados — imposible acceso cruzado

🐔
Campestre
350M filas · SAP ECC · Full Pipeline
🪣 S3 🔐 KMS 📨 Kafka ⚡ EMR 🔍 Athena 📊 Redshift
🏭
Tenant B
Futuro cliente · PostgreSQL · Storage Tier
🪣 S3 🔐 KMS 🔍 Athena
🏗️
Tenant C
Futuro cliente · SAP + MariaDB
🪣 S3 🔐 KMS 📨 Kafka ⚡ EMR

🔒 Cada tenant tiene:

🪣 Bucket S3 propio
🔐 KMS keys propias (2)
👤 IAM roles propios
📨 Kafka topics propios
📚 Glue database propia
🔍 Athena workgroup propio
🔑 Secrets propios
🚫 DENY explícito cruzado
ELI5
🏘️
Apartamentos Separados, No Cuartos Compartidos
Otros sistemas ponen a todos los clientes en la misma casa y usan cortinas para "separar" — si alguien mueve la cortina, ve todo. CIRO le da a cada cliente su propio apartamento con su propia llave. Campestre tiene su propia bodega (S3), su propia cerradura (KMS), sus propios buzones (Kafka), y su propio estudio (Athena). Incluso si alguien lograra entrar a otro apartamento (imposible), hay una regla DENY explícita que bloquea el acceso — es como un segundo candado que dice "ni aunque tengas la llave equivocada".
📈

Conexión con Power BI

DirectQuery desde Redshift — dashboards siempre actualizados con datos del Data Lake

Power BI — Dashboard Financiero Campestre
📊 CAMPOS
🟡 bi_prd.vbrk_v2
📅 fkdat (Fecha)
💰 netwr (Monto)
🏷️ fkart (Tipo Doc)
🌐 vkorg (Org Ventas)
🟡 bi_prd.kna1_v2
👤 name1 (Cliente)
🗺️ regio (Región)
🏙️ ort01 (Ciudad)
🟢 Singularity Iceberg
via Spectrum ✨
Ventas Q1
Q148.2M
▲ +8.3%
Facturas
42,847
▲ +12%
Clientes Activos
3,247
▲ +5.2%

🔗 Flujo de Conexión

SAP ECC →(RFC)→ Kafka →(Streaming)→ Spark →(MERGE)→ Iceberg/S3 →(Glue Catalog)→ Redshift Spectrum →(ODBC DirectQuery)→ Power BI

Los datos de SAP están disponibles en Power BI en ~1 minuto después de ser extraídos. Sin importación manual. Sin ETL adicional. Siempre actualizados.

🔐

Seguridad — Arquitectura de Defensa en Profundidad

VPC + SGs + IAM + KMS + S3 Policies + CloudTrail + GuardDuty + Security Hub. Zero exposición pública. Cifrado total at-rest y in-transit. Auditoría completa.

96
Security Score
0
Puertos Públicos
7
Capas de Defensa
AES-256
Cifrado
ELI5
🏰
Imagina que tus datos viven en un castillo...
Tu información de SAP vive dentro de un castillo invisible (VPC privada) que no aparece en ningún mapa de internet. Para entrar, necesitas un túnel secreto (VPN IPsec) que solo conoce tu empresa. Dentro del castillo, hay puertas con guardias (Security Groups) que solo dejan pasar a quien tiene la llave correcta. Cada habitación tiene su propia cerradura especial (KMS encryption) y un libro de visitantes (CloudTrail) que registra absolutamente todo. Nadie de afuera puede siquiera ver que el castillo existe.

🗺️ Topología de Red — Vista Completa

Diagrama interactivo de la arquitectura de red. Pasa el mouse sobre cada componente para ver detalles.

Network Topology — Singularity VPC Architecture
● All Systems Secure
🌐 INTERNET PÚBLICO
🚫 No hay acceso directo
🚫 Sin Internet Gateway
🚫 Sin IP públicas
VPN IPsec
🏭 SAP ECC On-Prem
Campestre Guatemala
🔒
🛡️ VPC PRIVADA — 10.0.0.0/16 us-east-1 · Aislada
📥 SUBNET PRIVADA A — Ingestión (10.0.1.0/24)
🏭EC2 Extractor
c5.4xlarge · Sin IP pública
🛡️
📨MSK Kafka
3 brokers · Puerto 9098 solo
🛡️
🔑VPN Gateway
IPsec AES-256 · Claro ISP
🔒
⚡ SUBNET PRIVADA B — Procesamiento (10.0.2.0/24)
EMR Spark
Serverless · 20 executors
🛡️
📚Glue Catalog
VPC Endpoint privado
🔗
Lambda Watchdog
Monitoreo cada 5 min
🛡️
🏔️ SUBNET PRIVADA C — Storage & Query (10.0.3.0/24)
🪣S3 Iceberg
KMS cifrado · Block Public
🔐
📊Redshift Serverless
128 RPU · Solo VPC
🛡️
🔍Athena
Workgroup aislado por tenant
🛡️
🔗 VPC ENDPOINTS
🪣 S3 Gateway
📚 Glue
🔑 Secrets Mgr
📋 CloudWatch
📨 SQS
🔑 STS
🔐 KMS
Tráfico nunca sale a internet
ELI5
🗺️
El Mapa del Castillo
Lo que ves arriba es como el mapa de un castillo con 3 habitaciones: una para recibir datos (Ingestión), una para procesarlos (Spark), y una para guardarlos (Storage). Las flechitas verdes a la derecha son túneles secretos (VPC Endpoints) que conectan a servicios de AWS sin salir nunca a internet — como pasadizos internos dentro del castillo. La caja roja de arriba es internet, y fíjate que tiene 3 "🚫" — no hay absolutamente ninguna puerta hacia afuera.

🔐 Capa 1 — Túnel VPN IPsec (SAP → AWS)

Conexión cifrada punto a punto entre las instalaciones de Campestre y la VPC privada en AWS.

VPN IPsec Tunnel — Visualización en Tiempo Real
● Tunnel UP
🏭
SAP ECC
Campestre On-Prem
IP Privada
🔒 RFC DATA (AES-256)
🔒 TABLE EXTRACT
🔒 METADATA
☁️
AWS VPC
us-east-1 Privada
10.0.0.0/16
Protocolo
IPsec IKEv2
Cifrado
AES-256-GCM
ISP
Claro Guatemala
Estado
● ACTIVO 24/7
ELI5
🚇
El Túnel Secreto Subterráneo
Imagina que entre la oficina de Campestre y el castillo de AWS hay un túnel subterráneo que nadie puede ver. Todo lo que viaja por ese túnel va dentro de una caja fuerte con candado especial (AES-256) — incluso si alguien pudiera espiar el túnel, solo vería basura incomprensible. Las cajas animadas que ves moviéndose son los datos de SAP viajando seguros: facturas, maestros de clientes, inventarios... todo encriptado de punta a punta.

🧱 Capa 2 — Security Groups (Firewall Virtual)

Cada servicio tiene su propio firewall que solo permite tráfico específico. Todo lo demás se bloquea.

Security Groups — Reglas de Firewall Activas
🧱 Security Group Rules — Producción
EC2 Extractor → SAP
Egress TCP 3200-3399 → SAP IP (RFC)
ALLOW
EC2 Extractor → MSK
Egress TCP 9098 → MSK Brokers (SASL/IAM)
ALLOW
EMR Spark → MSK
Ingress TCP 9098 desde EMR SG
ALLOW
EMR Spark → S3
Egress HTTPS 443 → S3 VPC Endpoint
ALLOW
Redshift → S3 (Spectrum)
Egress HTTPS 443 → S3 VPC Endpoint
ALLOW
Internet → Cualquier Servicio
Ingress * desde 0.0.0.0/0 → ALL
DENY (implícito)
SSH/RDP desde Internet
Ingress TCP 22,3389 desde 0.0.0.0/0
DENY (implícito)
Cross-Tenant Access
Ingress * desde otro tenant SG
DENY (explícito)
Simulación en Vivo
🧱
🌐 Exterior
🛡️ VPC
Permitido
Bloqueado
ELI5
👮
Los Guardias de las Puertas
Cada servicio (Kafka, Spark, Redshift...) tiene un guardia personal que revisa una lista. El guardia de Kafka, por ejemplo, solo deja pasar al Extractor (por la puerta 9098) y al Spark — nadie más. Si alguien de internet intenta tocar la puerta, el guardia ni siquiera responde — es como si la puerta no existiera. La animación de la derecha muestra exactamente eso: los paquetes verdes pasan por el muro, y los rojos rebotan y desaparecen.

🔐 Capa 3 — Pipeline de Cifrado End-to-End

Cada dato se cifra en múltiples puntos. Nunca viaja en texto plano.

Encryption Pipeline — Visualización del Flujo de Cifrado
📄
Dato Original
SAP RFC Response
Sin cifrar
🔒
VPN IPsec
AES-256-GCM
En tránsito ✓
📨
Kafka TLS
TLS 1.3 + SASL/IAM
En tránsito ✓
🔐
S3 + KMS
SSE-KMS (key por tenant)
En reposo ✓
📊
Redshift
Cifrado nativo
En reposo ✓
🔐 KMS Keys por Tenant
🔑
Data Key
Cifra archivos Iceberg en S3
Rotación: Anual
🔑
Secrets Key
Cifra credenciales SAP en Secrets Manager
Rotación: Anual
🛡️ Cifrado por Servicio
S3 (Iceberg)SSE-KMS (tenant key)
Kafka MSKTLS 1.3 + IAM Auth
VPNIPsec AES-256-GCM
Secrets ManagerKMS dedicado
RedshiftAES-256 nativo
ELI5
📦
Las Cajas Dentro de Cajas
Imagina que tu factura de SAP es una carta importante. Primero, la metes en un sobre sellado (VPN cifrado). Cuando llega al castillo, la sacan del sobre y la meten en una caja fuerte personal (KMS encryption en S3) que solo tu empresa puede abrir. Incluso los ingenieros de CIRO no pueden leer tus datos sin tu llave KMS. Cada empresa (tenant) tiene su propia caja fuerte con su propia llave — las llaves se cambian automáticamente cada año.

👤 Capa 4 — IAM Policies (Menor Privilegio)

Cada componente tiene un rol IAM que solo puede hacer exactamente lo que necesita. Nada más.

📋 IAM Policy: EC2-Extractor-Role Menor Privilegio
{
  "Effect": "Allow",
  "Action": [
    "kafka:WriteData", // Solo escribir a Kafka
    "kafka:DescribeCluster"
  ],
  "Resource": "arn:aws:kafka:*:*:topic/campestre/*"
  // Solo topics de este tenant ☝️
}

{
  "Effect": "Deny",
  "Action": "s3:*",
  "NotResource": "arn:aws:s3:::ciro-campestre-*"
  // DENY explícito a buckets de otros tenants
}
📋 IAM Policy: EMR-Spark-Role Menor Privilegio
{
  "Effect": "Allow",
  "Action": [
    "s3:GetObject",
    "s3:PutObject",
    "s3:DeleteObject"
  ],
  "Resource": "arn:aws:s3:::ciro-campestre-dl/*"
  // Solo el bucket de Campestre
}

{
  "Effect": "Allow",
  "Action": [
    "glue:GetTable", "glue:UpdateTable",
    "glue:CreateTable"
  ],
  "Resource": "*/campestre_db/*"
}
ELI5
🎫
Los Pases de Seguridad
Cada trabajador del castillo (EC2 Extractor, Spark, Redshift...) tiene un gafete con permisos específicos. El Extractor solo puede escribir en Kafka y nada más — no puede leer S3, no puede tocar Redshift. Spark puede leer y escribir en S3, pero solo en la carpeta de Campestre. Si Spark intenta acceder a la carpeta de otro cliente, AWS dice "DENY — acceso denegado" inmediatamente. Esto es lo que llamamos "menor privilegio": cada uno hace solo lo que necesita, nada de más.

🔑 Capa 5 — Secrets Manager (Credenciales SAP)

Las credenciales de SAP nunca están en código. Se almacenan cifradas y se rotan automáticamente.

AWS Secrets Manager — Lifecycle de Credenciales
🚫
Hardcoded
Nunca en código
📝
Terraform
Crea el secreto
🔐
Secrets Manager
Cifrado con KMS
🏭
EC2 Runtime
Lee en memoria
🔄
Rotación
Automática
🔑 Secreto: campestre/sap-credentials
{
  "sap_host": "10.x.x.x", // IP privada via VPN
  "sap_sysnr": "00",
  "sap_client": "800",
  "sap_user": "ZSVC_CIRO", // Service account (solo lectura)
  "sap_password": "••••••••••••••••", // Cifrado KMS
  "last_rotated": "2026-02-15T00:00:00Z",
  "kms_key_id": "arn:aws:kms:...:key/campestre-secrets"
}
ELI5
🗝️
La Contraseña que Nadie Conoce
La contraseña de SAP no está escrita en ningún archivo de código. Vive dentro de una bóveda secreta (Secrets Manager) que solo el Extractor puede abrir, y solo cuando está ejecutándose. La contraseña se cambia automáticamente sin que nadie tenga que hacer nada. Ni siquiera los ingenieros de CIRO la ven — el sistema la lee directo de la bóveda a la memoria, la usa, y la olvida.

📋 Capa 6 — CloudTrail + Alarmas (Auditoría Total)

Cada acción en AWS se registra. Anomalías activan alertas inmediatas.

CloudTrail Audit Feed — Eventos en Tiempo Real
● Grabando 90 días retención
🚨 Reglas de Alerta Activas
🔴 Root Account Login
Alerta inmediata si se usa cuenta root
🟡 IAM Policy Change
Cualquier cambio en políticas IAM
🟡 S3 Bucket Policy Change
Modificaciones a permisos de bucket
🔵 Secret Access Failure
Intentos fallidos de leer secretos
🔵 KMS Key Deletion
Intentos de eliminar llaves KMS
ELI5
📹
Las Cámaras de Seguridad
Hay cámaras de seguridad en todas partes del castillo (CloudTrail). Cada vez que alguien abre una puerta, lee un archivo, o incluso mira hacia un rincón — queda grabado con fecha, hora, y quién lo hizo. Si algo raro pasa (como alguien intentando usar la cuenta más poderosa del castillo), una alarma suena inmediatamente 🚨. Los registros se guardan por 90 días, así que siempre podemos volver a revisar qué pasó.

🏭 Capa 7 — SAP Service Account (Solo Lectura)

La cuenta de servicio SAP tiene permisos mínimos. No puede modificar absolutamente nada.

✅ Lo que SÍ puede hacer

S_RFC — Llamadas RFC remotas (lectura de tablas)
S_TABU_DIS — Lectura de tablas (solo lectura)
RFC_READ_TABLE — Módulo estándar SAP de lectura

❌ Lo que NO puede hacer

Escribir, modificar o borrar datos en SAP
Acceder a módulos HR/HCM (datos de empleados)
Ejecutar transacciones o BAPIs de escritura
Acceso ODBC/JDBC directo a la base de datos
Exportar datos bancarios o passwords
ELI5
👀
El Visitante que Solo Puede Mirar
La cuenta que CIRO usa para conectarse a SAP es como un visitante en un museo: puede mirar las obras (leer tablas), pero hay una barrera de vidrio que le impide tocar cualquier cosa. No puede cambiar una factura, no puede borrar un cliente, no puede ver datos de empleados. Solo mira, copia lo que necesita en su cuaderno (extrae los datos), y se va. Además, el museo tiene guardias que registran exactamente qué obras miró y a qué hora.

📊 Resumen de las 7 Capas

🏰
VPC Privada
Sin Internet Gateway
🧱
Security Groups
Firewall por servicio
🔐
Cifrado E2E
AES-256 + KMS
🎫
IAM Policies
Menor privilegio
🔑
Secrets Manager
Rotación automática
📹
CloudTrail
Auditoría 90 días
👀
SAP Read-Only
Zero escritura
🔗
VPC Endpoints
Sin tráfico público
⚙️

Pipeline Deep Dive — Arquitectura del Código Real

MERGE INTO, CDC, SCD Type 2, Schema Evolution, Particionamiento — directo del código fuente de Singularity

🔄 Ciclo de Vida de un Dato: SAP → Query (Paso a Paso)

1
SAP RFC Call
pyrfc → Z_RFC_READ_TABLE_V3 con field projection
~200K filas/call
2
Transformaciones at Source
Decimales, signos, fechas, códigos → human-readable
25+ field types
3
Kafka Produce (Batched V2)
500 rows/message → per-table topics (sap-campestre-vbrk)
~106 partitions
4
Spark Structured Streaming
subscribePattern: sap-{tenant}-* | 30s micro-batches
8 parallel writers
5
Schema Validation
Valida columnas, tipos, detecta schema drift → SNS alert
12+ table specs
6
MERGE INTO Iceberg
Upsert por primary key → dedup → Iceberg table en S3
34+ tables
7
Redshift Sync (SCD2)
MERGE + Slowly Changing Dimensions Type 2 para masters
Audit log
ELI5
🏭
La Fábrica de 7 Pasos
Imagina una fábrica de chocolates: (1) Se recoge el cacao del campo (SAP), (2) se limpia y procesa en la puerta (transformaciones), (3) se pone en cajas de 500 (Kafka batches), (4) los robots lo reciben y organizan (Spark), (5) un inspector verifica que todo está bien (schema validator), (6) se guarda en el almacén sin duplicados (MERGE INTO Iceberg), (7) y se pone una copia en el mostrador de ventas (Redshift) para que los clientes pregunten.

Si algún chocolate llega defectuoso (schema change), suena una alarma (SNS) y el inspector anota el cambio. Los chocolates que ya existían se actualizan en vez de duplicarse (UPSERT).

📊 Métricas del Pipeline V2

500K
maxOffsets/trigger
30s
micro-batch interval
8
parallel table writers
30 min
idle auto-shutdown

🔀 MERGE INTO — Lógica de Upsert Real

Cada tabla SAP tiene primary keys definidas. El MERGE evita duplicados y actualiza registros existentes.

SQL iceberg_consumer.py — MERGE INTO Iceberg (línea 926)
MERGE INTO glue_catalog.campestre_db.vbrk AS target
USING source_vbrk_batch52 AS source
ON target.`vbeln` = source.`vbeln`
WHEN MATCHED THEN UPDATE SET
  target.fkdat = source.fkdat,
  target.kunag = source.kunag,
  target.netwr = source.netwr,
  -- ... all columns updated
  target.ingestion_time = source.ingestion_time
WHEN NOT MATCHED THEN INSERT
  (vbeln, fkdat, kunag, ..., ingestion_time)
  VALUES (source.vbeln, source.fkdat, ...)
Python Primary Keys por Tabla SAP
# Transaction tables: composite keys
VBRK: ['vbeln'] # Billing Doc
VBRP: ['vbeln', 'posnr'] # + Line Item
BKPF: ['bukrs', 'belnr', 'gjahr'] # Acct Doc
VBFA: ['vbelv', 'posnv', 'vbeln', 'posnn']

# Master data tables: single key
KNA1: ['kunnr'] # Customer
MARA: ['matnr'] # Material
MARC: ['matnr', 'werks'] # Plant Data
KNVV: ['kunnr', 'vkorg', 'vtweg', 'spart']

# 34+ tables with defined PKs
# Fallback: append + dedup if no PK

📜 SCD Type 2 — Historial de Cambios en Master Data

Para tablas de datos maestros (KNA1, MAKT, MARA...), guardamos el historial completo de cambios con versionado.

SCD Type 2 — _write_scd2_to_redshift() — Slowly Changing Dimensions
🔑
1. Hash Comparison
MD5 de columnas non-key para detectar cambios reales
2. Expire Old Row
is_current=false, valid_to=NOW() en la versión anterior
3. Insert New Version
is_current=true, valid_from=NOW(), nuevo row_hash
SQL SCD2 MERGE — Redshift (línea 599)
-- Step 1: Expire changed rows
UPDATE bi.kna1 t SET
  is_current = false,
  valid_to = GETDATE()
FROM bi.kna1_staged s
WHERE t.kunnr = s.kunnr
  AND t.is_current = true
  AND t.row_hash != MD5(s.name1 || s.ort01 || ...);

-- Step 2: Insert new version (changed + new rows)
INSERT INTO bi.kna1 (kunnr, name1, ..., valid_from, is_current, row_hash)
SELECT s.*, GETDATE(), true, MD5(s.name1 || ...)
FROM bi.kna1_staged s LEFT JOIN bi.kna1 t
  ON t.kunnr = s.kunnr AND t.is_current = true
WHERE t.kunnr IS NULL OR t.row_hash != MD5(...);

-- Step 3: Audit log entry
INSERT INTO bi.audit_log (table_name, primary_key_value, operation, changed_at)
SELECT 'bi.kna1', s.kunnr, CASE WHEN t.kunnr IS NULL THEN 'INSERT' ELSE 'UPDATE' END, GETDATE();
ELI5
📚
El Libro de Historia
Cuando un cliente cambia de dirección en SAP, no borramos la dirección anterior. Es como un libro de historia: la página anterior dice "vivía en Zona 10 hasta el 15 de febrero" y la nueva página dice "ahora vive en Zona 14 desde el 15 de febrero". Así, si alguien pregunta "¿dónde vivía este cliente en diciembre?", podemos responder exactamente. Esto se llama SCD Type 2 y es clave para reportes históricos y auditoría.

🧬 Schema Evolution Guard

El sistema detecta automáticamente cambios en el esquema de SAP — columnas nuevas, eliminadas, o tipos cambiados — sin perder datos.

Python schema_validator.py — Validación de Esquema
class SchemaValidationResult:
  unexpected_columns: List[str] # Nuevas en SAP
  missing_columns: List[str] # Removidas
  type_mismatches: List[Tuple] # Tipo cambió

# Expected schemas por tabla:
EXPECTED_SCHEMAS = {
  'vbrk': {
    'vbeln': 'string',
    'fkdat': 'string',
    'kunag': 'string',
    'ingestion_time': 'timestamp',
    # ... 14+ fields per table
  },
  # 12+ table specs defined
}

# On schema change → SNS alert
sns.publish(TopicArn=SCHEMA_ALERT_SNS_ARN)

¿Qué pasa cuando SAP agrega una columna?

1. Schema Validator detecta la columna nueva
2. Envía alerta SNS al equipo CIRO
3. Incrementa schema_version en Iceberg table properties
4. Los datos NO se pierden — la columna nueva se incluye
5. Spark hace ALTER TABLE ADD COLUMN automáticamente

🛡️ Iceberg Schema Evolution Nativa

Apache Iceberg soporta schema evolution sin reescritura de datos:
Add column: Se agrega al metadata, archivos existentes no cambian
Rename column: Via field IDs (no rompe queries existentes)
Type widening: int → long, float → double automáticamente
Reorder columns: Sin impacto en los datos almacenados

📨 Kafka Topic Partitioning Strategy

TOPIC_CONFIG — Particiones por Volumen de Tabla
TierTablasPartitionsPartition KeyRazonamiento
XL (>10M rows)FAGLFLEXA, GLT012BUKRSMáximo paralelismo para tablas de contabilidad masivas
Large (1M-10M)VBRK, VBRP, VBAK, VBAP, LIKP, LIPS, BKPF, AUFK, BSIK, BSAK, BSID, BSAD6VBELN/BUKRS/KUNNRBalance entre paralelismo y overhead de particiones
Medium (100K-1M)EKKO, EKPO, MARC, MBEW, VBFA, MKPF, AFKO, AFPO, KNVP3EBELN/MATNR/AUFNRParticionamiento moderado para tablas intermedias
Small/Master (<100K)KNA1, MAKT, T001, T001W, TVKO, ...1Tablas maestras: poco volumen, 1 partición suficiente
TOTAL~106MSK Serverless limit: 120 partitions/cluster
🏭

Motor de Extracción SAP — Arquitectura Real

pyrfc, V3 RFC con field projection, 5 workers paralelos, key-based pagination, transformaciones at-source

Python sap_kafka_producer.py — Configuración de Extracción
from pyrfc import Connection

# V3: Key-based pagination, field projection
USE_V3_RFC = True # Z_RFC_READ_TABLE_V3
BASE_WORKERS_PER_TABLE = 5
MAX_PARALLEL_TABLES = 4
V3_BATCH_SIZE = 200_000 # rows per RFC call

# Kafka producer: high-throughput settings
batch_size = 262_144 # 256KB batches
linger_ms = 20 # 20ms batch window
buffer_memory = 268_435_456 # 256MB buffer
max_request_size = 20_971_520 # 20MB max
acks = 1 # Leader ack only

# Dynamic batch sizing by field count:
# ≤40 fields → 200K rows/call
# ≤80 fields → 100K rows/call
# ≤150 fields → 50K rows/call
# ≤250 fields → 25K rows/call
# 300+ fields → 15K rows/call

🏭 V3 Extraction Strategy

¿Por qué V3? Fewer workers with LARGE batches + key-based pagination.

V3: 5 workers × 200K batch = 1M rows/round with only 5 RFC calls
V2: 30 workers × 10K batch = 300K rows but 30 RFC calls (SAP stress)

Key innovations:
Field projection at DB level → 60-80% less I/O on wide tables
Key-based pagination → O(log N) seeks vs O(N) offset scan
Z_RFC_READ_TABLE_V3 — custom ABAP function, no row limits
Dynamic batch sizing based on actual field count (target ~100MB per RFC response)

🔄 Transformaciones At-Source (25+ types)

Decimal correction: SAP stores values × 1000 → dividir
Sign correction: Credit memos → negative values
Date formatting: YYYYMMDD → proper dates
Code translation: 25+ field types → human-readable
Boolean conversion: "X" → True
ID formatting: Strip leading zeros
Column normalization: lowercase, trimmed

📊 Modos de Extracción

🔄 Full Load

Extracción completa de todas las filas de una tabla SAP. Se usa para la carga inicial o para tablas maestras que son pequeñas.

python sap_kafka_producer.py VBRK,VBRP,KNA1

⚡ Incremental

Solo extrae datos nuevos o modificados desde la última ejecución. Usa checkpoint files con timestamps para rastrear el punto de corte.

python sap_kafka_producer.py VBRK --incremental

🔁 Continuous

Ejecuta extracciones incrementales automáticamente cada N minutos. El Spark consumer corre en modo streaming continuo (30s micro-batches).

python sap_kafka_producer.py VBRK --continuous --interval=60
ELI5
🚚
El Camión Inteligente
Nuestro camión de datos (Extractor) tiene 3 modos de trabajo: (1) Full Load es como mudar toda la casa — lo hace una vez al principio. (2) Incremental es como ir a buscar solo el correo nuevo — rápido y eficiente. (3) Continuous es como un cartero que pasa cada hora a revisar si hay algo nuevo.

El camión es inteligente: sabe que para una tabla con 200 millones de filas, puede enviar 200,000 filas por viaje usando solo 5 conductores en paralelo, en vez de 30 conductores con viajes pequeños. Menos viajes = menos estrés para SAP.
📡

Monitoreo y Observabilidad — Alarmas Reales

CloudWatch Alarms, Lambda Watchdog, Data Quality Checks, Security Monitoring — todo definido en Terraform

🚨 CloudWatch Alarms — Pipeline Health

7 alarmas CloudWatch activas monitorean el pipeline 24/7. Configuradas via Terraform en modules/tenant/monitoring.tf

EMR Job Duration > 2h
Alerta si un job de Spark corre más de 2 horas (threshold: 7,200,000 ms)
OK
Lambda Trigger Errors
Cualquier error en la Lambda de trigger Spark (threshold: > 0)
OK
Kafka Consumer Lag > 10K
V2: 10K msgs × 500 rows = 5M rows de lag. Continuous mode: threshold 100K
OK
Extractor EC2 Status Check
Fallo de health check del EC2 extractor (treat_missing_data: breaching)
OK
Lambda DLQ Messages
Mensajes en Dead Letter Queue = invocaciones Lambda fallidas
OK
Streaming Job Missing (30+ min)
Watchdog Lambda sin invocaciones por 2 períodos de 15 min (continuous mode)
OK
Extraction Window Breach
EC2 CPU > 50% después de las 04:30 (hard stop window, triggered mode)
OK

🐕 Lambda Watchdog — Self-Healing Pipeline

Python lambda_trigger.py — Watchdog Logic (V2 Continuous Mode)
def lambda_handler(event, context):
  # Runs every 5 minutes via EventBridge

  # 1. Check running jobs
  running_jobs = get_running_jobs()

  # 2. Detect stuck jobs (>6 hours)
  if runtime_hours > 6:
    cancel_job(job_id) # Auto-cancel

  # 3. Detect duplicate jobs
  if healthy_job and extra_job:
    cancel_job(extra_job.id)

  # 4. No job running? Check Kafka lag
  lag = get_kafka_lag() # CloudWatch metric

  # 5. Start new streaming job
  if lag > MIN_MESSAGES_THRESHOLD:
    start_spark_job() # EMR Serverless

🔄 Self-Healing Capabilities

Stuck job detection: Auto-cancel jobs running >6 hours
Duplicate prevention: Cancel extra jobs, keep only 1 healthy
Fail-open policy: If can't check lag, start job anyway
Auto-restart: Watchdog checks every 5 min → restarts in <5 min
DLQ fallback: Failed Lambda invocations go to SQS Dead Letter Queue
Idle shutdown: Spark consumer auto-stops after 30 min no data (cost savings)

🔐 Security Monitoring — Detección de Amenazas

4 metric filters en CloudTrail detectan actividad sospechosa. Definidos en modules/shared/security_monitoring.tf

🔴 Root Account Usage

Filtra eventos de CloudTrail donde userIdentity.type = "Root". Esto nunca debería pasar en operaciones normales. Alerta inmediata vía SNS topic singularity-security-alerts.

🟡 IAM Policy Changes

Detecta: CreateUser, DeleteUser, CreateRole, DeleteRole, AttachRolePolicy, DetachRolePolicy, PutRolePolicy. Cualquier cambio no autorizado en permisos.

🔵 Secrets Access Denied

Filtra GetSecretValue con errorCode = "AccessDeniedException". Intento de leer secretos sin autorización.

🟣 S3 Bucket Policy Changes

Detecta: PutBucketPolicy, DeleteBucketPolicy, PutBucketAcl, PutBucketPublicAccessBlock. Cualquier intento de abrir un bucket.

✅ Data Quality — Lambda DQ Alerts

Python dq_alert.py — Lambda de Calidad de Datos
# Runs every 2 hours via EventBridge
# Queries Redshift: bi.dq_check_results

sql = """
  SELECT check_name, table_name,
    metric_value, threshold, status
  FROM bi.dq_check_results
  WHERE status IN ('FAIL', 'WARN')
    AND checked_at >= DATEADD(hour, -3,
      GETDATE())
"""

# Alert format:
# [FAIL] null_rate on vbrk: 2.3% nulls
# (threshold=1%)
# [WARN] row_count on kna1: 0 rows
# (threshold=100)

sns.publish(Subject=f"DQ Alert: {fails} FAIL")

📊 DQ Check Types

Null rate: % de valores nulos por columna (threshold configurable)
Row count: Tablas vacías o con menos filas de lo esperado
Freshness: Última ingestion_time vs ahora
Duplicate rate: % de PKs duplicados
Schema drift: Columnas inesperadas vía schema_validator

⏱️ Schedule

• DQ checks run en Redshift cada 2 horas (stored procedures)
• Lambda DQ Alert cada 2 horas (queries last 3h for overlap)
• Schema validation en cada micro-batch de Spark (30s)
• Alertas via SNS → email/Slack
ELI5
🏥
El Doctor de los Datos
Cada 2 horas, un doctor (Lambda DQ Alert) revisa la salud de los datos: "¿Hay demasiados valores vacíos? ¿Llegaron datos hoy? ¿Hay duplicados?" Si encuentra algo mal, envía un reporte de salud por email. Mientras tanto, un inspector (schema validator) revisa cada 30 segundos que los datos que llegan tengan la forma correcta — las columnas correctas con los tipos correctos. Y un perro guardián (Lambda Watchdog) revisa cada 5 minutos que todo el pipeline esté vivo y funcionando.
🏗️

Infrastructure as Code — Terraform

Toda la infraestructura está definida como código. Reproducible, auditable, versionada. Zero configuración manual.

📁 Estructura de Módulos Terraform

infrastructure/terraform/ — Module Tree
modules/shared/ — Account-wide (1 per AWS account)
main.tf — VPC, subnets, NAT
cloudtrail.tf — Audit trail (90 days)
security_monitoring.tf — 4 metric filters + alarms
vpc_endpoints.tf — S3, Glue, STS, Logs (private)
access_logs.tf — S3 access logging bucket
iam.tf — Shared IAM roles

modules/tenant/ — Per-organization (1 per CIRO org)
main.tf — S3, MSK, EMR, Glue, Athena, EC2
security_groups.tf — MSK SG + Extractor SG
iam.tf — Per-tenant IAM roles (least privilege)
lambda.tf — Spark trigger + EventBridge
monitoring.tf — 7 CloudWatch alarms + SNS
secrets.tf — SAP credentials in Secrets Manager
variables.tf — pipeline_enabled, tenant_id, ...

🏷️ Resource Naming Convention

Todos los recursos siguen el patrón:
singularity-{tenant_id}-{resource}-{env}

Ejemplos para Campestre:
singularity-campestre-kafka-prd
singularity-campestre-spark-prd
singularity-campestre-data-lake-prd
singularity-campestre-extractor-prd

Tags estándar en todos los recursos:
Tenant = campestre
CiroOrgId = 42
Client = Grupo Avícola Campestre
ManagedBy = Terraform
Project = Singularity

🔒 Security-First Infrastructure (Terraform Real)

HCL main.tf — S3 Bucket Policy (enforce HTTPS + KMS)
resource "aws_s3_bucket_policy" "data_lake" {
  policy = {
    Statement = [
      {
        Sid = "DenyInsecureTransport"
        Effect = "Deny"
        Action = "s3:*"
        Condition = {
          Bool = { "aws:SecureTransport" = "false" }
        }
      },
      {
        Sid = "DenyIncorrectEncryption"
        Effect = "Deny"
        Action = "s3:PutObject"
        Condition = { StringNotEquals = {
          "s3:x-amz-server-side-encryption"
            = "aws:kms"
        }}
      }
    ]
  }
}
HCL security_groups.tf — Extractor EC2 SG
resource "aws_security_group" "extractor" {
  name = "singularity-campestre-extractor-sg"

  # Egress: SAP RFC ports via VPN only
  egress {
    from_port = 3200
    to_port = 3399
    protocol = "tcp"
    cidr_blocks = [var.sap_subnet_cidr]
    # Only SAP subnet via VPN tunnel
  }

  # Egress: S3 via VPC Gateway Endpoint
  egress {
    from_port = 443
    to_port = 443
    prefix_list_ids = [var.s3_prefix_list_id]
    # Never goes through internet
  }

  # IMDSv2 enforced on EC2 instance
  # http_tokens = "required"
}

🎚️ Granular Component Provisioning

pipeline_enabled = false (Storage Only)

S3 bucket + KMS encryption
Glue Catalog database
Athena workgroup
SNS alerts + SQS DLQ
MSK Kafka (count = 0)
EMR Spark (count = 0)
EC2 Extractor (count = 0)
Lambda Watchdog (count = 0)
Costo: ~$50/mes (storage only)

pipeline_enabled = true (Full Pipeline)

Todo lo anterior +
MSK Serverless (IAM auth, 2 subnets)
EMR Serverless (Spark 3.4, auto-scale)
EC2 Extractor (c5.4xlarge, VPN)
Lambda Watchdog + EventBridge
7 CloudWatch alarms
Security Groups (MSK + Extractor)
CloudWatch Log Groups (30d/90d retention)
Costo: ~$1,870/mes (full infrastructure)

🛡️ Data Durability & Disaster Recovery

🗄️ S3 Versioning

Enabled en todos los buckets de data lake. Cada archivo tiene un historial completo de versiones. Protege contra borrado accidental y corrupción.

Durability: 99.999999999% (11 nines) — diseñado para perder 0 archivos en 10,000 años.

📸 Iceberg Snapshots

Apache Iceberg mantiene un historial de snapshots de cada tabla. Permite time travel para consultar datos como estaban en cualquier momento pasado.

SELECT * FROM vbrk FOR TIMESTAMP AS OF '2026-02-15'

🔐 KMS Key Rotation

Las llaves KMS se rotan automáticamente cada año (enable_key_rotation = true). La llave tiene un período de eliminación de 30 días — imposible borrarla por accidente.
ELI5
🏰
El Castillo Indestructible
Toda la infraestructura está escrita en un libro de planos (Terraform). Si el castillo se destruye, podemos reconstruirlo exactamente igual en minutos ejecutando terraform apply. No hay configuración manual — no hay "recetas secretas" que solo un ingeniero conoce. Cada ladrillo, cada cerradura, cada cámara de seguridad está documentada en código, versionada en Git, y revisada por el equipo antes de aplicarse.

Los datos están triplicados (S3 los replica automáticamente en 3 zonas de disponibilidad) y tienen un historial de versiones — si alguien borra algo por error, podemos recuperarlo.
📋

Datos Extraídos — 90+ Tablas SAP

Ventas, logística, compras, producción, finanzas, maestros, custom Z*

🛒 Ventas (SD)
VBRK · VBRP · VBAK · VBAP · VBFA
~99M filas
📦 Logística (LE)
LIKP · LIPS · MKPF
~9M filas
💰 Finanzas (FI)
BKPF · FAGLFLEXA · GLT0 · BSIK · BSAD
~200M filas
📋 Maestros (MM)
KNA1 · MAKT · MARA · MARC · EKKO · EKPO
~1.5M filas

⚠️ Datos Personales (PII)

KNA1 contiene nombres/direcciones de clientes. No se extraen datos de empleados (HR/HCM), contraseñas, ni datos bancarios personales. Región: us-east-1. Retención: indefinida (históricos completos).

🛡️

Enterprise Compliance & Security Hardening

Respuestas directas a las preguntas que su CISO hará. Sin marketing — solo hechos técnicos verificables.

📋 Compliance & Certificaciones

AWS SOC 2 Type IIINHERITED

Toda la infraestructura corre sobre AWS, que mantiene SOC 1/2/3 Type II auditado anualmente. Los reportes están disponibles vía AWS Artifact para su equipo de auditoría.

AWS ISO 27001INHERITED

AWS mantiene certificación ISO 27001, 27017, y 27018. Aplica a todos los servicios que usamos: S3, MSK, EMR, KMS, VPC, CloudTrail.

CIS BenchmarkENFORCED

AWS Security Hub con CIS AWS Foundations Benchmark v1.4 y AWS Foundational Security Best Practices habilitados. Findings monitoreados continuamente.

Nota sobre CIRO SOC 2 propio:

CIRO como empresa aún no tiene SOC 2 Type II propio (en proceso para Q4 2026). Sin embargo, el modelo de shared responsibility de AWS significa que los controles de infraestructura (physical security, network, compute, storage) ya están auditados por AWS. Los controles que CIRO agrega (IAM policies, encryption config, monitoring, access control) están definidos como Infrastructure-as-Code en Terraform y son 100% auditables por el cliente — puede revisar cada línea de configuración.

🏗️ Aislamiento Multi-Tenant — Respuesta Definitiva

¿Puede otro tenant acceder a mis datos? NO. Aquí está la prueba:
Recursos 100% Aislados (por tenant)
  • S3 Bucket: singularity-{tenant_id}-data-lake-{env} — bucket exclusivo, no compartido
  • KMS Key: Llave de cifrado propia por tenant — otro tenant no puede descifrar sus datos
  • MSK Cluster: Cluster Kafka Serverless exclusivo por tenant, no compartido
  • EMR Application: Instancia Spark independiente por tenant
  • Glue Database: singularity_{tenant_id}_db_{env} — catálogo separado
  • IAM Roles: Roles con ARN scoping — solo acceden a recursos de su tenant
  • EC2 Extractor: Máquina dedicada con su propio Security Group
  • Athena Workgroup: Workgroup exclusivo con scan limit independiente
Recursos Compartidos (account-level)
  • VPC: Compartida pero con Security Groups aislados por tenant
  • CloudTrail: Un trail para todo el account (estándar AWS)
  • Security Hub: Account-wide, findings etiquetados por tenant
  • GuardDuty: Detector account-wide (no configurable por tenant)
  • VPC Endpoints: Compartidos (es infraestructura de red, no datos)
  • Access Logs Bucket: Compartido con prefijos por tenant
Verificación: Revisar modules/tenant/iam.tf — cada policy tiene resources scoped al ARN del bucket/database/cluster del tenant específico. No hay wildcards cross-tenant.

🔐 Cifrado en Tránsito — Componente por Componente

ConexiónProtocoloCifradoEvidencia
SAP → EC2 ExtractorRFC sobre IPsec VPNTLS/IPsecVPN tunnel vpn-0077443d15fec8425 con AES-256-GCM
EC2 → Kafka MSKPort 9098 (IAM Auth)TLS 1.2+MSK Serverless solo acepta IAM auth en port 9098, que requiere TLS obligatorio. No existe port plaintext.
Kafka → Spark EMRPort 9098 (IAM Auth)TLS 1.2+Mismo que arriba — EMR Serverless se conecta vía IAM auth, TLS enforced por MSK Serverless.
Spark → S3HTTPS (port 443)TLS 1.2+Bucket policy con Deny en aws:SecureTransport=false. No se permite HTTP.
Spark → GlueHTTPS via VPC EndpointTLS 1.2+VPC Interface Endpoint — tráfico nunca sale del VPC. AWS API siempre es HTTPS.
Spark → RedshiftJDBC over TLSTLS 1.2+Redshift Serverless enforce SSL por defecto. JDBC URL incluye ssl=true.
Redshift → Power BIODBC/JDBC over TLSTLS 1.2+Redshift requiere SSL. Power BI ODBC connector usa TLS.
Dashboard → APIHTTPSTLS 1.3CloudFront + ACM certificate. HSTS habilitado.

Resumen: 100% de las conexiones entre componentes usan TLS 1.2 o superior. No existe ninguna conexión plaintext en el pipeline. MSK Serverless no ofrece puertos sin TLS — es TLS-only by design. S3 rechaza requests HTTP con bucket policy explícita.

👤 IAM — Separación de Roles (Least Privilege)

RolServicioPermisosNO tiene acceso a
Extractor Role
Singularity-{tenant}-Extractor-Role
EC2S3 PutObject (solo /raw/*), Kafka produce, Secrets read, KMS, CloudWatch LogsGlue, EMR, Redshift, Lambda, S3 Delete, Kafka consume
EMR Execution Role
Singularity-{tenant}-EMR-Execution-Role
EMR ServerlessS3 read/write (tenant bucket), Glue catalog, Kafka consume, KMS, CloudWatch LogsEC2, Lambda, Secrets Manager, IAM, other tenant buckets
Lambda Execution RoleLambdaEMR StartJobRun/CancelJobRun, CloudWatch LogsS3, Kafka, Glue, Redshift, Secrets, EC2
Customer Data Access Role
Singularity-{tenant}-DataAccess-Role
Athena/BIAthena queries (own workgroup), Glue read-only, S3 read /warehouse/* onlyEMR, Kafka, Lambda, EC2, Secrets, S3 write, S3 /raw/*, S3 /checkpoints/*

Nota: El rol de EC2 Extractor es dedicado y separado del rol de EMR. Si el extractor se compromete, el atacante NO obtiene acceso a Glue, EMR, ni Redshift. Solo puede escribir a S3 /raw/* y producir a Kafka. Los roles están definidos en modules/tenant/iam.tf — audítelos directamente.

🔍 Detección de Amenazas — Capas Reales

Amazon GuardDuty
ML-based threat detection. Analiza CloudTrail, VPC Flow Logs, y DNS queries. Detecta: cryptocurrency mining, credential exfiltration, unauthorized API calls, port scanning, malware en EBS.
ENABLED — threat_detection.tf
AWS Security Hub
Aggregated security findings. CIS AWS Foundations Benchmark v1.4 + AWS Foundational Security Best Practices habilitados. Compliance score visible en console.
ENABLED — CIS + FSBP standards
CloudTrail + Metric Filters
Audit log de toda API call. 4 metric filters con alarms: root account usage, IAM changes, S3 policy changes, Secrets access denied. SNS alerting.
ENABLED — 4 security alarms
Pipeline Monitoring
7 CloudWatch alarms per tenant: EMR job duration, Lambda errors, Kafka consumer lag, EC2 status check, extraction window breach, DLQ messages, streaming job missing.
7 ALARMS — monitoring.tf
Lambda Watchdog (Self-Healing)
Lambda cada 5 minutos verifica salud del pipeline. Detecta: jobs stuck >6h, duplicados, EMR down. Auto-restart sin intervención humana.
AUTO-RECOVERY
Data Quality Alerts
Lambda DQ cada 2 horas consulta bi.dq_check_results en Redshift. Alerta vía SNS si hay anomalías en row counts, null rates, o freshness.
DQ LAMBDA — dq_alert.py

🖥️ EC2 Extractor — Hardening

ControlImplementaciónEvidencia
IMDSv2 Enforcedhttp_tokens = "required", hop limit = 1main.tf line 260
No Public IPassociate_public_ip_address = falsemain.tf line 255
Docker Version Pinneddnf install -y docker-25.0.* (no latest)main.tf user_data
SSH HardenedMaxAuthTries=3, AllowTcpForwarding=nomain.tf user_data
Security GroupSSH from VPC only, egress: S3 via prefix list + VPC internal + SAP RFC ports onlysecurity_groups.tf
Dedicated IAM RoleExtractor-only role (no EMR access), produce-only Kafka, write-only S3 /raw/*iam.tf Extractor Role
Kernel HardeningICMP redirects disabled, TCP forwarding disabledmain.tf user_data sysctl

🔄 Disaster Recovery & Business Continuity

EscenarioRPORTOMecanismo
Corrupción de datos en S30 (versioned)< 1 horaS3 Versioning habilitado. Rollback a versión anterior inmediato. KMS key rotation no afecta versiones existentes.
Borrado accidental de tabla Iceberg0< 30 minIceberg time-travel: SELECT * FROM table TIMESTAMP AS OF '...'. Parquet files permanecen en S3.
Fallo del EC2 Extractor5 min< 15 minCloudWatch StatusCheck alarm → SNS alert. Auto-recovery via EC2 auto-recovery o re-launch con mismo AMI/user_data.
EMR Spark job crash0< 5 minLambda Watchdog detecta en siguiente ciclo (5 min) y auto-restart. Kafka retiene datos no procesados (retention default 7 días).
MSK Kafka outageKafka retentionAWS-managedMSK Serverless es fully managed con multi-AZ built-in. AWS SLA: 99.9%. Datos replicados automáticamente.
AZ failure completa< 30 min< 2 horasMSK y EMR operan en 2 AZs. S3 es multi-AZ by design (11 9's durability). EC2 extractor es single-AZ (SPOF conocido) — re-launch en otra subnet.
Region failure (us-east-1 down)24 horas4-8 horasCross-region replication no habilitada por defecto (costo). Disponible como upgrade: S3 CRR a us-west-2, Terraform re-deploy. SAP source data permanece intacta.

Transparencia: El EC2 Extractor es single-AZ (un SPOF conocido). El riesgo es bajo porque: (1) si falla, solo se detiene la extracción — los datos existentes en S3/Iceberg siguen disponibles para queries, (2) recovery es automatizable en <15 min, (3) Kafka retiene los datos para re-procesamiento. Para clientes que requieren HA de extracción, ofrecemos Auto Scaling Group con min=1 como upgrade.

📋 SLA con Dientes — Penalidades Financieras

MétricaCompromisoPenalidad por Incumplimiento
Pipeline Uptime99.5% mensual< 99.5%: 10% crédito. < 99.0%: 25% crédito. < 95%: 50% crédito sobre mensualidad de infraestructura.
Data FreshnessDatos en Iceberg < 1 hora de antigüedad (modo continuo)Si data freshness > 4 horas por causa atribuible a CIRO (no SAP/VPN): 5% crédito.
Soporte — Severidad 1Respuesta < 1 hora (pipeline down, data loss)Si respuesta > 2 horas: 5% crédito.
Soporte — Severidad 2Respuesta < 4 horas laboralesSi respuesta > 8 horas: crédito proporcional.
Seguridad — Incident ResponseNotificación < 24 horas de detección de breachObligación contractual. Incumplimiento = breach de contrato.

📜 Data Processing Agreement (DPA)

Compromisos de CIRO
  • Data Residency: Todos los datos en AWS us-east-1 (Virginia). No se migran a otra región sin autorización escrita del cliente.
  • Data Ownership: 100% propiedad del cliente. CIRO es procesador, no propietario.
  • Data Retention: Indefinida (históricos completos). Eliminación bajo solicitud del cliente en < 30 días.
  • Sub-processors: AWS es el único sub-procesador. No se comparten datos con terceros.
  • PII Handling: KNA1 (nombres/direcciones) cifrado con KMS. No se extraen datos HR/HCM, contraseñas, ni datos bancarios personales.
Derechos del Cliente
  • Auditoría: Derecho a auditar la configuración de infraestructura. Terraform code disponible para revisión.
  • Portabilidad: Datos en formato Iceberg abierto (Parquet + JSON metadata). Exportable sin vendor lock-in.
  • Eliminación: Solicitud de borrado completo (S3 bucket delete + KMS key schedule deletion) en < 30 días.
  • Acceso: Acceso directo vía Athena workgroup propio. No depende de CIRO para consultar sus datos.
  • Terraform Modules: En caso de cancelación, el cliente puede solicitar los módulos Terraform para operar la infraestructura de forma independiente.

🚪 Estrategia de Salida — Sin Lock-in

ComponentePortabilidadTiempo EstimadoCosto
Datos en S3/Iceberg100% portable — Parquet + Iceberg metadata. Compatible con Spark, Trino, Athena, Snowflake, Databricks.Inmediato (S3 copy)Solo costo de transfer S3 (~$0.09/GB)
Glue CatalogExport vía AWS CLI. Compatible con cualquier Hive-compatible metastore.< 1 hora$0
Redshift DataUNLOAD to S3 en CSV/Parquet. Importable a cualquier warehouse.2-4 horas$0
Terraform ModulesEntregables al cliente bajo solicitud. Puede operar infra independientemente.N/A$0
CIRO AI PlatformLa plataforma CIRO (chat, dashboards, visualizaciones) no es portable — es SaaS.N/ASe pierde acceso al cancelar
Migración AsistidaCIRO asiste con migración completa a la plataforma destino del cliente1-2 semanasIncluido (primeras 10 horas). Adicional a $85/hr.

🚀 CI/CD & Deployment Pipeline

Infrastructure (Terraform)
  • Git repo con state remoto en S3 + DynamoDB locking
  • terraform plan → review → terraform apply
  • State file cifrado con KMS
  • Rollback: terraform apply con commit anterior
Application Code (Spark/Lambda/Extractor)
  • Deploy scripts: deploy/tenant/deploy_pipeline.sh {tenant_id}
  • S3 staging: s3://{bucket}/spark-jobs/ → EMR lee de S3
  • Lambda: zip deploy via Terraform aws_lambda_function
  • EC2: Docker containers con versiones pinned. SSM para updates sin SSH.
  • Rollback: S3 versioning en spark-jobs prefix. Lambda aliases.

⚠️ Redshift Dual-Write — Alerting de Fallos

Concern válido: El Redshift dual-write es non-blocking — si falla, Iceberg sigue funcionando pero Power BI ve datos stale. Cómo lo detectamos:

  • Data Quality Lambda (dq_alert.py) corre cada 2 horas y verifica bi.dq_check_results — detecta si las tablas de Redshift no se actualizaron.
  • Freshness check: Compara MAX(ingestion_time) en Redshift vs timestamp actual. Si delta > 4 horas → SNS alert.
  • Spark logs: Los errores de Redshift write se loggean a CloudWatch con Redshift write failed for {table} — metric filter detectable.
  • Fallback: Si Redshift está down, Power BI puede conectarse directamente a Athena → Iceberg (sin Redshift) como fallback temporal.

⏱️ Latencia del Pipeline — EMR Idle & Cold Start

Concern: En modo triggered, EMR se apaga después de 30 min idle. ¿Qué pasa con los datos?

  • Kafka retiene todos los mensajes (retention default: 7 días). Ningún dato se pierde durante el idle.
  • Modo continuo (default): EMR streaming job corre 24/7. Lambda watchdog cada 5 min verifica que esté activo. Latencia típica: 30-60 segundos.
  • Modo triggered: Lambda cada 30 min verifica lag. Si hay datos, inicia job. Cold start: ~2-3 minutos (pre-initialized capacity). Latencia peor caso: 33 min.
  • Initial Capacity configurada: 1 Driver (2 vCPU, 4 GB) + 2 Executors (4 vCPU, 8 GB) pre-warmados para eliminar cold start.
  • "Near real-time" = modo continuo. El asterisco aplica solo a modo triggered, que es opt-in para clientes que prefieren menor costo sobre menor latencia.
📐

Diagramas Técnicos

Secuencias, flujos de decisión y áreas de cobertura de la plataforma

Secuencia — Pipeline End-to-End (producción real)

sequenceDiagram
    participant SAP as SAP ECC
10.x.x.x:3200 participant VPN as IPsec VPN
Claro ISP participant EC2 as EC2 Extractor
c5.4xlarge participant MSK as Kafka MSK
Port 9098 IAM participant LBD as Lambda Watchdog
EventBridge 5min participant EMR as Spark EMR
Serverless participant S3 as S3 Iceberg
KMS encrypted participant GLU as Glue Catalog
90+ tables participant RS as Redshift
Serverless participant PBI as Power BI
DirectQuery EC2->>VPN: pyrfc RFC_READ_TABLE VPN->>SAP: TCP 3200-3399 SAP-->>VPN: Rows (15K-200K batch) VPN-->>EC2: Data over tunnel EC2->>EC2: Dynamic batch sizing EC2->>MSK: produce(topic=sap-tenant-TABLE, batch=500 rows/msg) Note over MSK: 106 partitions across 90+ topics LBD->>EMR: Check job status every 5min alt Job not running LBD->>EMR: StartJobRun(iceberg_consumer.py) else Stuck > 6 hours LBD->>EMR: CancelJobRun + StartJobRun end EMR->>MSK: subscribePattern(sap-tenant-*) EMR->>EMR: explode(500 rows/msg) per table EMR->>EMR: ThreadPoolExecutor(8 writers) loop Per SAP Table (parallel) EMR->>GLU: Check table exists? alt Table exists EMR->>EMR: Schema evolution check EMR->>S3: MERGE INTO on primary keys else New table EMR->>S3: CREATE TABLE + writeTo() EMR->>GLU: Register in catalog end EMR->>RS: Dual-write (non-blocking) end RS->>PBI: JDBC DirectQuery

Lambda Watchdog — Self-Healing Logic

flowchart TD
    A["EventBridge
every 5 min"] --> B["Lambda Handler"] B --> C{"STREAMING_MODE?"} C -- continuous --> D["List EMR jobs
state=RUNNING"] C -- triggered --> T["Check Kafka lag
> 1000 msgs?"] T -- No --> U["Exit: no data"] T -- Yes --> V["Submit batch job"] D --> E{"Running jobs?"} E -- 0 --> F["Start new streaming job"] E -- 1 --> G{"Age > 6 hours?"} E -- ">1" --> H["Cancel duplicates
keep newest"] G -- Yes --> I["Cancel stuck job"] I --> F G -- No --> J["Healthy - no action"] F --> K["emr.start_job_run()"] K --> L["sparkSubmit:
iceberg_consumer.py"] L --> M["Env: S3_BUCKET, GLUE_DB
KAFKA_BOOTSTRAP, TENANT_ID
REDSHIFT_JDBC_URL"] style A fill:#dbeafe,stroke:#2563eb style J fill:#dcfce7,stroke:#16a34a style I fill:#fee2e2,stroke:#dc2626

Iceberg MERGE INTO — Upsert Logic

flowchart TD
    A["Kafka micro-batch
(30s trigger)"] --> B["Explode JSON
500 rows/msg"] B --> C["Group by
sap_table_name"] C --> D["_write_single_table()"] D --> E{"Table exists
in Glue?"} E -- No --> F["CREATE TABLE
Iceberg + Parquet + Snappy"] F --> G["Set table properties
sap.table.group, .type, .description"] E -- Yes --> H{"Schema changed?"} H -- Yes --> I["ALTER TABLE
ADD COLUMN"] I --> J["SNS Alert"] H -- No --> K{"Primary keys
defined?"} K -- Yes --> L["MERGE INTO target
USING source
ON key match"] L --> M["WHEN MATCHED
→ UPDATE SET"] L --> N["WHEN NOT MATCHED
→ INSERT"] K -- No --> O["APPEND mode
(no dedup)"] M --> P["Redshift dual-write"] N --> P O --> P style L fill:#dbeafe,stroke:#2563eb style I fill:#fef3c7,stroke:#d97706 style F fill:#dcfce7,stroke:#16a34a

Secuencia — SCD Type 2 en Redshift (Master Data)

sequenceDiagram
    participant SPK as Spark EMR
    participant STG as Redshift staging
    participant TGT as Redshift bi.kna1_v2
    participant AUD as bi.audit_log

    SPK->>STG: COPY via S3 unload (temp parquet)
    Note over STG: staging.kna1_staged
Fresh rows from Kafka STG->>STG: Compute MD5 hash
COALESCE(name1||addr) per row STG->>TGT: Compare s.row_hash != t.row_hash alt Hash changed (customer updated) TGT->>TGT: UPDATE SET is_current=false, valid_to=NOW() STG->>TGT: INSERT new version (is_current=true, valid_from=NOW()) STG->>AUD: INSERT audit_log (operation=UPDATE, old_hash, new_hash) else New customer STG->>TGT: INSERT (is_current=true, valid_from=NOW(), valid_to=NULL) STG->>AUD: INSERT audit_log (operation=INSERT) end STG->>STG: TRUNCATE staging table Note over TGT: Power BI queries WHERE is_current=true

Terraform — Provisión por Tenant

flowchart TD
    A["POST /data-lake/provision"] --> B["DataLakeProvisioningService"]
    B --> C{"Quota tier?"}
    C -- ENTERPRISE --> D["pipeline_enabled=false"]
    C -- ENTERPRISE_PRO --> E["pipeline_enabled=true"]
    D --> F["terraform apply"]
    E --> F
    F --> G["modules/tenant/"]
    G --> H["S3 Bucket
KMS + versioning"] G --> I["Glue DB
singularity_tenant_db"] G --> J["Athena Workgroup
scan limit"] G --> K{"pipeline_enabled?"} K -- true --> L["MSK Serverless
IAM auth"] K -- true --> M["EMR Serverless
Spark 3.5"] K -- true --> N["EC2 Extractor
c5.xlarge"] K -- true --> O["Lambda Watchdog
EventBridge"] K -- true --> P["CloudWatch
7 alarms"] K -- false --> Q["Storage only
$50/mo"] style H fill:#dcfce7,stroke:#16a34a style L fill:#dbeafe,stroke:#2563eb style Q fill:#fef3c7,stroke:#d97706

Seguridad — 7 Capas de Protección

flowchart LR
    A["Internet"] --> B["VPC
Private subnets"] B --> C["Security Groups
Port-level rules"] C --> D["IAM Roles
Least privilege"] D --> E["KMS Encryption
At rest + transit"] E --> F["S3 Policies
Deny HTTP + unencrypted"] F --> G["CloudTrail
API audit log"] G --> H["Metric Filters
Root login, IAM changes"] style A fill:#fee2e2,stroke:#dc2626 style B fill:#fef3c7,stroke:#d97706 style C fill:#fef3c7,stroke:#d97706 style D fill:#dbeafe,stroke:#2563eb style E fill:#dbeafe,stroke:#2563eb style F fill:#dcfce7,stroke:#16a34a style G fill:#dcfce7,stroke:#16a34a style H fill:#dcfce7,stroke:#16a34a

Cobertura de la Plataforma CIRO

Data Lake
S3 + Iceberg
BI + Analytics
Power BI + Chat
AI / ML
NLP + Predicciones
CIRO
Singularity

CIRO unifica las tres áreas que normalmente requieren herramientas separadas: almacenamiento de datos, análisis de negocio e inteligencia artificial — en una sola plataforma integrada.

CIRO vs Competencia — Áreas de Fortaleza

CIRO Singularity
SAP
Nativo
Real-
time
BI +
Chat AI
$3,500/mes todo incluido
Microsoft Fabric
Power
BI Pro
Data
Lake
Spark
Generic
Sin SAP nativo · ~$6K+/mes

CIRO vs La Competencia — Comparación Técnica

Comparación exhaustiva contra Microsoft Fabric, Snowflake + Fivetran, y Databricks

Criterio 🔵 CIRO Singularity 🟣 Microsoft Fabric ❄️ Snowflake + Fivetran 🧱 Databricks
Conector SAP ✅ RFC nativo (pyrfc) incluido ⚠️ Theobald Xtract (~$18K/año) o SAP CDC preview ⚠️ Fivetran HVR SAP (~$1,500-3,000/mes) ⚠️ Partner (SNP Glue, Theobald) ~$18-30K/año
Latencia SAP→Query ✅ ~1 min (streaming Kafka) ⚠️ 15-60 min (Data Factory batch) ⚠️ 5-60 min (Fivetran sync) ✅ 1-5 min (con Auto Loader)
Formato de Datos ✅ Apache Iceberg (abierto) ⚠️ Delta Lake / OneLake (propietario) ⚠️ Propietario (micro-partitions) ✅ Delta Lake (open source)
Seguridad de Red ✅ 100% VPC privada, 0 puertos públicos ⚠️ OneLake endpoint público por defecto ⚠️ Endpoint público + Private Link ($$$) ✅ VPC injection disponible (costo extra)
Multi-Tenant ✅ Aislamiento físico total (S3/KMS/IAM) ⚠️ Aislamiento lógico (RBAC, CU compartidos) ✅ Cuentas separadas posibles ⚠️ Unity Catalog (lógico)
IA Nativa ✅ Chat AI especializado SAP · 50+ viz ✅ Copilot (genérico) ✅ Cortex AI (reciente, limitado) ✅ Mosaic AI (potente, caro)
Vendor Lock-in ✅ Formato abierto, migrable ⚠️ Fuerte dependencia Microsoft ⚠️ Formato propietario, lock-in fuerte ✅ Delta Lake abierto, pero plataforma propia
Power BI ✅ DirectQuery vía Redshift ODBC ✅ Direct Lake nativo (más fluido) ✅ DirectQuery vía connector ✅ DirectQuery via Databricks SQL
Costo Mensual Total* ~$3,500/mes ~$4,300-7,400/mes ~$5,500-9,000/mes ~$4,800-8,500/mes

* Escenario: SAP ECC con 350M+ filas, 535 GB, 90 tablas, streaming pipeline, BI queries, 10-15 usuarios. Ver desglose detallado abajo.

💰

Análisis de Costos — Desglose Real con Precios Verificados

Precios publicados de AWS, Microsoft Azure, Snowflake y Databricks. Marzo 2026. Región us-east-1.

🔵 CIRO Singularity — Desglose Real de Costos AWS

Precios basados en tarifas publicadas de AWS para us-east-1. Calculado para el perfil de Campestre.

AWS Infrastructure Cost Calculator — Campestre Production
Servicio AWSSpecs / UsoTarifa PublicadaCosto/Mes
🖥️ EC2 c5.4xlarge16 vCPU, 32GB RAM, 24/7$0.68/hr on-demand$496
💿 EBS gp3 50GB3,000 IOPS, 125 MB/s$0.08/GB/mes + IOPS$8
📨 MSK Serverless~34 topics, ~500GB throughput/mes$0.75/cluster-hr + $0.10/GB in + $0.05/GB out$625
⚡ EMR ServerlessSpark 3.4, ~100 vCPU-hrs/día$0.052624/vCPU-hr + $0.0058/GB-hr$195
📊 Redshift Serverless128 RPU, ~4 hrs/día query activity$0.375/RPU-hr (on-demand)$480
🪣 S3 Storage535 GB standard + requests$0.023/GB/mes + $0.005/1K PUT$18
🔐 KMS Keys (2)2 CMKs + ~500K requests/mes$1/key/mes + $0.03/10K requests$4
🔑 Secrets Manager3 secrets + access$0.40/secret/mes + $0.05/10K calls$2
🔐 VPN Site-to-Site1 connection, 2 tunnels, 24/7$0.05/hr/connection$36
📚 Glue Catalog90 tables, ~200K requests/mesFree tier (first 1M objects/requests)$0
🔍 Athena~50 queries/día, ~200GB scanned/mes$5/TB scanned$1
⏰ Lambda Watchdog288 invocations/día (cada 5 min)Free tier covers this$0
📋 CloudTrailManagement events + S3 logsFirst trail free, $2/100K data events$5
TOTAL INFRAESTRUCTURA AWS$1,870/mes
📝 Notas de cálculo:
• EC2 on-demand es el precio máximo. Con Reserved Instance (1 año) baja a ~$310/mes (-37%). Con Savings Plan a ~$280/mes (-43%).
• MSK Serverless: cluster $0.75/hr ($547) + ~500GB data in ($50) + ~300GB data out ($15) + partitions ($13) = ~$625.
• Redshift: 128 RPU × $0.375 × ~10 hrs/día queries × 30 = ~$480. Con reservación 1 año baja ~24% a $365.
• EMR Serverless: estimado ~100 vCPU-hrs/día de procesamiento activo. Solo se paga cuando corre un job.

🔵 Costo Total CIRO (Infraestructura + Servicio)

CIRO Total Cost of Ownership — Campestre
ConceptoDetalleCosto/Mes
☁️ Infraestructura AWSEC2 + MSK + EMR + Redshift + S3 + VPN + KMS (ver desglose arriba)$1,870
🤖 CIRO Platform LicenseAI Chat (Claude Sonnet), 50+ visualizaciones, BSC Dashboards, Transformation Studio, Maps, Forecasting, Anomaly Detection$830
🛡️ Gestión de InfraestructuraSeguridad 24/7, monitoreo y alertas, gestión de conectores SAP + todos los data sources, transformaciones de datos, actualizaciones de seguridad, soporte técnico dedicado$800
TOTAL CIRO MENSUAL$3,500/mes
TOTAL ANUAL$42,000/año

🟣 Microsoft Fabric — Desglose Real

Para manejar 350M filas de SAP con pipeline de ingestión, Lakehouse, y BI. Precios Azure Pay-As-You-Go.

Microsoft Fabric Cost Calculator — Comparable Scenario
ComponenteDetalleTarifaCosto/Mes
🟣 Fabric Capacity (F32)32 CU — mínimo para ETL + Lakehouse + SQL (reservación 1 año)~$0.11/CU/hr × 32 CU × 730 hrs$2,570
🟣 Fabric Capacity (F64)64 CU — necesario si concurrencia >10 usuarios (reservación 1 año)~$0.11/CU/hr × 64 CU × 730 hrs$5,140
🏭 SAP ConnectorTheobald Xtract Universal (licencia anual)~$18,000-25,000/año$1,500-$2,083
📈 Power BIIncluido con Fabric Capacity (Direct Lake)$0 (incluido)
🪣 OneLake Storage535 GB datos + metadatos + logs~$0.023/GB (similar a S3)$15
🔧 Azure Data FactoryPipeline runs para SAP extraction$1/1K activity runs + $0.25/DIU-hr$200
TOTAL FABRIC (F32 — Mínimo Viable)$4,285-$4,868/mes
TOTAL FABRIC (F64 — Recomendado)$6,855-$7,438/mes
TOTAL ANUAL (F64)$82,260-$89,256/año
📝 Notas Fabric:
• Precios con reservación 1 año (descuento ~40% vs pay-as-you-go). Sin reserva, F64 sube a ~$8,410/mes solo en capacity.
• F32 podría funcionar para cargas ligeras, pero con 350M filas y ETL frecuente, F64 es la recomendación de Microsoft para evitar throttling.
• Theobald Xtract Universal es el conector SAP más usado con Fabric. Licencia per-server ~$18-25K/año. No hay conector SAP RFC nativo en Fabric.
• Power BI está incluido con Fabric Capacity (Direct Lake). No se requiere licencia Pro/Premium separada.
• Fuentes: Azure Fabric Pricing, Synapx 2026 Guide

❄️ Snowflake + Fivetran — Desglose Real

Snowflake + Fivetran Cost Calculator — Comparable Scenario
ComponenteDetalleTarifaCosto/Mes
❄️ Snowflake ComputeMedium warehouse (~4 credits/hr) ~8 hrs/día$2-3/credit (Standard on-demand)$1,920-$2,880
❄️ Snowflake Storage535 GB (compressed ~200 GB)$23/TB/mes (AWS us-east-1)$5
🔌 Fivetran SAP ConnectorHVR SAP connector + monthly active rowsBusiness tier: $1.50-3.00/1K MAR$2,000-$3,500
📈 Power BI Pro (10 usuarios)$14/user/mes$14 × 10$140
🤖 Snowflake Cortex AILLM queries para análisis (si se usa)$1.50-5.00/1M tokens$100-$300
TOTAL SNOWFLAKE + FIVETRAN$4,165-$6,825/mes
TOTAL ANUAL$49,980-$81,900/año
📝 Notas Snowflake:
• Credits on-demand cuestan $2/credit (Standard) a $4/credit (Enterprise). Con commitment anual bajan a ~$1.50-2.50.
• Fivetran SAP HVR es el connector más maduro pero caro. Monthly Active Rows (MAR) pricing puede explotar con 350M filas.
• Snowflake no incluye visualizaciones — necesitas Power BI, Tableau ($70/user/mes), o Looker adicional.
• No hay AI chat nativo especializado en SAP. Cortex AI es genérico.
• Fuentes: Snowflake Pricing, Mammoth Guide 2026

🧱 Databricks — Desglose Real

Databricks Cost Calculator — Comparable Scenario
ComponenteDetalleTarifaCosto/Mes
🧱 Jobs Compute (ETL)Delta Live Tables, ~6 hrs/día procesamiento$0.20-0.50/DBU (Premium) + AWS infra$800-$1,500
🧱 SQL Warehouse (BI)Medium, ~8 hrs/día para queries$0.22-0.55/DBU + AWS infra$1,200-$2,400
☁️ AWS Infra (EC2 + S3)Underlying compute + storage (50-200% of DBU cost)Variable (EC2 spot/on-demand)$1,000-$2,000
🏭 SAP ConnectorTheobald or SNP Glue connector~$18-30K/año$1,500-$2,500
📈 Power BI Pro (10 usuarios)$14/user/mes$14 × 10$140
TOTAL DATABRICKS$4,640-$8,540/mes
TOTAL ANUAL$55,680-$102,480/año
📝 Notas Databricks:
• Standard tier se descontinuó en Oct 2025 (AWS/GCP). Solo Premium ($0.40+/DBU) y Enterprise disponibles.
• AWS infrastructure cost is 50-200% ON TOP of DBU charges — budget 2-3x the DBU quote for the full picture.
• No incluye visualizaciones nativas (solo notebooks). Necesitas Power BI, Tableau o Redash separado.
• Mosaic AI es potente pero premium — agrega costos significativos por LLM serving.
• Fuentes: Databricks Pricing, Mammoth Guide 2026

📊 Comparación Visual — Costo Mensual Total

Monthly Total Cost Comparison — Same SAP Workload (350M rows, 535 GB)
🔵 CIRO Singularity (Infra + Platform + Gestión)$3,500/mes
$3,500
❄️ Snowflake + Fivetran (midpoint)$5,500/mes
$5,500
🧱 Databricks (midpoint)$6,600/mes
$6,600
🟣 Microsoft Fabric F32 + Theobald (minimum, 1yr reserved)$4,600/mes
$4,600
🟣 Microsoft Fabric F64 + Theobald (recommended, 1yr reserved)$7,100/mes
$7,100
vs Fabric F64 (reserved)
$43,200/año
AHORRO (51% menos)
vs Snowflake
$24,000/año
AHORRO (36% menos)
vs Databricks
$37,200/año
AHORRO (47% menos)
📋

Propuesta Económica Formal — CIRO Singularity Data Lake

Oferta de servicios para Grupo Avícola Campestre. Válida hasta 30 de abril 2026.

🎁

Implementación Incluida — Sin Costo de Setup

La implementación completa (infraestructura AWS, VPN, conector SAP, pipeline streaming, Redshift, Power BI, CIRO AI, y capacitación) está incluida sin costo adicional al contratar el servicio mensual. Tiempo estimado de implementación: 4-6 semanas.

📅 Servicio Mensual Todo Incluido

CIRO Singularity — Servicio Mensual
ConceptoIncluyeMensual
☁️ Infraestructura AWS EC2 c5.4xlarge ($496) + MSK Serverless ($625) + EMR Serverless ($195) + Redshift 128 RPU ($480) + S3 535GB ($18) + VPN ($36) + KMS/Secrets/CloudTrail ($11) $1,870
🤖 CIRO AI Platform Licencia: AI Chat (Claude Sonnet), 50+ visualizaciones, BSC Dashboards, Transformation Studio, Maps, Forecasting, Anomaly Detection $830
🛡️ Gestión de Infraestructura Seguridad y monitoreo 24/7, alertas CloudWatch/CloudTrail, gestión de conectores (SAP + todos los data sources incluidos), transformaciones de datos, mantenimiento pipeline Spark/Kafka, actualizaciones de seguridad, soporte técnico dedicado por Slack/email $800
TOTAL MENSUAL RECURRENTE$3,500/mes

🔌 Servicios Adicionales (Bajo Demanda)

Servicios Adicionales — Catálogo de Precios
ServicioDescripciónCosto
🔌 Nuevos Conectores de Datos
PostgreSQL / MySQL / SQL ServerConfiguración JDBC, mapeo de tablas, pipeline de ingestión$0 (incluido)
REST API / Google Sheets / CSVConfiguración de endpoint, scheduling, transformaciones$0 (incluido)
SAP S/4HANA o SAP B1OData/CDS setup, communication arrangements, testing$500 setup único
Salesforce / HubSpotOAuth2 app, Bulk API, mapeo objetos, delta sync$750 setup único
Shopify / QuickBooksAPI privada, mapeo entidades, webhook sync$500 setup único
IoT / MQTT / StreamingMQTT bridge, Kafka topic, real-time processing$750 setup único
ERP Custom / SOAP / LegacyAnálisis técnico, desarrollo conector, testing$1,000 setup único
📊 Dashboards y Reportería
Dashboard CustomDiseño, desarrollo, y deployment de dashboard personalizado$300-$800 por dashboard
Power BI ReportDesarrollo de reporte Power BI con Redshift DirectQuery$400-$1,000 por reporte
BSC Dashboard CustomBalanced Scorecard con KPIs, strategy map, drill-down$800-$1,500
🔧 Servicios Profesionales
Hora de IngenieríaDesarrollo custom, integraciones, optimizaciones$85/hora
Hora de Consultoría BIAnálisis de datos, diseño de métricas, estrategia BI$100/hora
Capacitación AdicionalSesión de 2 horas (hasta 10 personas)$200/sesión
📈 Upgrades de Infraestructura
EC2 Upgrade (c5.4xl → c5.9xl)36 vCPU, 72 GB RAM — para extracción masiva+$855/mes (infra)
Redshift 256+ RPUDuplicar capacidad de queries para >30 usuarios concurrentes+$480/mes (infra)
Segundo Data Source PipelinePipeline completo adicional (Kafka topics, Spark jobs, Glue tables)+$200-400/mes (infra)

📋 Resumen Ejecutivo de la Propuesta

🔵 Inversión Primer Año

Implementación$0 (incluida)
Servicio Mensual × 12$42,000
Total Año 1$42,000
Solo $3,500/mes — sin setup fee, sin costos ocultos

💰 Ahorro vs Alternativas (Año 1)

vs Fabric F64 ($85K/año)Ahorro: $43,000
vs Snowflake ($66K/año)Ahorro: $24,000
vs Databricks ($79K/año)Ahorro: $37,000
ROI Año 136-51% menos
Y CIRO incluye conector SAP nativo + AI Chat + 50+ visualizaciones

📉 Oportunidades de Reducción de Costo (Meses 3-6)

Una vez estabilizado el pipeline, podemos reducir el costo AWS con:
EC2 Reserved Instance (1 año): $496 → $310/mes (-$186)
Redshift Reservation (1 año): $480 → $365/mes (-$115)
EC2 Spot para Spark workers: hasta -60% en EMR compute
S3 Intelligent-Tiering: datos históricos >90 días automáticamente más baratos

Costo mensual optimizado estimado: ~$3,100/mes (vs $3,500 on-demand) — ahorro adicional de $4,800/año en infraestructura AWS.

📝 Términos y Condiciones

Vigencia: Propuesta válida hasta 30 de abril 2026.
Contrato: Mínimo 6 meses de servicio mensual. Renovación automática anual.
Facturación: Mensualidad facturada al inicio de cada mes. Implementación incluida sin costo adicional.
Infraestructura AWS: Costo pass-through directo de AWS (factura AWS visible para el cliente). Puede variar ±15% según uso real. La Gestión de Infraestructura ($800/mes) cubre seguridad, monitoreo, conectores, y transformaciones.
SLA: 99.5% uptime mensual. Penalidades: <99.5% = 10% crédito, <99.0% = 25% crédito, <95% = 50% crédito sobre mensualidad de infraestructura. Soporte S1: <1 hora. S2: <4 horas laborales.
DPA: Data Processing Agreement incluido. Data residency: us-east-1 (Virginia). CIRO es procesador, no propietario. Único sub-procesador: AWS. Notificación de breach: <24 horas.
Datos: 100% propiedad del cliente. Formato Iceberg abierto (Parquet). Exportable sin lock-in. Terraform modules entregables bajo solicitud.
Cancelación: 30 días de aviso. Migración asistida incluida (primeras 10 horas). Eliminación completa de datos en <30 días bajo solicitud.
Moneda: Todos los precios en USD. Facturación en GTQ al tipo de cambio del día.
🔵
CIRO AI + Singularity Data Lake
Inteligencia de datos empresarial para SAP — a una fracción del costo
Setup: $0 (incluido)
Mensual: $3,500/mes
Año 1: $42,000 total
Ahorra hasta $43,000/año vs Microsoft Fabric — implementación incluida