New service: API Gateway v2 (HTTP APIs)
- Full control plane: CreateApi, GetApi, UpdateApi, DeleteApi, routes, integrations, stages,
deployments, authorizers (JWT + Lambda), tags — 32 operations - Data plane: requests to {apiId}.execute-api.localhost:{port} are routed to Lambda (AWS_PROXY)
or HTTP (HTTP_PROXY) backends - {param} and {proxy+} (greedy) path parameter matching
- $default catch-all route
- routeKey in Lambda proxy event reflects the matched route (not hardcoded "$default")
- State included in persistence snapshot
SNS → Lambda fanout (was a no-op stub)
- protocol == "lambda" subscriptions now invoke the function via _execute_function() with the
standard Records[].Sns envelope
DynamoDB TTL enforcement
- Background daemon thread (dynamodb-ttl-reaper) scans every 60s and deletes items whose TTL
attribute value ≤ current epoch
Lambda Function URLs
- Full CRUD: CreateFunctionUrlConfig, GetFunctionUrlConfig, UpdateFunctionUrlConfig,
DeleteFunctionUrlConfig, ListFunctionUrlConfigs
Lambda warm workers
- core/lambda_runtime.py: persistent subprocess per function; module-level state survives across
invocations when called through API Gateway execute-api - Direct lam.invoke() still uses a fresh subprocess per call (no warm pool)
State persistence infrastructure
- core/persistence.py: atomic JSON saves to STATE_DIR on shutdown, reload on startup
(PERSIST_STATE=1) - API Gateway state persists across restarts
- S3 has its own S3_PERSIST mechanism (unchanged)
Test idempotency — /_ministack/reset
- POST /_ministack/reset wipes all in-memory state across all 21 services in one call
- When PERSIST_STATE=1, also deletes STATE_DIR/*.json and S3_DATA_DIR contents so a restart loads
clean - Session-scoped autouse fixture in conftest.py calls reset once before each test run — suite now
passes on repeated runs against the same server without restarting - Works against Docker: set MINISTACK_ENDPOINT=http://localhost:4566
Expanded operations across all existing services
Every service received significant new operations. Highlights:
- S3: versioning, encryption, lifecycle, CORS, ACL, website, logging, multipart upload, event
notifications - DynamoDB: transactions (TransactWriteItems/TransactGetItems), TTL, PITR, GSI/LSI, UpdateTable
- Lambda: aliases, versions, layers, event source mappings (SQS→Lambda polling), permissions,
concurrency, function URL config - SQS: FIFO queues, dead-letter queues, visibility timeout, message attributes, batch operations
- SNS: fanout to SQS and Lambda, filter policies, subscription attributes, PublishBatch
- CloudWatch Logs: retention policies, subscription filters, metric filters, Insights queries,
tags - CloudWatch: composite alarms, DescribeAlarmsForMetric, DescribeAlarmHistory
- EventBridge: archives, permissions, API destinations, connections
- Kinesis: shard split/merge/update, enhanced fan-out consumers
- Step Functions: full state machine execution with Pass, Task, Choice, Wait, Parallel, Map; sync
execution - ECS: capacity providers, ExecuteCommand, account settings, tags,
- IAM/STS: users, roles, policies, groups, instance profiles, OIDC providers, inline policies,
all tag operations - RDS: clusters, parameter groups, option groups, snapshots, start/stop
- Glue: crawlers, jobs, triggers, workflows, partitions, connections
- Athena: workgroups, named queries, prepared statements, data catalogs
- SecretsManager: rotation stubs, resource policies, version stages
- SSM: parameter history, label versions, tags
- ElastiCache: replication groups, subnet groups, snapshots, users/user groups
Bugfix:
-
ECS DescribeTasks never transitions to STOPPED after Docker container exits
Test coverage
- 54 tests (v0.1.0) → 377 tests across all 21 services
- All 377 pass on a fresh server; idempotent across repeated runs via reset fixture