3 min read
Azure App Configuration: Centralized Settings Management
Azure App Configuration provides centralized configuration management. Feature flags, settings, and secrets—all in one place with change notifications.
Creating App Configuration
az appconfig create \
--name my-app-config \
--resource-group myRG \
--location eastus \
--sku Standard
Setting Configuration Values
# Set key-value
az appconfig kv set \
--name my-app-config \
--key "Settings:ApiEndpoint" \
--value "https://api.example.com"
# Set with label (for environments)
az appconfig kv set \
--name my-app-config \
--key "Settings:ConnectionString" \
--value "Server=dev-server" \
--label "Development"
az appconfig kv set \
--name my-app-config \
--key "Settings:ConnectionString" \
--value "Server=prod-server" \
--label "Production"
# Reference Key Vault secret
az appconfig kv set-keyvault \
--name my-app-config \
--key "Settings:DatabasePassword" \
--secret-identifier "https://myvault.vault.azure.net/secrets/db-password"
.NET Integration
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// Add App Configuration
builder.Configuration.AddAzureAppConfiguration(options =>
{
options.Connect(builder.Configuration["ConnectionStrings:AppConfig"])
.Select(KeyFilter.Any, LabelFilter.Null)
.Select(KeyFilter.Any, builder.Environment.EnvironmentName)
.ConfigureKeyVault(kv => kv.SetCredential(new DefaultAzureCredential()))
.ConfigureRefresh(refresh =>
{
refresh.Register("Settings:RefreshToken", refreshAll: true)
.SetCacheExpiration(TimeSpan.FromSeconds(30));
})
.UseFeatureFlags(flags =>
{
flags.CacheExpirationInterval = TimeSpan.FromMinutes(5);
});
});
// Add middleware for refresh
builder.Services.AddAzureAppConfiguration();
var app = builder.Build();
app.UseAzureAppConfiguration();
// Inject configuration
public class MyService
{
private readonly IConfiguration _config;
public MyService(IConfiguration config)
{
_config = config;
}
public string GetApiEndpoint()
{
return _config["Settings:ApiEndpoint"];
}
}
Feature Flags
# Create feature flag
az appconfig feature set \
--name my-app-config \
--feature "BetaFeature" \
--label "Production"
# Enable/disable
az appconfig feature enable --name my-app-config --feature "BetaFeature"
az appconfig feature disable --name my-app-config --feature "BetaFeature"
Feature Flag Filters
{
"id": "BetaFeature",
"enabled": true,
"conditions": {
"client_filters": [
{
"name": "Percentage",
"parameters": {
"Value": 25
}
},
{
"name": "Targeting",
"parameters": {
"Audience": {
"Users": ["user1@company.com"],
"Groups": [
{ "Name": "BetaTesters", "RolloutPercentage": 100 }
],
"DefaultRolloutPercentage": 10
}
}
}
]
}
}
Using Feature Flags
public class HomeController : Controller
{
private readonly IFeatureManager _featureManager;
public HomeController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
public async Task<IActionResult> Index()
{
if (await _featureManager.IsEnabledAsync("BetaFeature"))
{
return View("BetaIndex");
}
return View();
}
}
<!-- In Razor views -->
<feature name="BetaFeature">
<div class="beta-content">
New Beta Feature!
</div>
</feature>
Configuration Snapshots
# Create snapshot
az appconfig snapshot create \
--name my-app-config \
--snapshot-name "release-v1.0" \
--filters '{key="Settings:*", label="Production"}'
# List snapshots
az appconfig snapshot list --name my-app-config
# Archive snapshot
az appconfig snapshot archive \
--name my-app-config \
--snapshot-name "release-v1.0"
Event Grid Integration
# Subscribe to configuration changes
az eventgrid event-subscription create \
--name config-changes \
--source-resource-id /subscriptions/.../appconfig/my-app-config \
--endpoint https://myapp.com/webhook \
--included-event-types Microsoft.AppConfiguration.KeyValueModified
App Configuration: dynamic settings without redeployment.