localaz

localaz is a local Azure emulator, in the spirit of LocalStack (AWS) and localgcp (GCP). You run a single Docker container and point the Azure CLI or any Azure SDK at it — no code changes required.

It speaks the native Azure service protocols, so the CLI and the official SDKs build, sign, and parse requests exactly as they would against Azure. Everything runs on its own port inside the one process and container.

Supported services

ServiceEndpointProtocolPersistedNotes
Blob Storagehttp://127.0.0.1:10000/devstoreaccount1HTTP / REST (XML)Block blobs, metadata, ranges, listing
Queue Storagehttp://127.0.0.1:10001/devstoreaccount1HTTP / REST (XML)Messages, visibility timeouts, pop receipts
Table Storagehttp://127.0.0.1:10002/devstoreaccount1HTTP / REST (OData JSON)Entities, $filter, ETag concurrency
Event Gridhttp://127.0.0.1:10003HTTP / RESTNamespace topics, pull delivery
Web PubSubhttp://127.0.0.1:10004HTTP + WebSocketREST broadcast + json.webpubsub.azure.v1
Service Bussb://127.0.0.1:5672AMQP 1.0 over TCPQueues + topic/subscription fan-out
Monitor Logshttp://127.0.0.1:10005HTTP / RESTLogs ingestion + KQL-subset query
Control planehttps://127.0.0.1:1000610007HTTP / REST (HTTPS)Entra ID (AAD) + Resource Manager (ARM)

Blob, Queue and Table deliberately occupy Azurite’s UseDevelopmentStorage=true ports (10000/10001/10002), so existing Azurite tooling and connection strings work unchanged. The pub/sub services follow on 10003/10004/10005, and the Entra ID + Resource Manager control plane on 10006/10007.

Architecture

localaz is a single Go process. Each emulated service listens on its own port, but they all share the one binary and ship in the one container.

flowchart LR
    clients["Azure CLI / SDKs"]

    subgraph proc["localaz — single process & container"]
      direction TB
      storage["Storage data plane<br/>Blob · Queue · Table"]
      pubsub["Pub/sub &amp; logs<br/>Event Grid · Web PubSub<br/>Service Bus · Monitor"]
      control["Control plane<br/>Entra ID · Resource Manager"]
    end

    clients --> proc
    storage --> disk[("/data volume")]
  • The storage services (Blob, Queue, Table) persist their state under /data; mount a volume to keep it across restarts.
  • The pub/sub and logs services (Event Grid, Web PubSub, Service Bus, Monitor Logs) keep transient state in memory.
  • The control plane (Entra ID + Resource Manager) lets the CLI/SDKs register localaz as a custom Azure cloud, sign in, and route data-plane commands to it. It is in-memory and requires TLS, because MSAL and azure-core refuse to send bearer tokens over plain HTTP.

Next steps

  • Get Started — build and run the Docker image.
  • Services — per-service URLs, configuration, and SDK/CLI examples.