Skip to content
round-trip latency
~9ms
A real emulator · AWS · Azure · GCP · OCI

The whole cloud,collapsed into memory.

Point real SDKs and CLIs at AWS, Azure & GCP running entirely on your machine. No accounts, no bills, no network — answers straight from RAM.

scroll
§ 01 — the machine

Every resource is live in RAM, on the real wire.

The collapse isn't marketing — it's the architecture. Each bucket, instance and table you create is a struct in an in-memory store, reachable over the actual cloud wire protocols. That's why it answers in single-digit milliseconds.

memory · region us-mem-10 cells
§ 02 — integrate

Wire it into a running app. One endpoint override.

To integrate cloudemu with an existing app, run it in server modeand point your SDK's endpoint at it. That exercises your real code path end to end — no throwaway test harness, no code changes beyond the one endpoint.

SERVER MODE · INTEGRATION / E2E

Run it, point real code at it

Start the binary or Docker image and aim your already-running app, CLI, or SDK — any language — at the printed endpoints. The real wire path runs end to end, exactly as production would.

$ docker run -p 4566:4566 -p 4568:4568 -p 4569:4569 ghcr.io/stackshy/cloudemu

Writing Go unit tests inside cloudemu-aware code? Skip the server and take an in-process handle — cloud := cloudemu.NewAWS(). That's the library path, not how you wire an existing app.

The one change your app needs

Override the SDK endpoint. Production points at the real cloud; in front of cloudemu you flip one endpoint — every SDK exposes the same seam, nothing else changes.

AWS
aws-sdk-go-v2 · CLI:4566
export AWS_ENDPOINT_URL=http://127.0.0.1:4566
GCP
cloud.google.com/go:4569
option.WithEndpoint("http://127.0.0.1:4569")
Azure
azure-sdk-for-go · ARM:4568 · TLS
arm.ClientOptions → https://127.0.0.1:4568
§ 02 — behaviors

Not a mock. A cloud you can push until it breaks.

It enforces lifecycle, throttles under load, injects outages and bends time — the failure paths your retries otherwise never run.

drag / scroll →
2.1fault + latency

Chaos engineering

Schedule outages, latency spikes and throttling inside real time windows. Your backoff code runs for real, every test.

2.2lifecycle

State machines

VMs walk pending → running → stopping → stopped. Start a terminated instance and you get an error, not a shrug.

2.3probabilistic

Error injection

Fail every call, every Nth, the first N, or at a fixed probability — scoped to one operation or a whole service.

2.4fluent asserts

Recording & replay

Every call is recorded — inputs, outputs, timing — then asserted against with a fluent API. No spies to wire up.

2.5deterministic

Fake clock

A clock you advance by hand. TTL expiry, dedup windows and alarms fire on command, not on wall time.

2.6stdlib only

Zero dependencies

The in-process library is standard-library only. It runs anywhere your test suite already runs.

§ 03 — coverage

One binary. Three clouds.

0
services emulated
0
clouds · AWS Azure GCP
~0
ms per call
0
accounts · bills · setup
S3 · EC2 · DynamoDB · Lambda · VPC · Route 53 · SQS · SNS · KMS · RDS · ECS · EKS · Athena · Glue · Step Functions · Global Accelerator · Cognito · Blob Storage · Cosmos DB · Functions · Key Vault · Service Bus · AKS · Data Factory · Front Door · Azure Firewall · SignalR · GCS · Firestore · Pub/Sub · GKE · Cloud Run · BigQuery · Spanner · Dataproc · Cloud Composer · Bigtable · S3 · EC2 · DynamoDB · Lambda · VPC · Route 53 · SQS · SNS · KMS · RDS · ECS · EKS · Athena · Glue · Step Functions · Global Accelerator · Cognito · Blob Storage · Cosmos DB · Functions · Key Vault · Service Bus · AKS · Data Factory · Front Door · Azure Firewall · SignalR · GCS · Firestore · Pub/Sub · GKE · Cloud Run · BigQuery · Spanner · Dataproc · Cloud Composer · Bigtable ·
§ 04 — real work

Not just mocks. Real backends.

The in-memory default stays instant and dependency-free. When a test needs the real thing, opt in — and point real Infrastructure-as-Code straight at it.

OPT-IN / REAL DATA PLANE

Real engines

A database, cache, function, VM, container, or bucket you create does the real thing — real SQL, real Redis, your code, real bytes. Wire one line; the rest stays in memory.

cloud := cloudemu.NewAWS(config.WithDatabaseEngine(pg))
IaC / VERIFIED IN CI

Terraform & OpenTofu

Real apply / plan / destroy against cloudemu, proven idempotent in CI. The cloudemu-tf wrapper needs only an empty provider block.

$ cloudemu-tf apply
SNAPSHOT / RESTORE · OPT-IN

Freeze the whole cloud. Bring it back.

Snapshot cloudemu's entire state — across AWS, Azure, GCP and OCI — to one file, then restore it identity-preserving: every ARN, resource ID and cross-reference survives. Seed a baseline, branch from it, reset in an instant. The in-memory default stays ephemeral; persistence is opt-in.

$ cloudemu snapshot save state.json
§ 05 — three ways to run it

Point real code at it.

01 / SERVER

Standalone / Docker

A long-lived local cloud. Point any app, CLI or SDK — any language — at it. The default for integration & E2E.

$ docker run -p 4566:4566 cloudemu
02 / SDK-COMPAT

In-process HTTP

Wrap it in httptest and aim real SDK clients straight at the handle — for Go tests.

ts := httptest.NewServer(…)
03 / LIBRARY

Typed Go API

Skip the wire entirely — call the in-memory drivers directly in unit tests.

cloud := cloudemu.NewAWS()
§ 06 — power on

Bring a cloud up in one line.

Point your existing tests at it today — no credentials, no network, no cleanup. A clean cloud on every run.

$go get github.com/stackshy/cloudemu/v2
cloudemu — the cloud, in memoryMIT · cloudemu.info