| name | azure_appconfiguration_ts |
| description | Build applications using Azure App Configuration SDK for JavaScript (@azure/app-configuration). Use when working with configuration settings, feature flags, Key Vault references, dynamic refresh, or centralized configuration management. |
| license | MIT |
| metadata | {"author":"Microsoft","version":"1.0.0","package":"@azure/app-configuration"} |
Azure App Configuration SDK for TypeScript
Centralized configuration management with feature flags and dynamic refresh.
Installation
npm install @azure/app-configuration @azure/identity
npm install @azure/app-configuration-provider @azure/identity
npm install @microsoft/feature-management
Environment Variables
AZURE_APPCONFIG_ENDPOINT=https://<your-resource>.azconfig.io
AZURE_APPCONFIG_CONNECTION_STRING=Endpoint=https://...;Id=...;Secret=...
Authentication
import { AppConfigurationClient } from "@azure/app-configuration";
import { DefaultAzureCredential } from "@azure/identity";
const client = new AppConfigurationClient(
process.env.AZURE_APPCONFIG_ENDPOINT!,
new DefaultAzureCredential()
);
const client2 = new AppConfigurationClient(
process.env.AZURE_APPCONFIG_CONNECTION_STRING!
);
CRUD Operations
Create/Update Settings
await client.addConfigurationSetting({
key: "app:settings:message",
value: "Hello World",
label: "production",
contentType: "text/plain",
tags: { environment: "prod" },
});
await client.setConfigurationSetting({
key: "app:settings:message",
value: "Updated value",
label: "production",
});
const existing = await client.getConfigurationSetting({ key: "myKey" });
existing.value = "new value";
await client.setConfigurationSetting(existing, { onlyIfUnchanged: true });
Read Settings
const setting = await client.getConfigurationSetting({
key: "app:settings:message",
label: "production",
});
console.log(setting.value);
const settings = client.listConfigurationSettings({
keyFilter: "app:*",
labelFilter: "production",
});
for await (const setting of settings) {
console.log(`${setting.key}: ${setting.value}`);
}
Delete Settings
await client.deleteConfigurationSetting({
key: "app:settings:message",
label: "production",
});
Lock/Unlock (Read-Only)
await client.setReadOnly({ key: "myKey", label: "prod" }, true);
await client.setReadOnly({ key: "myKey", label: "prod" }, false);
App Configuration Provider
Load Configuration
import { load } from "@azure/app-configuration-provider";
import { DefaultAzureCredential } from "@azure/identity";
const appConfig = await load(
process.env.AZURE_APPCONFIG_ENDPOINT!,
new DefaultAzureCredential(),
{
selectors: [
{ keyFilter: "app:*", labelFilter: "production" },
],
trimKeyPrefixes: ["app:"],
}
);
const value = appConfig.get("settings:message");
const config = appConfig.constructConfigurationObject({ separator: ":" });
console.log(config.settings.message);
Dynamic Refresh
const appConfig = await load(endpoint, credential, {
selectors: [{ keyFilter: "app:*" }],
refreshOptions: {
enabled: true,
refreshIntervalInMs: 30_000,
},
});
appConfig.refresh();
const disposer = appConfig.onRefresh(() => {
console.log("Configuration refreshed!");
});
app.use((req, res, next) => {
appConfig.refresh();
next();
});
Key Vault References
const appConfig = await load(endpoint, credential, {
selectors: [{ keyFilter: "app:*" }],
keyVaultOptions: {
credential: new DefaultAzureCredential(),
secretRefreshIntervalInMs: 7200_000,
},
});
const dbPassword = appConfig.get("database:password");
Feature Flags
Create Feature Flag (Low-Level)
import {
featureFlagPrefix,
featureFlagContentType,
FeatureFlagValue,
ConfigurationSetting,
} from "@azure/app-configuration";
const flag: ConfigurationSetting<FeatureFlagValue> = {
key: `${featureFlagPrefix}Beta`,
contentType: featureFlagContentType,
value: {
id: "Beta",
enabled: true,
description: "Beta feature",
conditions: {
clientFilters: [
{
name: "Microsoft.Targeting",
parameters: {
Audience: {
Users: ["user@example.com"],
Groups: [{ Name: "beta-testers", RolloutPercentage: 50 }],
DefaultRolloutPercentage: 0,
},
},
},
],
},
},
};
await client.addConfigurationSetting(flag);
Load and Evaluate Feature Flags
import { load } from "@azure/app-configuration-provider";
import {
ConfigurationMapFeatureFlagProvider,
FeatureManager,
} from "@microsoft/feature-management";
const appConfig = await load(endpoint, credential, {
featureFlagOptions: {
enabled: true,
selectors: [{ keyFilter: "*" }],
refresh: {
enabled: true,
refreshIntervalInMs: 30_000,
},
},
});
const featureProvider = new ConfigurationMapFeatureFlagProvider(appConfig);
const featureManager = new FeatureManager(featureProvider);
const isEnabled = await featureManager.isEnabled("Beta");
const isEnabledForUser = await featureManager.isEnabled("Beta", {
userId: "user@example.com",
groups: ["beta-testers"],
});
Snapshots
const snapshot = await client.beginCreateSnapshotAndWait({
name: "release-v1.0",
retentionPeriod: 2592000,
filters: [{ keyFilter: "app:*", labelFilter: "production" }],
});
const snap = await client.getSnapshot("release-v1.0");
const settings = client.listConfigurationSettingsForSnapshot("release-v1.0");
for await (const setting of settings) {
console.log(`${setting.key}: ${setting.value}`);
}
await client.archiveSnapshot("release-v1.0");
await client.recoverSnapshot("release-v1.0");
const config = await load(endpoint, credential, {
selectors: [{ snapshotName: "release-v1.0" }],
});
Labels
await client.setConfigurationSetting({
key: "database:host",
value: "dev-db.example.com",
label: "development",
});
await client.setConfigurationSetting({
key: "database:host",
value: "prod-db.example.com",
label: "production",
});
const prodSettings = client.listConfigurationSettings({
keyFilter: "*",
labelFilter: "production",
});
const noLabelSettings = client.listConfigurationSettings({
labelFilter: "\0",
});
for await (const label of client.listLabels()) {
console.log(label.name);
}
Key Types
import {
AppConfigurationClient,
ConfigurationSetting,
FeatureFlagValue,
SecretReferenceValue,
featureFlagPrefix,
featureFlagContentType,
secretReferenceContentType,
ListConfigurationSettingsOptions,
} from "@azure/app-configuration";
import { load } from "@azure/app-configuration-provider";
import {
FeatureManager,
ConfigurationMapFeatureFlagProvider,
} from "@microsoft/feature-management";
Best Practices
- Use provider for apps -
@azure/app-configuration-provider for runtime config
- Use low-level for management -
@azure/app-configuration for CRUD operations
- Enable refresh - For dynamic configuration updates
- Use labels - Separate configurations by environment
- Use snapshots - For immutable release configurations
- Sentinel pattern - Use a sentinel key to trigger full refresh
- RBAC roles -
App Configuration Data Reader for read-only access