Solution Development Standards
Canonical reference: Solution Development Standard (full)
Applies to: All AzureLocal solution repositories
Last Updated: 2026-03-17
IaC Tool Support
Each tool must declare which deployment phases it supports:
| Tool | Azure Resources | Configuration | Networking | Monitoring |
|---|---|---|---|---|
| Terraform | ✅ | Delegates | ✅ | ✅ |
| Bicep | ✅ | Delegates | ✅ | ✅ |
| ARM | ✅ | Delegates | ✅ | ✅ |
| PowerShell | ✅ | ✅ | ✅ | ✅ |
| Ansible | ✅ | ✅ | ✅ | ✅ |
Delegates
"Delegates" means the tool provisions Azure resources but does not configure the guest OS. A separate tool (PowerShell or Ansible) handles guest configuration.
Parameter File Derivation
All tool-specific parameter files MUST be derivable from config/variables.yml:
| Tool | Parameter File | Derivation |
|---|---|---|
| Terraform | src/terraform/terraform.tfvars | Map YAML sections to HCL variables |
| Bicep | src/bicep/main.bicepparam | Map YAML sections to Bicep parameters |
| ARM | src/arm/azuredeploy.parameters.json | Map YAML sections to ARM parameter schema |
| PowerShell | (reads config directly) | ConvertFrom-Yaml from config file |
| Ansible | src/ansible/inventory/hosts.yml | Map YAML sections to group_vars |
The central config is the single source of truth. Tool-specific files are convenience copies that should be regenerable.
Conditional Resource Support
| Tool | Mechanism | Example |
|---|---|---|
| Terraform | count / for_each | count = var.enable_feature ? 1 : 0 |
| Bicep | if condition | resource res '...' = if (enableFeature) { ... } |
| ARM | condition property | "condition": "[equals(parameters('enableFeature'), 'true')]" |
| PowerShell | switch / if | if ($config.feature_enabled) { ... } |
| Ansible | when: clause | when: enable_feature == true |
All tools must produce identical infrastructure when given the same configuration values.
Multi-Tool Parity
- Every supported tool must cover the same set of resources
- Tool-specific parameter files are derived from
config/variables.yml - CI tests validate that each tool's output matches the expected state
- New resources added to one tool must be added to all supported tools