Skip to content

Infraestructura

Principios

  1. Local-first: Todo el stack corre en Docker Compose para desarrollo local
  2. AWS-native en produccion: Servicios gestionados donde sea posible (menos operacion)
  3. Costo-eficiente: Serverless y auto-scaling para pagar solo por lo que se usa
  4. FTR-compliant: Diseñado para certificacion AWS Partner desde el inicio
  5. Multi-region ready: Arquitectura preparada para despliegue en multiples regiones

Entorno Local (Docker Compose)

docker-compose.infra.yml

Infraestructura compartida que todos los servicios necesitan:

yaml
services:
  postgres:
    image: postgres:16-alpine
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: imagy_admin
      POSTGRES_PASSWORD: localdev
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U imagy_admin"]
      interval: 5s
      timeout: 3s
      retries: 5

  valkey:
    image: valkey/valkey:8-alpine
    ports:
      - "6379:6379"
    command: >
      valkey-server
      --save 60 1000
      --appendonly yes
      --maxmemory 256mb
      --maxmemory-policy allkeys-lru
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  rabbitmq:
    image: rabbitmq:3-management-alpine
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      RABBITMQ_DEFAULT_USER: imagy
      RABBITMQ_DEFAULT_PASS: localdev
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_running"]
      interval: 10s
      timeout: 5s
      retries: 5

  keycloak:
    image: quay.io/keycloak/keycloak:24.0
    ports:
      - "8080:8080"
    command: start-dev
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: imagy_admin
      KC_DB_PASSWORD: localdev
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  pgdata:

Levantar el entorno

bash
# Infraestructura
docker compose -f docker-compose.infra.yml up -d

# Cada servicio individualmente
dotnet run --project src/Imagy.Flow.Api

# O todos los servicios con compose
docker compose up -d

Entorno de Produccion (AWS)

Servicios AWS

Compute

ServicioUsoJustificacion
ECS FargateTodos los microservicios .NETServerless containers, sin EC2 que gestionar, auto-scaling
ECS Service ConnectComunicacion interna entre serviciosService mesh nativo, sin YARP interno
CloudFrontAssets estaticos del frontendCDN global, cache, HTTPS

Datos

ServicioUsoJustificacion
Aurora PostgreSQL Serverless v2Base de datos principalAuto-scaling, Multi-AZ, read replicas, pago por uso
ElastiCache Valkey ServerlessCache y sesionesCompatible Redis, auto-scaling, sin nodos que gestionar
Amazon MQ for RabbitMQMensajeria entre serviciosManaged RabbitMQ, Multi-AZ, sin operacion
S3Documentos, imagenes, evidenciasDurabilidad 11 9s, encryption SSE-KMS, lifecycle policies

Seguridad

ServicioUso
AWS WAFProteccion OWASP, rate limiting, geo-blocking
AWS KMSCustomer Managed Keys para encryption
AWS Secrets ManagerCredenciales con rotacion automatica
AWS GuardDutyThreat detection
AWS Security HubCompliance dashboard
AWS CloudTrailAudit de API calls AWS

Observabilidad

ServicioUso
CloudWatch LogsCentralized logging (Serilog sink)
CloudWatch MetricsMetricas custom por servicio
CloudWatch AlarmsAlertas (latencia, errores, CPU)
AWS X-RayDistributed tracing entre servicios
CloudWatch DashboardsVisualizacion operacional

Networking

ServicioUso
VPCAislamiento de red
ALBLoad balancing + TLS termination
NAT GatewaySalida controlada a internet (proveedores)
VPC EndpointsAcceso privado a S3, Secrets Manager, KMS
Route 53DNS management, wildcard, health checks
ACMCertificados TLS auto-renovables

CI/CD

ServicioUso
GitHub ActionsBuild, test, push to ECR
ECRContainer registry
ECS DeployRolling deployment (via GitHub Actions)
AWS CDKInfrastructure as Code (TypeScript)

Sizing y Costos Estimados

Ambiente de Desarrollo/Staging

ComponenteConfiguracionCosto estimado/mes
ECS Fargate (6 servicios)0.25 vCPU, 0.5 GB cada uno~$50
Aurora Serverless v20.5-2 ACU~$45
ElastiCache ServerlessBaseline~$15
Amazon MQmq.t3.micro single~$25
ALB1 ALB~$20
NAT Gateway1 AZ~$35
S3Minimal~$5
Total staging~$195/mes

Ambiente de Produccion (inicial)

ComponenteConfiguracionCosto estimado/mes
ECS Fargate (6 servicios)0.5 vCPU, 1 GB, 2 tasks cada uno~$200
Aurora Serverless v21-8 ACU, Multi-AZ~$150
ElastiCache ServerlessAuto-scaling~$50
Amazon MQmq.m5.large Multi-AZ~$200
ALB1 ALB~$25
NAT Gateway2 AZ~$70
CloudFrontModerate traffic~$30
WAFCore rules~$25
S3 + KMSModerate storage~$20
Secrets Manager~20 secrets~$10
CloudWatchLogs + metrics~$50
Total produccion~$830/mes

Nota: Costos estimados para us-east-1. Varian por region y uso real.

Auto-Scaling

ECS Fargate

yaml
# Cada servicio escala independientemente
scaling:
  min_tasks: 2          # Minimo para alta disponibilidad
  max_tasks: 10         # Maximo por servicio
  target_cpu: 70%       # Escalar cuando CPU > 70%
  target_memory: 80%    # Escalar cuando memoria > 80%
  scale_in_cooldown: 300s
  scale_out_cooldown: 60s

Aurora Serverless v2

yaml
scaling:
  min_acu: 0.5          # Minimo (puede bajar a 0.5 en inactividad)
  max_acu: 16           # Maximo (escala automaticamente)
  # No requiere configuracion manual - escala por demanda

Alta Disponibilidad

ComponenteEstrategia
ECS FargateMin 2 tasks en diferentes AZs
AuroraMulti-AZ con failover automatico
ElastiCacheMulti-AZ con replicas
Amazon MQMulti-AZ deployment
ALBMulti-AZ por defecto
S311 9s durabilidad, cross-AZ por defecto

Disaster Recovery

EscenarioRPORTOEstrategia
Fallo de AZ0< 1 minMulti-AZ automatico
Fallo de region< 5 min< 30 minAurora Global Database + ECS cross-region
Corrupcion de datos< 1 hora< 2 horasAurora point-in-time recovery
Eliminacion accidental0< 15 minS3 versioning + Aurora backups

Deployment Pipeline

Estrategia de Deploy

AmbienteTriggerEstrategiaRollback
StagingPush to developAutomatico, rolling updateAutomatico si health check falla
ProductionPush to main (via release)Manual approval + rolling updateAutomatico + manual option

Rolling Update (ECS)

yaml
deployment:
  minimum_healthy_percent: 100    # Nunca menos del 100% de tasks sanas
  maximum_percent: 200            # Permite el doble durante deploy
  # ECS lanza nuevas tasks, espera health check, drena las viejas

Infrastructure as Code (AWS CDK)

Repositorio: imagy-infra

imagy-infra/
├── bin/
│   └── app.ts                    # Entry point
├── lib/
│   ├── stacks/
│   │   ├── networking-stack.ts   # VPC, subnets, NAT, security groups
│   │   ├── data-stack.ts         # Aurora, ElastiCache, Amazon MQ
│   │   ├── compute-stack.ts      # ECS cluster, services, ALB
│   │   ├── security-stack.ts     # WAF, KMS, Secrets Manager
│   │   ├── observability-stack.ts # CloudWatch, X-Ray, alarms
│   │   └── dns-stack.ts          # Route 53, ACM certificates
│   └── constructs/
│       ├── fargate-service.ts    # Construct reutilizable por servicio
│       └── aurora-database.ts    # Construct para BD por dominio
├── config/
│   ├── staging.ts
│   └── production.ts
└── cdk.json

FTR Compliance Checklist

RequisitoImplementacionEstado
Multi-AZAurora, ElastiCache, MQ, ECS en 2+ AZsPor diseño
Encryption at-restAurora, S3, ElastiCache con KMS CMKPor diseño
Encryption in-transitTLS en todas las conexionesPor diseño
Centralized loggingCloudWatch Logs con retentionPor diseño
Automated backupsAurora automated + S3 versioningPor diseño
IAM least privilegeTask roles por servicio, no access keysPor diseño
No hardcoded credentialsSecrets Manager exclusivamentePor diseño
Disaster recoveryMulti-AZ + point-in-time recoveryPor diseño
Security monitoringGuardDuty + Security HubPor diseño
Incident responseDocumented runbooksPendiente
Data residencyRegion configurable por tenantPor diseño
Vulnerability managementDependabot + ECR scanningPor diseño

Reimagine Tech LLC — Documentacion Interna