Nimbus — a storm cloud striking a server rack with lightning
wire-level chaos for AWS SDKs

Chaos that
speaks AWS.

microburst is a fault-injection proxy that sits between your SDK and any AWS endpoint — emulator or real. It serves the failures AWS actually serves: modeled error shapes, retryable statuses, dying connections. Your retries, backoff and timeouts get tested for real.

$ uvx microburst --upstream http://localhost:4566
microburst — zsh
How it works

One hop between your code
and the cloud.

Point AWS_ENDPOINT_URL at the proxy. Signed or unsigned, microburst resolves the service, operation and resource — then decides: inject, or forward.

◈

Your app

boto3 · aws-sdk-js · Go · Java
signed request⟶
⚡

microburst

rules decide per request
error · latency · timeout · reset · corrupt
or forwards⟶
☁

Upstream

MiniStack · moto · real AWS
Features

Not a mock.
A protocol-aware adversary.

Faults are rendered in the service's own wire protocol and parsed back cleanly by the SDK — so your client sees the same exception classes it'd see in production.

Real error shapes, every protocol

Errors rendered via botocore service models across all 436 modeled services — json, query, ec2, rest-xml, rest-json, smithy-rpc-v2-cbor. A fidelity harness round-trips every modeled error code through the SDK's own parser.

Error.Code round-trips for 90k+ modeled shapes

A rule DSL, not flags

Match on service, operation, region, resource, headers, or jmespath over the parsed body — JSON, form-encoded and XML. Cadence via probability, deterministic hashing, rate windows, sequences and TTLs.

body: "TableName == 'orders' && Item.tenant.S == 'vip'"

Latency you can shape

Uniform, gaussian, spike distributions — or throttle response bodies to KiB/s.

Connections that die

TCP resets, timeouts, mid-stream aborts, truncated and corrupted bodies.

TUI dashboard

microburst dashboard — live fault feed over SSE, rules table, sparkline.

Observable chaos

Fired log with filters, SSE live tail, Prometheus /metrics, OpenTelemetry spans. Every fault is auditable — chaos you can defend in a review.

Ships everywhere

PyPI package, GHCR image, docker-compose example, composite GitHub Action — uses: pingedbrain/microburst@v0.3.0 drops it into any workflow.

0AWS services covered
0wire protocols
0error shapes fuzzed
0mocks harmed
The DSL

Declare the storm.

Rules are YAML — hot-reloadable via the control API at runtime. What AWS sees is a faithful fault; what you see is a deterministic experiment.

▸ chaos.yml
# 10% of DynamoDB writes throttle
- service: dynamodb
  operation: PutItem
  probability: 0.1
  error:
    code: ProvisionedThroughputExceededException

# the vip tenant always feels pain — deterministically
- service: dynamodb
  body: "Item.tenant.S == 'vip'"
  deterministic: true
  probability: 0.4
  latency: { dist: gaussian, mean: 800, stddev: 200 }

# S3 reads: 200 OK, corrupt payload. the insidious one.
- service: s3
  operation: GetObject
  response: { corrupt_bytes: 16 }
▸ GET /_microburst/fired — audit every strike
[{
  "rule": 1,
  "service": "dynamodb",
  "operation": "PutItem",
  "action": "error:ProvisionedThroughputExceededException",
  "resource": "orders",
  "ts": 1759952134.7
},{
  "rule": 3,
  "service": "s3",
  "operation": "GetObject",
  "action": "response:corrupt:16B",
  "resource": "assets/logo.png",
  "ts": 1759952136.1
}]
Get it

Up in seconds.

# uvx — zero install

uvx microburst \ --upstream http://localhost:4566 # TUI: uvx --from 'microburst[tui]' \ # microburst dashboard

# docker

docker run -p 9999:9999 \ ghcr.io/pingedbrain/microburst \ --upstream http://host.docker.internal:4566

# github actions

- uses: pingedbrain/microburst@v0.3.0 with: upstream: http://localhost:4566 config: .github/chaos.yml