Skip to content
Get Started for Free

Service Bus

Azure Service Bus is a fully managed enterprise message broker that supports queues and publish/subscribe topics. It helps decouple distributed systems and build reliable asynchronous messaging workflows. Service Bus is commonly used for command processing, event distribution, and integration between independent services. For more information, see What is Azure Service Bus?

LocalStack for Azure provides a local environment for building and testing applications that make use of Azure Service Bus. This page covers the management of namespaces and messaging entities; to send and receive messages, see Service Bus Data Plane. The supported APIs are available on our API Coverage section, which provides information on the extent of Service Bus’s integration with LocalStack.

This guide is designed for users new to Service Bus and assumes basic knowledge of the Azure CLI and our lstk az proxy.

Launch LocalStack using your preferred method. For more information, see Introduction to LocalStack for Azure. Once the container is running, enable Azure CLI interception by running:

Terminal window
lstk az start-interception

This command points the az CLI away from the public Azure management REST API and toward the LocalStack for Azure emulator API. To revert this configuration, run:

Terminal window
lstk az stop-interception

This reconfigures the az CLI to send commands to the official Azure management REST API.

Create a resource group to contain your Service Bus resources:

Terminal window
az group create \
--name rg-servicebus-demo \
--location westeurope
Output
{
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-servicebus-demo",
"location": "westeurope",
"managedBy": null,
"name": "rg-servicebus-demo",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}

Create a Service Bus namespace in the resource group:

Terminal window
az servicebus namespace create \
--resource-group rg-servicebus-demo \
--name sbnsdoc83 \
--location westeurope \
--sku Standard
Output
{
...
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-servicebus-demo/providers/Microsoft.ServiceBus/namespaces/sbnsdoc83",
...
"location": "westeurope",
...
"name": "sbnsdoc83",
...
"provisioningState": "Succeeded",
...
"serviceBusEndpoint": "https://sbnsdoc83.servicebus.azure.localhost.localstack.cloud:4511/",
"sku": {
"name": "Standard",
"tier": "Standard"
},
...
}

Get and list namespaces:

Terminal window
az servicebus namespace show \
--resource-group rg-servicebus-demo \
--name sbnsdoc83
az servicebus namespace list \
--resource-group rg-servicebus-demo

Create a queue in the namespace:

Terminal window
az servicebus queue create \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--name orders-queue
Output
{
...
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-servicebus-demo/providers/Microsoft.ServiceBus/namespaces/sbnsdoc83/queues/orders-queue",
"location": "westeurope",
...
"maxSizeInMegabytes": 1024,
"messageCount": 0,
"name": "orders-queue",
...
"status": "Active",
...
}

Get and list queues:

Terminal window
az servicebus queue show \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--name orders-queue
Output
{
"accessedAt": "0001-01-01T00:00:00.000000Z",
"autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
"countDetails": {
"activeMessageCount": 0,
"deadLetterMessageCount": 0,
"scheduledMessageCount": 0,
"transferDeadLetterMessageCount": 0,
"transferMessageCount": 0
},
...
"name": "orders-queue",
...
"status": "Active",
"type": "Microsoft.ServiceBus/namespaces/queues",
...
}
Terminal window
az servicebus queue list \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83
Output
[
{
"accessedAt": "0001-01-01T00:00:00.000000Z",
"autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
"countDetails": {
"activeMessageCount": 0,
"deadLetterMessageCount": 0,
"scheduledMessageCount": 0,
"transferDeadLetterMessageCount": 0,
"transferMessageCount": 0
},
...
"name": "orders-queue",
...
"status": "Active",
"type": "Microsoft.ServiceBus/namespaces/queues",
...
}
]

Create a topic and a subscription:

Terminal window
az servicebus topic create \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--name orders-topic
az servicebus topic subscription create \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--topic-name orders-topic \
--name orders-sub
Output
{
...
"name": "orders-topic",
...
"status": "Active",
"subscriptionCount": 0,
...
}
{
...
"messageCount": 0,
"name": "orders-sub",
...
"status": "Active",
...
}

Get and list subscriptions:

Terminal window
az servicebus topic subscription show \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--topic-name orders-topic \
--name orders-sub
Output
{
"accessedAt": "0001-01-01T00:00:00.000000Z",
"autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
"countDetails": {
"activeMessageCount": 0,
"deadLetterMessageCount": 0,
"scheduledMessageCount": 0,
"transferDeadLetterMessageCount": 0,
"transferMessageCount": 0
},
...
"name": "orders-sub",
...
"status": "Active",
"type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",
...
}
Terminal window
az servicebus topic subscription list \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--topic-name orders-topic
Output
[
{
"accessedAt": "0001-01-01T00:00:00.000000Z",
"autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
"countDetails": {
"activeMessageCount": 0,
"deadLetterMessageCount": 0,
"scheduledMessageCount": 0,
"transferDeadLetterMessageCount": 0,
"transferMessageCount": 0
},
...
"name": "orders-sub",
...
"status": "Active",
"type": "Microsoft.ServiceBus/namespaces/topics/subscriptions",
...
}
]

Create a SQL filter rule for the subscription:

Terminal window
az servicebus topic subscription rule create \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--topic-name orders-topic \
--subscription-name orders-sub \
--name high-priority \
--filter-sql-expression "priority = 'high'"
Output
{
...
"filterType": "SqlFilter",
...
"name": "high-priority",
...
"sqlFilter": {
"compatibilityLevel": 20,
"sqlExpression": "priority = 'high'"
},
...
}

List rules for the subscription:

Terminal window
az servicebus topic subscription rule list \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--topic-name orders-topic \
--subscription-name orders-sub
Output
[
{
...
"filterType": "SqlFilter",
...
"name": "high-priority",
...
"sqlFilter": {
"compatibilityLevel": 20,
"sqlExpression": "priority = 'high'"
},
...
}
]

Create and manage namespace authorization rules

Section titled “Create and manage namespace authorization rules”

Create an authorization rule:

Terminal window
az servicebus namespace authorization-rule create \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--name app-policy \
--rights Listen Send
Output
{
...
"name": "app-policy",
...
"rights": [
"Listen",
"Send"
],
...
}

List authorization rules:

Terminal window
az servicebus namespace authorization-rule list \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83

List and regenerate keys:

Terminal window
az servicebus namespace authorization-rule keys list \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--name app-policy
az servicebus namespace authorization-rule keys renew \
--resource-group rg-servicebus-demo \
--namespace-name sbnsdoc83 \
--name app-policy \
--key PrimaryKey
Output
{
"keyName": "app-policy",
"primaryConnectionString": "Endpoint=sb://sbnsdoc83.servicebus.azure.localhost.localstack.cloud:4511/;SharedAccessKeyName=app-policy;SharedAccessKey=...;UseDevelopmentEmulator=true",
...
"secondaryConnectionString": "Endpoint=sb://sbnsdoc83.servicebus.azure.localhost.localstack.cloud:4511/;SharedAccessKeyName=app-policy;SharedAccessKey=...;UseDevelopmentEmulator=true",
...
}
{
"keyName": "app-policy",
"primaryConnectionString": "Endpoint=sb://sbnsdoc83.servicebus.azure.localhost.localstack.cloud:4511/;SharedAccessKeyName=app-policy;SharedAccessKey=...;UseDevelopmentEmulator=true",
...
"secondaryConnectionString": "Endpoint=sb://sbnsdoc83.servicebus.azure.localhost.localstack.cloud:4511/;SharedAccessKeyName=app-policy;SharedAccessKey=...;UseDevelopmentEmulator=true",
...
}

The Service Bus emulator supports the following management capabilities:

  • Namespaces and messaging entities: Namespaces, queues, topics, subscriptions, and subscription rules can be created, read, updated, listed, and deleted through Azure Resource Manager, with the properties and defaults Azure returns.
  • Create-or-update semantics: Creating a namespace, queue, topic, subscription, or rule that already exists updates it in place and keeps its child resources, keys, and messages, as in Azure.
  • Azure’s validation rules: Changing a property that is fixed at creation, such as requiresSession, requiresDuplicateDetection, or enablePartitioning, is rejected, and so are a lock duration above five minutes, an express entity with duplicate detection, and a forwarding destination that does not exist, with Azure’s error messages.
  • Message counts: messageCount, sizeInBytes, and countDetails report the active, scheduled, dead-lettered, and transfer dead-lettered messages the broker holds for each queue and subscription.
  • Subscription rules: SQL filters with optional SQL actions and correlation filters decide which messages a subscription receives, and a SQL expression the broker cannot parse is rejected when the rule is created.
  • Authorization rules and keys: Namespace, queue, and topic authorization rules carry the Listen, Send, and Manage rights, and their keys can be listed and regenerated. The connection strings point at the emulator.
  • Local authentication: A namespace with disableLocalAuth set refuses shared access signatures and accepts Microsoft Entra tokens only, as in Azure.
  • Message broker: The emulator runs a Service Bus message broker for the Azure SDKs, the HTTP API, and the Atom management API, described in Service Bus Data Plane.
  • Geo-disaster recovery and migration are not supported: Listing disaster recovery configurations returns an empty list, and pairing namespaces, failing over, and migrating a Standard namespace to Premium are not supported.
  • Network rules are not enforced: IP rules, virtual network rules, and the default action of a namespace’s network rule set are stored and returned, but the emulator does not filter connections by them.
  • Quotas are not enforced: The emulator does not enforce namespace quotas, such as the number of entities in a namespace or the maximum size of an entity.
  • RBAC enforcement is opt-in: By default, management operations succeed regardless of role assignments. Set LS_AZURE_ENFORCE_RBAC to check them against the caller’s role assignments.

The following samples demonstrate how to use Service Bus with LocalStack for Azure:

51 of 83 operations implemented

Operation ▲Implemented ▼
Page 1 of 0
Was this page helpful?