Aller au contenu

Local Azure provisioning

Ce contenu n’est pas encore disponible dans votre langue.

Local Azure provisioning enables Aspire to automatically create and configure Azure resources during local development. When you add Azure resources to your AppHost and run your application, Aspire can provision those resources in your Azure subscription without manual intervention.

When you add an Azure resource using methods like AddAzureStorage() or AddAzureServiceBus(), Aspire:

  1. Detects that the resource doesn’t exist locally
  2. Generates Bicep infrastructure-as-code
  3. Uses Azure CLI or Azure SDK to deploy resources
  4. Configures connection information automatically
  5. Injects configuration into your application

Before using local provisioning, ensure you have:

  • Azure subscription: An active Azure subscription
  • Azure CLI: Installed and authenticated (az login)
  • Appropriate permissions: Contributor access to create resources
  • Aspire 9.0+: Local provisioning requires Aspire 9.0 or later

Local provisioning requires configuring your Azure subscription and location. You can do this in multiple ways:

The recommended approach for development is using user secrets:

Terminal window
dotnet user-secrets init --project ./YourAppHost/YourAppHost.csproj
dotnet user-secrets set "Azure:SubscriptionId" "your-subscription-id" --project ./YourAppHost
dotnet user-secrets set "Azure:Location" "eastus" --project ./YourAppHost

Alternatively, configure in appsettings.Development.json:

{
"Azure": {
"SubscriptionId": "your-subscription-id",
"Location": "eastus",
"CredentialSource": "AzureCli"
}
}

You can also use environment variables:

TODO

Terminal window
$env:Azure__SubscriptionId = "your-subscription-id"
$env:Azure__Location = "eastus"

The following configuration options are available:

SettingDescriptionDefault
Azure:SubscriptionIdYour Azure subscription ID(required)
Azure:LocationAzure region for resources(required)
Azure:CredentialSourceAuthentication methodAzureCli
Azure:AllowResourceGroupCreationAllow creating resource groupstrue

By default, Aspire creates a resource group for your provisioned resources. The resource group name follows the pattern: rg-{apphost-name}.

To use an existing resource group:

{
"Azure": {
"SubscriptionId": "your-subscription-id",
"Location": "eastus",
"ResourceGroup": "my-existing-rg"
}
}

To prevent Aspire from creating resource groups:

{
"Azure": {
"SubscriptionId": "your-subscription-id",
"Location": "eastus",
"AllowResourceGroupCreation": false,
"ResourceGroup": "my-existing-rg"
}
}
  1. Add Azure resources to your AppHost

    var builder = DistributedApplication.CreateBuilder(args);
    var storage = builder.AddAzureStorage("storage");
    var blobs = storage.AddBlobs("blobs");
    builder.AddProject<Projects.WebApp>("webapp")
    .WithReference(blobs);
  2. Configure Azure subscription (if not already done)

    Terminal window
    dotnet user-secrets set "Azure:SubscriptionId" "your-sub-id" --project ./AppHost
    dotnet user-secrets set "Azure:Location" "eastus" --project ./AppHost
  3. Run your application

    Terminal window
    aspire run
  4. Automatic provisioning

    Aspire detects the Azure resources and provisions them automatically. You’ll see output like:

    [Azure Provisioning] Creating resource group: rg-myapp
    [Azure Provisioning] Deploying storage account: stmyapp
    [Azure Provisioning] Deployment complete

Local provisioning supports multiple authentication methods:

Uses your Azure CLI credentials:

Terminal window
az login

Configuration:

{
"Azure": {
"CredentialSource": "AzureCli"
}
}

When running in Azure (e.g., Azure Container Instances):

{
"Azure": {
"CredentialSource": "ManagedIdentity"
}
}

Uses Visual Studio’s Azure account:

{
"Azure": {
"CredentialSource": "VisualStudio"
}
}

Aspire generates unique resource names following Azure naming conventions:

  • Storage accounts: st{appname}{hash} (lowercase, no hyphens)
  • Key Vaults: kv-{appname}-{hash} (hyphens allowed)
  • Service Bus: sb-{appname}-{hash}
  • Cosmos DB: cosmos-{appname}-{hash}

The hash ensures uniqueness across subscriptions.

When you use local provisioning, Aspire generates Bicep files in the ./infra directory of your AppHost project. These files:

  • Define all Azure resources
  • Include configurations and connections
  • Can be customized using ConfigureInfrastructure()
  • Are used for both local provisioning and production deployment

Example generated structure:

  • AppHost/ ─ infra ─ main.bicep ─ storage.bicep ─ servicebus.bicep ─ Program.cs

Local provisioning has some limitations:

  • First-run delays: Initial provisioning takes several minutes
  • Subscription limits: Subject to Azure subscription quotas
  • Network requirements: Requires internet connectivity
  • Cost considerations: Provisioned resources incur Azure charges

If you see authentication errors:

Terminal window
az login
az account set --subscription "your-subscription-id"

Ensure your account has Contributor role:

Terminal window
az role assignment list --assignee your-email@domain.com

If resource names conflict, delete the existing resources or change your app name:

Terminal window
az group delete --name rg-myapp

Enable detailed logging:

{
"Logging": {
"LogLevel": {
"Aspire.Hosting.Azure": "Debug"
}
}
}
AspectLocal ProvisioningManual Provisioning
Setup timeAutomaticManual Azure Portal/CLI
ConfigurationAutomaticManual connection strings
Infrastructure as CodeAuto-generated BicepManual Bicep/ARM
Development speedFastSlower
Learning curveLowerHigher
ControlGood (via ConfigureInfrastructure)Full
CostPay for provisioned resourcesPay for provisioned resources
Questions & RéponsesCollaborerCommunautéDiscuterRegarder