MiniStack — The Best AWS Emulator | Free LocalStack Alternative

8 min read Original article ↗

LocalStack is no longer free. MiniStack is. Free forever.
55+ AWS services on a single port — with real Postgres, Redis, and Docker containers. No account, no license key, no telemetry.

$docker run -p 4566:4566 ministackorg/ministack

⚠️

LocalStack moved core services behind a paid plan. If you relied on LocalStack Community for local dev and CI/CD, MiniStack is your free, MIT-licensed drop-in replacement. No sign-up, no API key, no telemetry.

ministack — bash

# Start MiniStack $ docker run -p 4566:4566 ministackorg/ministack # Works with any AWS tool — no config changes $ aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket make_bucket: my-bucket # Real database — RDS spins up actual Postgres $ aws --endpoint-url=http://localhost:4566 rds create-db-instance \ --db-instance-identifier mydb --engine postgres \ --master-username admin --master-user-password secret ✓ Real Postgres container running on localhost:15432 # Real Redis via ElastiCache $ aws --endpoint-url=http://localhost:4566 elasticache \ create-cache-cluster --cache-cluster-id my-redis --engine redis ✓ Real Redis container running on localhost:16379


45+ Services

Everything you need, locally

Core AWS services plus real infrastructure — RDS runs actual databases, ElastiCache runs real Redis, ECS starts real Docker containers, Athena executes real SQL via DuckDB (when installed).

  • 🪣

    S3

    Buckets, objects, versioning, encryption, lifecycle, CORS, Object Lock, replication

    REST/XML
  • 📨

    SQS

    Queues, FIFO, DLQ, batch, visibility

    JSON+Query
  • 📢

    SNS

    Topics, subscriptions, fanout to SQS, batch publish

    Query/XML
  • 🗃️

    DynamoDB

    Tables, CRUD, query, scan, transactions, TTL, GSI

    JSON
  • Lambda

    Real Python execution, warm workers, SQS event source mapping, Layers

    REST/JSON
  • 🔐

    IAM

    Users, roles, policies, groups, instance profiles, OIDC

    Query/XML
  • 🎫

    STS

    CallerIdentity, AssumeRole, GetSessionToken

    Query/XML
  • 🔑

    Secrets Manager

    CRUD, versioning, rotation, resource policies

    JSON
  • 📊

    CW Logs

    Groups, streams, retention, subscription filters, metric filters, Insights

    JSON
  • 📐

    SSM Params

    String, SecureString, paths, labels, tags

    JSON
  • 🚌

    EventBridge

    Buses, rules, targets, Lambda dispatch, archives, permissions

    JSON
  • 🌊

    Kinesis

    Streams, split/merge shards, consumers, encryption, monitoring

    JSON
  • 📈

    CW Metrics

    Metrics, alarms, composite alarms, dashboards, alarm history

    Query/CBOR
  • ✉️

    SES

    Send email/raw/templated, identities, configuration sets

    Query/XML
  • 🔄

    Step Functions

    Full ASL engine, sync execution, task tokens, all state types

    JSON
  • 🌐

    API Gateway v2

    HTTP APIs, Lambda proxy, path params, execute-api data plane

    REST/JSON
  • 🔌

    API Gateway v1

    REST APIs, resources, methods, integrations, stages, MOCK, Lambda proxy format 1.0

    REST/JSON
  • 🐘

    RDS

    Real Postgres/MySQL containers

    Real Docker
  • 🔴

    ElastiCache

    Real Redis/Memcached containers, users, user groups

    Real Docker
  • 🐳

    ECS

    RunTask starts real containers, capacity providers

    Real Docker
  • 🧪

    Glue

    Catalog, crawlers, jobs, triggers, workflows

    Real Exec
  • 🔍

    Athena

    Real SQL via DuckDB (optional), data catalogs, prepared statements

    DuckDB
  • 🚒

    Firehose

    Delivery streams, PutRecord/PutRecordBatch, S3 delivery, encryption, tags

    REST/JSON
  • 🌐

    Route53

    Hosted zones, record sets (CREATE/UPSERT/DELETE), health checks, tags, alias records

    REST/XML
  • 🔒

    Cognito

    User pools, auth flows, TOTP MFA, identity pools, federated credentials

    JSON
  • 🖥️

    EC2

    Instances, VPCs, subnets, security groups, route tables, ENIs, elastic IPs, NAT gateways, NACLs, flow logs, VPC peering, DHCP options, egress-only IGWs

    Query/XML
  • EMR

    Clusters, steps, instance groups/fleets, bootstrap actions, tags — Pro-only on LocalStack

    JSON
  • 💾

    EBS

    Volumes, snapshots, attach/detach, modify, copy — Pro-only on LocalStack

    Query/XML
  • 📁

    EFS

    File systems, mount targets, access points, lifecycle, backup policy — Pro-only on LocalStack

    REST/JSON
  • ⚖️

    ALB / ELBv2

    Load balancers, target groups, listeners, rules, Lambda targets + live data-plane routing — Pro-only on LocalStack

    Query/XML
  • 🔐

    ACM

    Request, import, describe certificates; DNS validation records; SANs; tags

    JSON
  • ✉️

    SES v2

    SendEmail, identities, configuration sets, account suppression — REST API

    REST/JSON
  • 🛡️

    WAF v2

    WebACLs, IP sets, rule groups, resource associations, LockToken enforcement — Pro-only on LocalStack

    JSON
  • ☁️

    CloudFormation

    Stack lifecycle, change sets, 68 resource types, YAML/JSON templates, intrinsic functions, rollback, cross-stack exports

    XML
  • 🔑

    KMS

    RSA & symmetric envelope encryption for internal cryptographic signatures

    JSON
  • 📦

    ECR

    In-memory container registry providing Docker V2 manifests and full lifecycle rules

    JSON
  • AppSync

    Serverless GraphQL architecture mocking local DataSources and complex Resolvers

    REST/JSON
  • 🌐

    CloudFront

    High-throughput edge location edge server emulation targeting origins natively

    XML
  • 📈

    AutoScaling

    ASGs, launch configs, scaling policies, lifecycle hooks, scheduled actions, tags

    Query/XML
  • 🔨

    CodeBuild

    Projects, builds, start/stop, batch operations, metadata stored in-memory

    JSON
  • 🗺️

    Cloud Map

    HTTP/DNS namespaces, services, instance registration, discovery, Route53 integration

    JSON
  • 📂

    S3 Files

    File systems, mount targets, access points, policies — new April 2026 S3 service

    REST
  • 🗄️

    RDS Data API

    ExecuteStatement, BatchExecute, transactions — routes SQL to real RDS containers

    REST
  • 🔎

    OpenSearch

    Domains, versions, change progress, tags — optional real opensearchproject/opensearch cluster + Dashboards sidecar via OPENSEARCH_DATAPLANE=1

    Real Docker
  • 🏛️

    Organizations

    DescribeOrganization, ListRoots, accounts, OUs with the new Path field

    REST/JSON
  • 🪪

    Account

    GetAccountInformation (with AccountState), GetContactInformation, ListRegions opt-in matrix

    REST/JSON
  • ⚙️

    Batch

    Compute environments, job queues, job definitions (auto-revisioning), SubmitJob — Pro-only on LocalStack

    REST/JSON
  • 🛡️

    WAF Classic

    v1 + Regional stub for legacy Terraform / CFN — empty List*, valid GetChangeToken, WAFNonexistentItemException

    JSON
  • 📡

    IMDS

    EC2 Instance Metadata Service v1 + v2 — SDK credential chains resolve via AWS_EC2_METADATA_SERVICE_ENDPOINT

    HTTP
  • EventBridge Scheduler

    Schedules, schedule groups, rate/cron expressions, target dispatch

    REST/JSON
  • 💾

    Backup

    Vaults, plans, recovery points, tags — control plane stub

    REST/JSON
  • 🚩

    AppConfig

    Applications, environments, profiles, deployments, hosted versions, configuration sessions data plane

    REST/JSON
  • 📤

    Transfer

    SFTP servers, users, public-key auth, tags

    JSON
  • ☸️

    EKS

    Clusters, node groups, Fargate profiles, addons — Pro-only on LocalStack

    REST/JSON
  • 🏷️

    Resource Groups Tagging

    GetResources, GetTagKeys/Values, TagResources across S3, Lambda, SQS, SNS, DDB, KMS, ECR, ECS, EFS, AppSync, scheduler, more

    JSON

Testing 101

Start Testing in Seconds

Integrating Ministack is as simple as overriding the AWS endpoint URL. Select your tool below to see exactly how to write your local test code.

# 1. Ensure MiniStack is running on port 4566 import boto3 # 2. Point boto3 to local endpoint s3 = boto3.client('s3', endpoint_url='http://localhost:4566', region_name='us-east-1', aws_access_key_id='test', aws_secret_access_key='test' ) # 3. Code logic interacts with Ministack instantly! s3.create_bucket(Bucket='my-local-bucket') print("✓ Successfully created bucket")

# Configure endpoints in your AWS provider provider "aws" { access_key = "test" secret_key = "test" region = "us-east-1" skip_credentials_validation = true skip_metadata_api_check = true skip_requesting_account_id = true endpoints { s3 = "http://localhost:4566" dynamodb = "http://localhost:4566" lambda = "http://localhost:4566" # Add other services needed... } }

import { S3Client, CreateBucketCommand } from "@aws-sdk/client-s3"; // Override the endpoint const s3 = new S3Client({ endpoint: "http://localhost:4566", region: "us-east-1", credentials: { accessKeyId: "test", secretAccessKey: "test" } }); await s3.send(new CreateBucketCommand({ Bucket: "my-test-bucket" }));

# Just append --endpoint-url parameter aws s3 mb s3://my-local-bucket \ --endpoint-url http://localhost:4566 \ --region us-east-1 aws dynamodb create-table \ --table-name Users \ --attribute-definitions AttributeName=Id,AttributeType=S \ --key-schema AttributeName=Id,KeyType=HASH \ --billing-mode PAY_PER_REQUEST \ --endpoint-url http://localhost:4566


Comparison

LocalStack vs MiniStack

Same developer experience. Fraction of the cost and footprint.

Feature LocalStack Free LocalStack Pro MiniStack ⚡
Core services (S3, SQS, DDB…) Now paid ✅ Free
Lambda, IAM, SSM, EventBridge Paid ✅ Free
RDS (real DB containers) ✅ Real Postgres/MySQL
ElastiCache (real Redis) ✅ Real Redis
ECS (real Docker) ✅ Real Docker
Athena (real SQL) ✅ DuckDB (optional)
Glue Catalog + Jobs
API Gateway v2 (HTTP APIs) ✅ + data plane
API Gateway v1 (REST APIs) ✅ + data plane
Firehose ✅ S3 delivery
Route53
Cognito (user pools + identity) Paid ✅ Free
EC2 (instances, VPC, subnets, SGs) Paid ✅ Free
EMR (clusters, steps, instance groups) Paid ✅ Free
EBS (volumes, snapshots, attach/detach) Paid ✅ Free
EFS (file systems, mount targets, access points) Paid ✅ Free
ALB / ELBv2 (LBs, listeners, rules + Lambda data plane) Paid ✅ Free
SNS→SQS fanout + SQS→Lambda ESM
CloudFormation Paid ✅ Free
Startup time ~15-30s ~15-30s ~2s
Memory at idle ~500MB ~500MB ~30MB
Docker image ~1 GB ~1 GB ~250 MB
License BSL (restricted) Proprietary MIT
Price Now paid $35/mo $0 forever

Built different

Real infrastructure, not mocks

Where it matters most — RDS, ElastiCache, and ECS run real Docker containers. No fake endpoints, no stubbed responses.

  • 🐘

    Real databases via RDS

    CreateDBInstance spins up an actual Postgres or MySQL Docker container. Connect with psycopg2 — it's a real database.

  • 🔴

    Real Redis via ElastiCache

    CreateCacheCluster starts an actual Redis container. Use redis-py, run SUBSCRIBE, use it as your session store.

  • 🐳

    Real containers via ECS

    RunTask pulls and starts real Docker containers via the Docker socket. Test your ECS task definitions locally.

  • 🔍

    Real SQL via Athena

    Queries execute via DuckDB when installed. Query S3 data with actual SQL, get actual result sets back. Falls back to mock results without it.

  • 🔌

    Full SDK compatibility

    Works with boto3, AWS CLI, Terraform, CDK, Pulumi, Java SDK v2, Go SDK v2 — any tool that speaks the AWS API. 1,300+ tests passing across Python and Java.

  • Testcontainers module

    Official Java module on Maven Central: org.ministack:testcontainers-ministack:0.1.5. JUnit 5 and Spring Boot ready. AWS CLI bundled for init scripts.

  • 🔓

    MIT licensed forever

    No BSL, no feature gates, no "community" vs "pro". Every service is free. Fork it, embed it. MIT is MIT.


Stop paying for local development

One command. 45+ services. Real infrastructure. Free.

$docker run -p 4566:4566 ministackorg/ministack