MiniStack: O Substituto Gratuito do LocalStack que a Comunidade Estava Esperando

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 ConditionExpression com 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