Local Azure provisioning
Dieser Inhalt ist noch nicht in deiner Sprache verfügbar.
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.
How it works
Section titled “How it works”When you add an Azure resource using methods like AddAzureStorage() or AddAzureServiceBus(), Aspire:
- Detects that the resource doesn’t exist locally
- Generates Bicep infrastructure-as-code
- Uses Azure CLI or Azure SDK to deploy resources
- Configures connection information automatically
- Injects configuration into your application
Prerequisites
Section titled “Prerequisites”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
Configuration
Section titled “Configuration”Local provisioning requires configuring your Azure subscription and location. You can do this in multiple ways:
User secrets
Section titled “User secrets”The recommended approach for development is using user secrets:
dotnet user-secrets init --project ./YourAppHost/YourAppHost.csprojdotnet user-secrets set "Azure:SubscriptionId" "your-subscription-id" --project ./YourAppHostdotnet user-secrets set "Azure:Location" "eastus" --project ./YourAppHostappsettings.json
Section titled “appsettings.json”Alternatively, configure in appsettings.Development.json:
{ "Azure": { "SubscriptionId": "your-subscription-id", "Location": "eastus", "CredentialSource": "AzureCli" }}Environment variables
Section titled “Environment variables”You can also use environment variables:
TODO
$env:Azure__SubscriptionId = "your-subscription-id"$env:Azure__Location = "eastus"Configuration options
Section titled “Configuration options”The following configuration options are available:
| Setting | Description | Default |
|---|---|---|
Azure:SubscriptionId | Your Azure subscription ID | (required) |
Azure:Location | Azure region for resources | (required) |
Azure:CredentialSource | Authentication method | AzureCli |
Azure:AllowResourceGroupCreation | Allow creating resource groups | true |
Resource group management
Section titled “Resource group management”By default, Aspire creates a resource group for your provisioned resources. The resource group name follows the pattern: rg-{apphost-name}.
Use an existing resource group
Section titled “Use an existing resource group”To use an existing resource group:
{ "Azure": { "SubscriptionId": "your-subscription-id", "Location": "eastus", "ResourceGroup": "my-existing-rg" }}Disable resource group creation
Section titled “Disable resource group creation”To prevent Aspire from creating resource groups:
{ "Azure": { "SubscriptionId": "your-subscription-id", "Location": "eastus", "AllowResourceGroupCreation": false, "ResourceGroup": "my-existing-rg" }}Using local provisioning
Section titled “Using local provisioning”-
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); -
Configure Azure subscription (if not already done)
Terminal window dotnet user-secrets set "Azure:SubscriptionId" "your-sub-id" --project ./AppHostdotnet user-secrets set "Azure:Location" "eastus" --project ./AppHost -
Run your application
Terminal window aspire run -
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
Authentication
Section titled “Authentication”Local provisioning supports multiple authentication methods:
Azure CLI (Default)
Section titled “Azure CLI (Default)”Uses your Azure CLI credentials:
az loginConfiguration:
{ "Azure": { "CredentialSource": "AzureCli" }}Managed Identity
Section titled “Managed Identity”When running in Azure (e.g., Azure Container Instances):
{ "Azure": { "CredentialSource": "ManagedIdentity" }}Visual Studio
Section titled “Visual Studio”Uses Visual Studio’s Azure account:
{ "Azure": { "CredentialSource": "VisualStudio" }}Provisioned resource naming
Section titled “Provisioned resource naming”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.
Generated infrastructure
Section titled “Generated infrastructure”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
Limitations
Section titled “Limitations”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
Troubleshooting
Section titled “Troubleshooting”Authentication failures
Section titled “Authentication failures”If you see authentication errors:
az loginaz account set --subscription "your-subscription-id"Insufficient permissions
Section titled “Insufficient permissions”Ensure your account has Contributor role:
az role assignment list --assignee your-email@domain.comResource naming conflicts
Section titled “Resource naming conflicts”If resource names conflict, delete the existing resources or change your app name:
az group delete --name rg-myappView provisioning logs
Section titled “View provisioning logs”Enable detailed logging:
{ "Logging": { "LogLevel": { "Aspire.Hosting.Azure": "Debug" } }}Comparison with manual provisioning
Section titled “Comparison with manual provisioning”| Aspect | Local Provisioning | Manual Provisioning |
|---|---|---|
| Setup time | Automatic | Manual Azure Portal/CLI |
| Configuration | Automatic | Manual connection strings |
| Infrastructure as Code | Auto-generated Bicep | Manual Bicep/ARM |
| Development speed | Fast | Slower |
| Learning curve | Lower | Higher |
| Control | Good (via ConfigureInfrastructure) | Full |
| Cost | Pay for provisioned resources | Pay for provisioned resources |