Se você usava LocalStack Community Edition para desenvolvimento local e CI/CD, provavelmente já percebeu: os serviços core que eram gratuitos deixaram de ser.
S3, SQS, DynamoDB, Lambda — tudo atrás de um plano pago. A licença passou de Apache 2.0 para BSL. Os tokens de autenticação agora são obrigatórios até mesmo em ambientes locais. Para muitos times, isso foi a gota d’água.
Nahuel Nucera, um desenvolvedor que dependia do LocalStack para seus pipelines, decidiu não pagar. Construiu seu próprio substituto do zero. Assim nasceu MiniStack.
O que é MiniStack
MiniStack é um emulador local de AWS, licenciado com MIT, gratuito, sem conta, sem API key e sem telemetria. É um drop-in replacement do LocalStack: suas configurações existentes de boto3, AWS CLI, Terraform, CDK e Pulumi funcionam sem mudanças de código.
Uma única porta. 33 serviços AWS. Dois segundos de startup.
# Instalação via PyPI
pip install ministack
ministack
# Ou via Docker
docker run -p 4566:4566 nahuelnucera/ministack
# Verifique se está rodando
curl http://localhost:4566/_localstack/health
O que o diferencia dos demais emuladores
O ponto forte do MiniStack não é só ser grátis. É que não finge.
A maioria dos emuladores retorna respostas stubificadas para serviços complexos. MiniStack levanta infraestrutura real:
- RDS → inicia containers reais de Postgres ou MySQL
- ElastiCache → roda Redis real
- ECS → lança containers Docker reais
- Athena → executa SQL real via DuckDB
Isso elimina a categoria inteira de bugs do tipo “funciona local, falha em AWS”. Se seu código passa contra MiniStack, está passando contra infraestrutura que se comporta como produção.
Comparação rápida
| MiniStack | LocalStack Community | |
|---|---|---|
| Preço | Gratuito | Pago (serviços core) |
| Licença | MIT | BSL |
| Serviços | 33 | Limitado sem pro |
| Conta requerida | Não | Sim |
| RAM idle | ~30MB | ~500MB |
| Imagem Docker | ~150MB | ~1GB |
| Startup | ~2 segundos | ~3.3 segundos |
| Infraestrutura real | RDS, Redis, ECS, Athena | Só em Pro |
Setup básico com boto3
import boto3
from botocore.config import Config
# S3 com 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="meu-bucket")
s3.put_object(Bucket="meu-bucket", Key="arquivo.txt", Body=b"olá mundo")
# AWS CLI
aws --endpoint-url=http://localhost:4566 s3 mb s3://meu-bucket
aws --endpoint-url=http://localhost:4566 s3 ls
Integração com Terraform e Pulumi
Com Terraform, você adiciona os endpoints na configuração do 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"
}
}
Com Pulumi, em Pulumi.dev.yaml:
config:
aws:endpoints:
- s3: http://localhost:4566
dynamodb: http://localhost:4566
Lambda com warm workers
Um dos detalhes mais cuidados do MiniStack é o gerenciamento de Lambda. As funções Python se mantêm quentes entre invocações: após o primeiro cold start, o módulo fica importado em um subprocess persistente. As chamadas seguintes pulam o import, o que acelera significativamente os suites de testes.
# Deploy de função Lambda
zip function.zip lambda_function.py
aws --endpoint-url=http://localhost:4566 lambda create-function \
--function-name minha-funcao \
--runtime python3.11 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler lambda_function.handler \
--zip-file fileb://function.zip
# Invocação
aws --endpoint-url=http://localhost:4566 lambda invoke \
--function-name minha-funcao \
--payload '{"key": "value"}' \
response.json
Estado do projeto
MiniStack está em desenvolvimento ativo. A v1.0.7 foi publicada há poucos dias e inclui:
- Suporte para S3 virtual hosted-style addressing
- Correção de bug em
ConditionExpressioncom chaves numéricas no DynamoDB (compatível com PynamoDB) - Cobertura de 656 testes automatizados
- Serviços que eram Pro-only no LocalStack: EC2, Cognito, EMR, ELB, EFS, WAFv2
A arquitetura foi pensada para ser extensível: cada serviço é um arquivo Python autocontido em ministack/services/. Adicionar um novo serviço é questão de criar um arquivo com handle_request() e reset().
Vale a pena fazer a migração?
Se seu time usa LocalStack Community e a mudança de licença afetou vocês, a resposta curta é sim. MiniStack cobre os serviços mais comuns, tem uma fração do footprint, e a infraestrutura real para RDS/Redis/ECS elimina uma categoria inteira de bugs de “funciona na minha máquina”.
Se você está no LocalStack Pro e usa serviços de nicho muito específicos, verifique a lista de serviços suportados antes de migrar — ainda há lacunas na cobertura mais avançada.
Para a maioria dos projetos backend com AWS: S3, DynamoDB, SQS, Lambda, RDS — MiniStack é suficiente.
# Comece agora
pip install ministack
ministack
Repositório: github.com/Nahuel990/ministack
Site oficial: ministack.org
