LocalStackがBusiness Source License(BSL)に移行してコアサービスを有料プランの裏側に移したことで、「完全無料でMITの代替」を求める動きが広がった。ministackorg/ministack はその需要に直球で応えるOSSで、Python製、60+のAWSサービスを単一ポート4566でエミュレートする。最新リリースは v1.4.1(2026-07-09)で、v1.4.0ではリージョン/アカウント単位でstateを分離し、BedrockもOllama・llama.cpp経由の実LLMプロキシに対応した。
LIGHTWEIGHTLocalStack 比
60+ の AWS サービスを、約30MB のメモリで立てる
270MB
イメージサイズ
LocalStack は約1GB。light 版は約110MB
30MB
アイドル時メモリ
LocalStack は約500MB
<2秒
起動時間
LocalStack は約15〜30秒
30秒でわかるMiniStack(2026年7月31日実測)
- ・MIT・完全無料のAWSローカルエミュレータ。★3,904、直近push 2026-07-30
- ・待ち受けは LocalStack と同じ
:4566。既存のdocker-compose.ymlはイメージ差し替えで移行できる - ・RDS / ElastiCache / EKS / ECS は実コンテナを起動。Terraform/Pulumi/CDK に対応
- ・同じLocalStack代替の Vercel Emulate・kumo とは設計思想が違い、3者で使い分けられる
この記事ではMiniStackのAWSローカル開発活用法を解説します。AI時代の自動化ツール全体像はAI自動化ツール|ノーコードからコードまで2026年版の比較と選び方をご覧ください。
MiniStackとは:LocalStackの無料・軽量な代替
pip install ministack か docker run ですぐ起動する。一言で言えば、AWSを丸ごとローカルに立て、開発とCIのAWS課金・待ち時間・事故リスクを消し、有償化したLocalStackを無料で置き換えるものだ。README冒頭も「LocalStack recently moved its core services behind a paid plan.」と、この文脈を正面から掲げている。
| 観点 | LocalStack(無料時代) | LocalStack(現在/BSL) | MiniStack |
|---|---|---|---|
| ライセンス | 旧Apache 2.0 | BSL(制限あり) | MIT |
| 価格 | 一部Pro機能のみ有料 | コアサービスも有料化 | 完全無料・永続 |
| Image サイズ | ~1GB | ~1GB | ~270MB(light版は~110MB) |
| アイドル時メモリ | ~500MB | ~500MB | ~30MB |
| 起動時間 | ~15〜30秒 | ~15〜30秒 | <2秒 |
| 対応サービス数 | 70+ | 70+(Pro含む) | 60+ |
| 実コンテナ統合 | Pro限定 | Pro限定 | OSS版で標準 |
READMEは末尾で「MIT — free to use, modify, and distribute. No restrictions.」と言い切っている。商用での再販も含めて自由で、ライセンス変更に振り回された層への強いメッセージになっている。
実コンテナを起動する設計と、対応する60+サービス
MiniStackが解くのは「APIモックだけでは本番と乖離する」問題だ。
REAL CONTAINERSモックの先
API の応答だけでなく、裏で本物を起動する
LocalStack 無料版
MiniStack
LocalStack 無料版: RDS:モック応答のみ
MiniStack: 実 Postgres / MySQL / MariaDB コンテナ
LocalStack 無料版: ElastiCache:モック
MiniStack: 実 Redis / Memcached
LocalStack 無料版: EKS:API 応答のみ
MiniStack: 実 k3s クラスタ(約75MB)
LocalStack 無料版: Athena:モック
MiniStack: DuckDB で実 SQL(full image)
ほかにECSは RunTask で実Dockerコンテナを起動し、LambdaはPython/Node.jsハンドラをwarm worker poolで実行する。RDSを作ると裏で本物のPostgresが立ち上がり、実際の host:port(既定で localhost:15432 起点)が返ってくる。対応エンジンは postgres / mysql / mariadb / aurora-postgresql / aurora-mysql。
# RDSをcreateすると、実Postgresコンテナが裏で起動する
import boto3, psycopg2
rds = boto3.client("rds", endpoint_url="http://localhost:4566",
aws_access_key_id="test", aws_secret_access_key="test",
region_name="us-east-1")
resp = rds.create_db_instance(
DBInstanceIdentifier="mydb", DBInstanceClass="db.t3.micro",
Engine="postgres", MasterUsername="admin",
MasterUserPassword="password", DBName="appdb", AllocatedStorage=20)
ep = resp["DBInstance"]["Endpoint"] # {"Address": "localhost", "Port": 15432}
conn = psycopg2.connect(host=ep["Address"], port=ep["Port"],
user="admin", password="password", dbname="appdb")
# ↑ 本物のPostgresに接続でき、実際のSQLが通る
LocalStack無料版ではSQLが実際に通るかを確かめられなかったが、MiniStackならローカル・CI・本番Postgresの3層で同じSQLが通る。
| カテゴリ | サービス |
|---|---|
| ストレージ | S3(Object Lock/バージョニング/マルチパート対応) / EBS / EFS / S3 Tables(Iceberg) |
| メッセージング | SQS(FIFO/DLQ) / SNS / EventBridge / Kinesis / Firehose / SES / SES v2 / Step Functions |
| データベース | DynamoDB(Streams含む) / RDS(実コンテナ) / ElastiCache(実コンテナ) / RDS Data API |
| 認証・シークレット | IAM / STS / SecretsManager / SSM Parameter Store / KMS / Cognito / ACM |
| コンピュート | Lambda / ECS(実コンテナ) / EKS(実k3s) / EC2 / Batch / AutoScaling / CodeBuild |
| ネットワーク | API Gateway v1/v2(WebSocket含む) / Route53 / CloudFront / AppSync / WAFv2 / ELBv2/ALB / Cloud Map |
| 分析 | Athena(DuckDB実SQL) / Glue / EMR / OpenSearch / CloudWatch Logs/Metrics |
| 配信・その他 | ECR / CloudFormation / CloudTrail / Organizations / Transfer Family(実SFTP) / IoT Core(実MQTT) / S3 Files |
60+はLocalStackの70+より少ないが、Lambdaの provided.al2023 ランタイムやDurable Functions、API GatewayのWebSocket APIやJWTオーソライザまで対応し、個別サービスの機能深度は高い。Direct ConnectやMainframe Modernizationのような特殊サービスは対象外だ。
軽さの根源は、全サービスを単一Pythonプロセスで動かす設計にある。ゲートウェイ(:4566)がサービスルーターに渡し、RDSやLambdaなど一部だけがDocker API経由で実コンテナに委譲する。各サービスは ministack/services/<service_name>.py という独立したファイルで、READMEのContributingは「async def handle_request(...) と reset() を持つ1ファイルを作り、SERVICE_REGISTRY に追加し、ルーターに検出パターンを足す」だけと明記している。2026年4月ローンチのS3 Filesが同月中に取り込まれたのも、この設計あってのことだ。
MiniStackのインストールとdocker-compose統合
# pip(PoC・個人開発)。GATEWAY_PORT=XXXX でポート変更可
pip install ministack
ministack
# Docker(チーム・CI)
docker run -p 4566:4566 ministackorg/ministack
# 起動確認とAWS CLIからの接続(認証情報は test でよい)
curl http://localhost:4566/_ministack/health
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1
aws --endpoint-url http://localhost:4566 s3 mb s3://my-bucket
aws --endpoint-url http://localhost:4566 s3 ls
| パターン | コマンド | Docker | 実コンテナ機能 | 主な用途 |
|---|---|---|---|---|
| pip | pip install ministack && ministack |
不要 | 使えない | PoC・個人開発 |
| Docker(標準) | docker run -p 4566:4566 ... |
必要 | 使えない | チーム・CI |
| Docker+socket | -v /var/run/docker.sock:... を追加 |
必要 | RDS/ECS/EKS等が起動 | 本格運用 |
| Full image | ministackorg/ministack:full |
必要 | DuckDB/Athena有効 | 実SQLが要る分析系 |
実コンテナ機能を使うにはDockerソケットをマウントする。DuckDBによるAthenaの実SQLは :full イメージ(Debian/glibcベース、約360MB)でのみ有効で、light版(約110MB)では SELECT 1+1 がモック結果を返す。
# 本格運用:実コンテナ + full image
docker run -p 4566:4566 \
-v /var/run/docker.sock:/var/run/docker.sock \
ministackorg/ministack:full
チームの共通環境にするなら docker-compose.yml に組み込む。
services:
ministack:
image: ministackorg/ministack:latest
container_name: ministack
ports:
- "4566:4566"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ministack-data:/data
environment:
- PERSIST_STATE=1
- STATE_DIR=/data/ministack-state
- LAMBDA_EXECUTOR=docker
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4566/_ministack/health"]
interval: 5s
timeout: 3s
retries: 30
app:
build: .
depends_on:
ministack:
condition: service_healthy
environment:
- AWS_ENDPOINT_URL=http://ministack:4566
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
- AWS_REGION=us-east-1
command: ["npm", "start"]
volumes:
ministack-data:
PERSIST_STATE=1 でコンテナを再起動してもデータが残る。全サービス対応で、書き込みは「tmpに書いてrename」のアトミック方式なのでクラッシュ時の破損を防ぐ。CIで毎回まっさらにしたいときは、PERSIST_STATE を切るか POST /_ministack/reset を beforeEach で叩く。
Terraform・CI/CDへの組み込み
AWS_ENDPOINT_URL を設定するか、Terraformの endpoints ブロックをMiniStackに向けるだけで、既存のIaCがほぼそのまま動く。CloudFormation(SAMトランスフォーム含む・full image)、CDK、Pulumiも同様に通る。
provider "aws" {
region = "us-east-1"
access_key = "test"
secret_key = "test"
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
endpoints {
s3 = "http://localhost:4566"
dynamodb = "http://localhost:4566"
rds = "http://localhost:4566"
lambda = "http://localhost:4566"
# ... 必要なサービス分
}
}
resource "aws_db_instance" "test" {
identifier = "test-db"
engine = "postgres"
instance_class = "db.t3.micro"
allocated_storage = 20
username = "admin"
password = "password"
}
terraform apply するとRDSインスタンスが作られ、裏で実Postgresコンテナが起動して、接続できるエンドポイントが返ってくる。
SAME CODE TO PRODIaC の通し方
同じ IaC を、$0 のローカルで通してから本番へ
-
IaC を書く
Terraform / CDK / Pulumi
-
MiniStack で apply
AWS_ENDPOINT_URL=:4566
-
統合テスト
CI の services で起動
-
本番 AWS へ apply
endpoint を外すだけ
起動が数秒以内なので、PRごとに何度もテストを回せる。
# .github/workflows/test.yml
name: Test against MiniStack
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
ministack:
image: ministackorg/ministack:latest
ports:
- 4566:4566
options: >-
--health-cmd "curl -f http://localhost:4566/_ministack/health"
--health-interval 5s
--health-timeout 3s
--health-retries 10
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- name: Apply infrastructure
run: |
terraform init
terraform apply -auto-approve
env:
AWS_ENDPOINT_URL: http://localhost:4566
AWS_ACCESS_KEY_ID: test
AWS_SECRET_ACCESS_KEY: test
AWS_REGION: us-east-1
- name: Run integration tests
run: pytest tests/integration/
env:
AWS_ENDPOINT_URL: http://localhost:4566
LocalStack向けのワークフローは、localstack/localstack を ministackorg/ministack に書き換えるだけで大半が動く。ヘルスチェックも /_localstack/health と /health が互換提供されている。
LocalStack・kumo・Vercel Emulateとの使い分け
| 観点 | LocalStack(Pro) | MiniStack | kumo | Vercel Emulate |
|---|---|---|---|---|
| ライセンス | BSL(制限あり) | MIT | MIT | Vercel Labs実験 |
| 主言語 | Python | Python | Go | TypeScript/Node.js |
| 配布 | Docker | pip / Docker | 単一Goバイナリ / Docker | npx一発 |
| Docker要否 | 必須 | pipなら不要(実コンテナ機能は要) | 不要(バイナリ単体可) | 不要 |
| LocalStack互換ポート(:4566) | (本家) | 互換 | 互換 | 独自エンドポイント |
| 対応サービス数 | 70+(含Pro) | 60+ | 多数 | AWS一部 + Slack/GitHub等 |
| Terraform対応 | フル | フル | フル | 限定的 |
| 実コンテナ起動 | Pro限定 | OSS標準(RDS/EKS/ECS/Cache) | なし(モックのみ) | なし(モックのみ) |
| 起動速度 | ~15〜30秒 | <2秒 | 高速 | 即起動(npx) |
| 主戦場 | エンタープライズの厳密互換性 | 本番に近い実コンテナ統合 | GoエコシステムのCI/CD | JS/TSテストのモック |
| 月額コスト | $35〜(Pro) | $0 | $0 | $0 |
kumoはLocalStackの重さを解くGo製バイナリのドロップイン代替、Vercel EmulateはSlack・GitHub・GoogleまでをDocker不要で扱うJS/TS向けのモック、MiniStackは「本物のPostgresがないとSQLが通るか確かめられない」不満に応える実コンテナ型だ。本番に近い実DBやEKS/ECSの動作確認ならMiniStack、Goプロジェクトや依存ゼロを求めるならkumo、ユニットテストやAWS以外のSaaSならVercel Emulate、Snapshotなど厳密互換のPro機能が要るならLocalStack Pro、という棲み分けになる。
マルチテナンシー・StackPort・AIエージェントでの使い方
12桁のAccess Key IDが、そのまま12桁のAccount IDになる。設定は要らない。
# Team A → account 111111111111
export AWS_ACCESS_KEY_ID=111111111111
aws --endpoint-url http://localhost:4566 sts get-caller-identity
# → { "Account": "111111111111", ... }
# Team B → account 222222222222(別ターミナル)
export AWS_ACCESS_KEY_ID=222222222222
aws --endpoint-url http://localhost:4566 sts get-caller-identity
# → { "Account": "222222222222", ... }
ARNとリソース状態(SQS・Lambda・IAM・S3・DynamoDB等)がアカウント単位で分離され、同名リソースも衝突しない。test のような非数値キーは既定の 000000000000 に落ちる。1つのインスタンスを複数の開発者やCIで共有しつつ、クロスアカウントロールや組織の権限テストをローカルで回せる。
コミュニティ製の StackPort(README公認の Community Integrations)は、MiniStack上のリソースをAWSコンソール風のUIで見せるダッシュボードだ。pip install stackport && stackport で、S3のオブジェクト、DynamoDBのデータ、Lambda関数、IAMユーザー/ロールをブラウザから確認できる。.NET Aspire向けには McDoit.Aspire.Hosting.Ministack もある。
Claude Code・Codex・Gemini CLIにAWSリソースの作成を任せると、エージェントは何度もインフラを作っては壊す。本番AWSでこれを許すとコストと事故の両面でリスクがあるが、MiniStackに向けておけば何度作り直しても課金も本番影響もない。AWS_ENDPOINT_URL=http://localhost:4566 で terraform apply を試行錯誤させ、動いたコードだけを本番に出す、という使い方だ。エージェント運用全体の文脈は Claude Managed Agents の議論とつながる。
「ローカルで通った=本番で通る」ではない
- ・EC2・EMR・Batchなど一部は、実VMを起動しない制御プレーンのみの実装
- ・IAMの細かい権限挙動、リージョン特有の制約、サービスクォータは本番と差が出うる。「ローカル → ステージング → 本番」の3段階を保つ
- ・商用サポート契約は無い。問い合わせはGitHub Issuesで、ポートとヘルスパスが互換なので緊急時にLocalStackへ戻す経路は残せる
- ・監査ログはCloudTrailを
CLOUDTRAIL_RECORDING=1でローカル記録できるが、恒久的な集約は別に設計する





