-
Notifications
You must be signed in to change notification settings - Fork 291
Description
For developers who want their secrets in Azure Key Vault, support a syntax in the config that allows it.
Added properties
{
"azure-key-vault" : {
"endpoint": "url", (string, required when @akv() is present)
"retry-policy": {
"mode": "fixed | exponential", (enum, default: exponential)
"max-count": 3, (integer, default: 3)
"delay-seconds": 1, (integer, default: 1)
"max-delay-seconds": 100 (integer, default: 60),
"network-timeout-seconds": 100 (integer, default: 60),
}
}
}| Setting | Meaning | Default | Min | Max |
|---|---|---|---|---|
endpoint |
Key Vault URL | (not required) | ||
retry-policy / mode |
Retry strategy | exponential |
- | - |
retry-policy / max-count |
Max retry attempts | 3 (for both strategies) |
0 | int.MaxValue |
retry-policy / delay-seconds |
Initial delay between retries | 1 (for both strategies) |
1 | int.MaxValue |
retry-policy / max-delay-seconds |
Max delay cap | 60 (only for exponential) |
1 | int.MaxValue |
retry-policy / network-timeout-seconds |
Max network timeout per try | 60 |
1 | int.MaxValue |
JSON Schema
Update our JSON schema. Add properties and constraints and defaults.
azure-key-vaultis not required.azure-key-vault.endpointis required whenazure-key-vaultis present.
CLI updates
Add command line support.
- Add
dab configure --azure-key-vault.endpoint - Add
dab configure --azure-key-vault.retry-policy.mode - Add
dab configure --azure-key-vault.retry-policy.max-count - Add
dab configure --azure-key-vault.retry-policy.delay-seconds - Add
dab configure --azure-key-vault.retry-policy.max-delay-seconds - Add
dab configure --azure-key-vault.retry-policy.network-timeout-seconds
Added syntax
Support new @akv() method to replace property values in our DAB configuration.
{
"data-source": {
"connection-string": "@akv('my-connection-string')"
}
}This works. Because env runs first.
{
"data-source": {
"connection-string": "@akv('my-connection-string')"
},
"azure-key-vault": {
"endpoint": "@env('my-akv-endpoint')"
}
}Details
@env()executes before@akv(). So,azure-key-vault.endpointcan be set by@env().- For
@akv('key-value'), "key-value" is the secret name. - Like
@env()DAB supports@akv()for any config property. - Using
@akv()requires either system-assigned or user-assigned managed identity. - The
@akv()function works in both modedevelopmentandproduction. - The syntax
@env('@akv('value')')is not supported and would look for an env named@akv('value'). - However, the syntax
@akv('@env('value')')is supported. - The DAB config does not monitor, listen to or poll AKV for secret changes. Requires restart.
Key rules (based on AKV docs)
| Rule | Constraint |
|---|---|
| Allowed chars | Alphanumeric and - (hyphen) |
| Disallowed | No spaces, no _, /, @, ., etc. |
| Start/end | Must start and end with an alphanumeric character |
| Length | 1 to 127 characters |
| Case | Case-insensitive (MySecret = mysecret) |
| Uniqueness | Must be unique within the Key Vault |
Multiple configs
DAB supports multiple configuration files, where the top-level config is the master and others inherit runtime settings from it. Child configs define their own connection strings in the data-source property and may also have unique azure-key-vault.endpoint values. If a child omits the endpoint, it inherits the setting from the master config, which is required only if the child omits it.
- Each config file can define a unique
azure-key-vault.endpointvalue. - If a child omits
azure-key-vault.endpoint, it inherits from the master. - A child may use
@akv()even if the master does not define an endpoint. However, in this case, the child configuration must define an endpoint value.
Consideration
- Include an OTEL
activitywrapping the replacement. - (would be nice) Include an OTEL
activitywrapping the replacement for@env().
Errors
- When
@akv()appears withoutazure-key-vault.endpoint, we will log (as error) and fail to start. - When
@akv()connection fails (for any reason), we will log the reason (as error) and fail to start. - When
@akv()secret not found, we will log "secret not found: {property-name}" (as error) and fail to start. - When
@akv()fails during hot reload, we will log "@akv error: {message}", then return to "last known good".
Flow
sequenceDiagram
actor Engine as Engine
participant ConfigInMem as ConfigInMem
participant Environment as Environment
participant AKV as AKV
participant Config as ConfigFile
Engine ->> Engine: Pre-Start
Engine ->> Config: Load Config
Config -->> Engine: Config Data
Engine ->> ConfigInMem: Create In-Memory Config
Note over Engine: Perform Config Replacements
activate Engine
ConfigInMem -->> Engine: Parse @env Values
Engine ->> Environment: Get
Environment -->> Engine: Values
Engine ->> ConfigInMem: Replace @env Values
deactivate Engine
Note over Engine: Use Config With ENV Replacements
activate Engine
ConfigInMem -->> Engine: Parse @akv Values
Engine ->> AKV: Request
AKV -->> Engine: Secrets
Engine ->> ConfigInMem: Replace @akv Values
deactivate Engine
Note over Engine: Use Config With AKV Replacements
Engine ->> Engine: Start
JerryNixon
Sub-issues
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Done