MiniStack: El Reemplazo Gratuito de LocalStack que la Comunidad Estaba Esperando

Si usabas LocalStack Community Edition para desarrollo local y CI/CD, probablemente ya te diste cuenta: los servicios core que eran gratuitos dejaron de serlo.

S3, SQS, DynamoDB, Lambda — todo detrás de un plan pago. La licencia pasó de Apache 2.0 a BSL. Los tokens de autenticación ahora son obligatorios incluso en entornos locales. Para muchos equipos, eso fue la gota que rebalsó el vaso.

Nahuel Nucera, un desarrollador que dependía de LocalStack para sus pipelines, decidió no pagar. Construyó su propio reemplazo desde cero. Así nació MiniStack.


Qué es MiniStack

MiniStack es un emulador local de AWS, MIT-licensed, gratuito, sin cuenta, sin API key y sin telemetría. Es un drop-in replacement de LocalStack: tus configuraciones existentes de boto3, AWS CLI, Terraform, CDK y Pulumi funcionan sin cambios de código.

Un solo puerto. 33 servicios AWS. Dos segundos de startup.

# Instalación vía PyPI
pip install ministack
ministack

# O vía Docker
docker run -p 4566:4566 nahuelnucera/ministack

# Verificá que esté corriendo
curl http://localhost:4566/_localstack/health

Lo que lo diferencia de los demás emuladores

El punto fuerte de MiniStack no es solo que sea gratis. Es que no finge.

La mayoría de los emuladores devuelven respuestas stubbeadas para servicios complejos. MiniStack levanta infraestructura real:

  • RDS → spins up containers reales de Postgres o MySQL
  • ElastiCache → corre Redis real
  • ECS → lanza containers Docker reales
  • Athena → ejecuta SQL real via DuckDB

Esto elimina la categoría entera de bugs del tipo “funciona en local, falla en AWS”. Si tu código pasa contra MiniStack, está pasando contra infraestructura que se comporta como producción.


Comparativa rápida

MiniStack LocalStack Community
Precio Gratuito Pago (core services)
Licencia MIT BSL
Servicios 33 Limitado sin pro
Cuenta requerida No
RAM idle ~30MB ~500MB
Imagen Docker ~150MB ~1GB
Startup ~2 segundos ~3.3 segundos
Infraestructura real RDS, Redis, ECS, Athena Solo en Pro

Setup básico con boto3

import boto3
from botocore.config import Config

# S3 con virtual hosted-style addressing
s3 = boto3.client(
    "s3",
    endpoint_url="http://localhost:4566",
    config=Config(s3={"addressing_style": "virtual"}),
    aws_access_key_id="test",
    aws_secret_access_key="test",
    region_name="us-east-1",
)

s3.create_bucket(Bucket="mi-bucket")
s3.put_object(Bucket="mi-bucket", Key="archivo.txt", Body=b"hola mundo")
# AWS CLI
aws --endpoint-url=http://localhost:4566 s3 mb s3://mi-bucket
aws --endpoint-url=http://localhost:4566 s3 ls

Integración con Terraform y Pulumi

Con Terraform, agregás los endpoints en tu configuración de provider:

provider "aws" {
  region                      = "us-east-1"
  access_key                  = "test"
  secret_key                  = "test"
  skip_credentials_validation = true
  skip_requesting_account_id  = true

  endpoints {
    s3       = "http://localhost:4566"
    dynamodb = "http://localhost:4566"
    sqs      = "http://localhost:4566"
    lambda   = "http://localhost:4566"
  }
}

Con Pulumi, en Pulumi.dev.yaml:

config:
  aws:endpoints:
    - s3: http://localhost:4566
      dynamodb: http://localhost:4566

Lambda con warm workers

Uno de los detalles más cuidados de MiniStack es el manejo de Lambda. Las funciones Python se mantienen calientes entre invocaciones: después del primer cold start, el módulo queda importado en un subprocess persistente. Las llamadas siguientes saltean el import, lo que acelera significativamente las suites de tests.

# Deploy de función Lambda
zip function.zip lambda_function.py

aws --endpoint-url=http://localhost:4566 lambda create-function \
  --function-name mi-funcion \
  --runtime python3.11 \
  --role arn:aws:iam::000000000000:role/lambda-role \
  --handler lambda_function.handler \
  --zip-file fileb://function.zip

# Invocación
aws --endpoint-url=http://localhost:4566 lambda invoke \
  --function-name mi-funcion \
  --payload '{"key": "value"}' \
  response.json

Estado del proyecto

MiniStack está en desarrollo activo. La v1.0.7 se publicó hace pocos días e incluye:

  • Soporte para S3 virtual hosted-style addressing
  • Fix de bug en ConditionExpression con claves numéricas en DynamoDB (compatible con PynamoDB)
  • Cobertura de 656 tests automatizados
  • Servicios que eran Pro-only en LocalStack: EC2, Cognito, EMR, ELB, EFS, WAFv2

La arquitectura está pensada para ser extensible: cada servicio es un archivo Python autocontenido en ministack/services/. Agregar un servicio nuevo es cuestión de crear un archivo con handle_request() y reset().


¿Vale la pena el switch?

Si tu equipo usa LocalStack Community y el cambio de licencia te pegó, la respuesta corta es sí. MiniStack cubre los servicios más comunes, tiene una fracción del footprint, y la infraestructura real para RDS/Redis/ECS elimina una categoría entera de bugs de “works on my machine”.

Si estás en LocalStack Pro y usás servicios de nicho muy específicos, revisá la lista de servicios soportados antes de migrar — todavía hay gaps en la cobertura más avanzada.

Para la mayoría de los proyectos backend con AWS: S3, DynamoDB, SQS, Lambda, RDS — MiniStack alcanza y sobra.

# Empezá ahora
pip install ministack
ministack

Repositorio: github.com/Nahuel990/ministack
Sitio oficial: ministack.org