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 | Sí |
| 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
ConditionExpressioncon 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
