Use the Azurite emulator for local Azure Storage development

The Azurite open-source emulator provides a free local environment for testing your Azure blob, queue storage, and table storage applications. When you're satisfied with how your application is working locally, switch to using an Azure Storage account in the cloud. The emulator provides cross-platform support on Windows, Linux, and macOS.

Azurite is the future storage emulator platform. Azurite supersedes the Azure Storage Emulator. Azurite will continue to be updated to support the latest versions of Azure Storage APIs.

There are several different ways to install and run Azurite on your local system. Select any of these tabs.

Install Azurite

Azurite is automatically available with Visual Studio 2022. If you are running an earlier version of Visual Studio, you'll need to install Azurite by using either Node Package Manager, DockerHub, or by cloning the Azurite github repository.

Run Azurite

With a few configurations, Azure Functions or ASP.NET projects start Azurite automatically. For all other project types, you'll have to start Azurite from the command line.

Running Azurite from the command line

You can find the Azurite executable file in the extensions folder of your Visual Studio installation. The specific location can vary based on which version of Visual Studio you have installed. For example, if you've installed Visual Studio 2022 professional edition on a Windows computer or Virtual Machine (VM), you would find the Azurite executable file at this location: C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator.

After you run the executable file, Azurite listens for connections.

Azurite command-line output

Running Azurite from an Azure Functions project

In Visual Studio 2022, create an Azure Functions project. As you create the project, choose the Storage Emulator.

Storage emulator option in Azure Functions project

After you create the project, Azurite starts automatically.

Azurite command-line output in Azure Functions project

Running Azurite from an ASP.NET project

In Visual Studio 2022, create an ASP.NET Core Web App project. Then, open the Connected Services dialog box, select Add a service dependency, and then select Storage Azurite emulator.

Connected services dialog box in ASP.NET Core Web App project

In the Configure Storage Azurite emulator dialog box, set the Connection string name field to StorageConnectionString, and then select Finish.

Configure Storage Azurite emulator dialog box

When the configuration completes, select Close. The Azurite emulator starts automatically.

Azurite command-line output in ASP.NET project

Command-line options

This section details the command line switches available when launching Azurite.

Help

Optional - Get command-line help by using the -h or --help switch.

azurite -h
azurite --help

Blob listening host

Optional - By default, Azurite will listen to 127.0.0.1 as the local server. Use the --blobHost switch to set the address to your requirements.

Accept requests on the local machine only:

azurite --blobHost 127.0.0.1

Allow remote requests:

azurite --blobHost 0.0.0.0

Caution

Allowing remote requests may make your system vulnerable to external attacks.

Blob listening port configuration

Optional - By default, Azurite will listen for the Blob service on port 10000. Use the --blobPort switch to specify the listening port that you require.

Note

After using a customized port, you need to update the connection string or corresponding configuration in your Azure Storage tools or SDKs.

Customize the Blob service listening port:

azurite --blobPort 8888

Let the system auto select an available port:

azurite --blobPort 0

The port in use is displayed during Azurite startup.

Queue listening host

Optional - By default, Azurite will listen to 127.0.0.1 as the local server. Use the --queueHost switch to set the address to your requirements.

Accept requests on the local machine only:

azurite --queueHost 127.0.0.1

Allow remote requests:

azurite --queueHost 0.0.0.0

Caution

Allowing remote requests may make your system vulnerable to external attacks.

Queue listening port configuration

Optional - By default, Azurite will listen for the Queue service on port 10001. Use the --queuePort switch to specify the listening port that you require.

Note

After using a customized port, you need to update the connection string or corresponding configuration in your Azure Storage tools or SDKs.

Customize the Queue service listening port:

azurite --queuePort 8888

Let the system auto select an available port:

azurite --queuePort 0

The port in use is displayed during Azurite startup.

Table listening host

Optional - By default, Azurite will listen to 127.0.0.1 as the local server. Use the --tableHost switch to set the address to your requirements.

Accept requests on the local machine only:

azurite --tableHost 127.0.0.1

Allow remote requests:

azurite --tableHost 0.0.0.0

Caution

Allowing remote requests may make your system vulnerable to external attacks.

Table listening port configuration

Optional - By default, Azurite will listen for the Table service on port 10002. Use the --tablePort switch to specify the listening port that you require.

Note

After using a customized port, you need to update the connection string or corresponding configuration in your Azure Storage tools or SDKs.

Customize the Table service listening port:

azurite --tablePort 11111

Let the system auto select an available port:

azurite --tablePort 0

The port in use is displayed during Azurite startup.

Workspace path

Optional - Azurite stores data to the local disk during execution. Use the -l or --location switch to specify a path as the workspace location. By default, the current process working directory will be used. Note the lowercase 'l'.

azurite -l c:\azurite
azurite --location c:\azurite

Access log

Optional - By default, the access log is displayed in the console window. Disable the display of the access log by using the -s or --silent switch.

azurite -s
azurite --silent

Debug log

Optional - The debug log includes detailed information on every request and exception stack trace. Enable the debug log by providing a valid local file path to the -d or --debug switch.

azurite -d path/debug.log
azurite --debug path/debug.log

Loose mode

Optional - By default, Azurite applies strict mode to block unsupported request headers and parameters. Disable strict mode by using the -L or --loose switch. Note the capital 'L'.

azurite -L
azurite --loose

Version

Optional - Display the installed Azurite version number by using the -v or --version switch.

azurite -v
azurite --version

Certificate configuration (HTTPS)

Optional - By default, Azurite uses the HTTP protocol. Enable HTTPS mode by providing a path to a Privacy Enhanced Mail (.pem) or Personal Information Exchange (.pfx) certificate file to the --cert switch.

When --cert is provided for a PEM file, you must provide a corresponding --key switch.

azurite --cert path/server.pem --key path/key.pem

When --cert is provided for a PFX file, you must provide a corresponding --pwd switch.

azurite --cert path/server.pfx --pwd pfxpassword

For detailed information on creating PEM and PFX files, see HTTPS Setup.

OAuth configuration

Optional - Enable OAuth authentication for Azurite by using the --oauth switch.

azurite --oauth basic --cert path/server.pem --key path/key.pem

Note

OAuth requires an HTTPS endpoint. Make sure HTTPS is enabled by providing --cert switch along with the --oauth switch.

Azurite supports basic authentication by specifying the basic parameter to the --oauth switch. Azurite will do basic authentication, like validating the incoming bearer token, checking the issuer, audience, and expiry. Azurite won't check the token signature or permissions.

Skip API Version Check

Optional - When starting up, Azurite checks that the requested API version is valid. The following command skips the API version check:

azurite --skipApiVersionCheck

Authorization for tools and SDKs

Connect to Azurite from Azure Storage SDKs or tools, like Azure Storage Explorer, by using any authentication strategy. Authentication is required. Azurite supports authorization with OAuth, Shared Key, and shared access signatures (SAS). Azurite also supports anonymous access to public containers.

If you're using the Azure SDKs, start Azurite with the --oauth basic and --cert --key/--pwd options.

Well-known storage account and key

Azurite accepts the same well-known account and key used by the legacy Azure Storage Emulator.

  • Account name: devstoreaccount1
  • Account key: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

Custom storage accounts and keys

Azurite supports custom storage account names and keys by setting the AZURITE_ACCOUNTS environment variable in the following format: account1:key1[:key2];account2:key1[:key2];....

For example, use a custom storage account that has one key:

set AZURITE_ACCOUNTS="account1:key1"
export AZURITE_ACCOUNTS="account1:key1"

Or use multiple storage accounts with two keys each:

set AZURITE_ACCOUNTS="account1:key1:key2;account2:key1:key2"
export AZURITE_ACCOUNTS="account1:key1:key2;account2:key1:key2"

Azurite refreshes custom account names and keys from the environment variable every minute by default. With this feature, you can dynamically rotate the account key, or add new storage accounts without restarting Azurite.

Note

The default devstoreaccount1 storage account is disabled when you set custom storage accounts.

Connection strings

The easiest way to connect to Azurite from your application is to configure a connection string in your application's configuration file that references the shortcut UseDevelopmentStorage=true. Here's an example of a connection string in an app.config file:

<appSettings>
  <add key="StorageConnectionString" value="UseDevelopmentStorage=true" />
</appSettings>

HTTP connection strings

You can pass the following connection strings to the Azure SDKs or tools, like Azure CLI 2.0 or Storage Explorer.

The full connection string is:

DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;

To connect to the blob service only, the connection string is:

DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;

To connect to the queue service only, the connection string is:

DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;

HTTPS connection strings

The full HTTPS connection string is:

DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=https://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=https://127.0.0.1:10001/devstoreaccount1;

To use the blob service only, the HTTPS connection string is:

DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=https://127.0.0.1:10000/devstoreaccount1;

To use the queue service only, the HTTPS connection string is:

DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;QueueEndpoint=https://127.0.0.1:10001/devstoreaccount1;

If you used dotnet dev-certs to generate your self-signed certificate, use the following connection string.

DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=https://localhost:10000/devstoreaccount1;QueueEndpoint=https://localhost:10001/devstoreaccount1;

Update the connection string when using custom storage accounts and keys.

For more information, see Configure Azure Storage connection strings.

Azure SDKs

To use Azurite with the Azure SDKs, use OAuth and HTTPS options:

azurite --oauth basic --cert certname.pem --key certname-key.pem

Azure Blob Storage

You can then instantiate a BlobContainerClient, BlobServiceClient, or BlobClient.

// With container URL and DefaultAzureCredential
var client = new BlobContainerClient(
    new Uri("https://127.0.0.1:10000/devstoreaccount1/container-name"), new DefaultAzureCredential()
  );

// With connection string
var client = new BlobContainerClient(
    "DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=https://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=https://127.0.0.1:10001/devstoreaccount1;", "container-name"
  );

// With account name and key
var client = new BlobContainerClient(
    new Uri("https://127.0.0.1:10000/devstoreaccount1/container-name"),
    new StorageSharedKeyCredential("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==")
  );

Azure Queue Storage

You can also instantiate a QueueClient or QueueServiceClient.

// With queue URL and DefaultAzureCredential
var client = new QueueClient(
    new Uri("https://127.0.0.1:10001/devstoreaccount1/queue-name"), new DefaultAzureCredential()
  );

// With connection string
var client = new QueueClient(
    "DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=https://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=https://127.0.0.1:10001/devstoreaccount1;", "queue-name"
  );

// With account name and key
var client = new QueueClient(
    new Uri("https://127.0.0.1:10001/devstoreaccount1/queue-name"),
    new StorageSharedKeyCredential("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==")
  );

Microsoft Azure Storage Explorer

You can use Storage Explorer to view the data stored in Azurite.

Connect to Azurite using HTTP

In Storage Explorer, connect to Azurite by following these steps:

  1. Select the Manage Accounts icon
  2. Select Add an account
  3. Select Attach to a local emulator
  4. Select Next
  5. Edit the Display name field to a name of your choice
  6. Select Next again
  7. Select Connect

Connect to Azurite using HTTPS

By default Storage Explorer won't open an HTTPS endpoint that uses a self-signed certificate. If you're running Azurite with HTTPS, you're likely using a self-signed certificate. In Storage Explorer, import SSL certificates via the Edit -> SSL Certificates -> Import Certificates dialog.

Import Certificate to Storage Explorer
  1. Find the certificate on your local machine.
  2. In Storage Explorer, go to Edit -> SSL Certificates -> Import Certificates and import your certificate.

If you don't import a certificate, you'll get an error:

unable to verify the first certificate or self signed certificate in chain

Add Azurite via HTTPS connection string

Follow these steps to add Azurite HTTPS to Storage Explorer:

  1. Select Toggle Explorer
  2. Select Local & Attached
  3. Right-click on Storage Accounts and select Connect to Azure Storage.
  4. Select Use a connection string
  5. Select Next.
  6. Enter a value in the Display name field.
  7. Enter the HTTPS connection string from the previous section of this document
  8. Select Next
  9. Select Connect

Workspace structure

The following files and folders may be created in the workspace location when initializing Azurite.

  • __blobstorage__ - Directory containing Azurite blob service persisted binary data
  • __queuestorage__ - Directory containing Azurite queue service persisted binary data
  • __azurite_db_blob__.json - Azurite blob service metadata file
  • __azurite_db_blob_extent__.json - Azurite blob service extent metadata file
  • __azurite_db_queue__.json - Azurite queue service metadata file
  • __azurite_db_queue_extent__.json - Azurite queue service extent metadata file

To clean up Azurite, delete above files and folders and restart the emulator.

Differences between Azurite and Azure Storage

There are functional differences between a local instance of Azurite and an Azure Storage account in the cloud.

Endpoint and connection URL

The service endpoints for Azurite are different from the endpoints of an Azure Storage account. The local computer doesn't do domain name resolution, requiring Azurite endpoints to be local addresses.

When you address a resource in an Azure Storage account, the account name is part of the URI host name. The resource being addressed is part of the URI path:

<http|https>://<account-name>.<service-name>.core.windows.net/<resource-path>

The following URI is a valid address for a blob in an Azure Storage account:

https://myaccount.blob.core.windows.net/mycontainer/myblob.txt

Since the local computer doesn't do domain name resolution, the account name is part of the URI path instead of the host name. Use the following URI format for a resource in Azurite:

http://<local-machine-address>:<port>/<account-name>/<resource-path>

The following address might be used for accessing a blob in Azurite:

http://127.0.0.1:10000/myaccount/mycontainer/myblob.txt

Scaling and performance

Azurite doesn't support large numbers of connected clients. There's no performance guarantee. Azurite is intended for development and testing purposes.

Error handling

Azurite is aligned with Azure Storage error handling logic, but there are differences. For example, error messages may be different, while error status codes align.

RA-GRS

Azurite supports read-access geo-redundant replication (RA-GRS). For storage resources, access the secondary location by appending -secondary to the account name. For example, the following address might be used for accessing a blob using the read-only secondary in Azurite:

http://127.0.0.1:10000/devstoreaccount1-secondary/mycontainer/myblob.txt

Table support

Support for tables in Azurite is currently in preview. For more information, see the Azurite V3 Table project.

Support for durable functions requires tables.

Important

Azurite support for Table Storage is currently in PREVIEW. See the Supplemental Terms of Use for Microsoft Azure Previews for legal terms that apply to Azure features that are in beta, preview, or otherwise not yet released into general availability.

Azurite is open-source

Contributions and suggestions for Azurite are welcome. Go to the Azurite GitHub project page or GitHub issues for milestones and work items we're tracking for upcoming features and bug fixes. Detailed work items are also tracked in GitHub.

Next steps