Subchapter 28.18
references/recipes/terraform/README.mdMarkdown4 KBView on GitHub
./infra/main.tf existsRun the pre-built validation script instead of executing each check by hand. It runs the full deterministic preflight sequence in one call and prints a compact PASS / FAIL / SKIP summary plus captured error text for any failed step — jump straight to remediation without re-parsing raw command output.
| Script | Purpose |
|---|---|
scripts/validate-terraform.sh | Bash preflight runner |
scripts/validate-terraform.ps1 | PowerShell preflight runner |
The script runs, in order: Terraform installed → Azure CLI installed → authenticated
(az account show) → terraform init → fmt -check → validate → plan →
state list → Go-style {{ .Env.* }} template-variable scan → main.tfvars.json
JSON-syntax check. A subscription-selection step is added when a subscription id is
supplied. It runs every check even if an earlier one fails, and exits non-zero when
any step fails.
Usage:
./scripts/validate-terraform.sh [infra-dir] [subscription-id] # infra-dir defaults to ./infra.\scripts\validate-terraform.ps1 [-InfraDir <path>] [-SubscriptionId <id>]Examples:
./scripts/validate-terraform.sh # validate ./infra
./scripts/validate-terraform.sh ./infra 00000000-0000-0000-0000-000000000000.\scripts\validate-terraform.ps1 -InfraDir ./infraReading the output: the summary table lists every step as PASS, FAIL, or SKIP
(skipped when a prerequisite such as Terraform or the infra directory is missing). Each
FAIL is expanded in a FAILURE DETAILS section with the captured error text. Fix
failed steps using the guidance below, then re-run the script.
The script only runs and reports — fixing failures is manual. Guidance per step:
mcp_azure_mcp_extension_cli_install(cli-type: "az")az login
az account set --subscription <subscription-id>terraform fmt -recursiveRead the captured error text in the script output, then consult Error handling.
The script does not cover policy checks. See Policy Validation Guide for retrieving and validating Azure policies for your subscription.
⚠️ CRITICAL for azd+Terraform projects. azd substitutes
${VAR}references inmain.tfvars.jsonvia envsubst, but does NOT interpolate Go-style template variables ({{ .Env.* }}). Unresolved Go-style template strings passed to Terraform cause cascading deployment failures, state conflicts, and timeouts.
When the template-variable scan reports FAIL:
main.tfvars.json — replace {{ .Env.VAR }} with ${VAR}:
{ "environment_name": "${AZURE_ENV_NAME}", "location": "${AZURE_LOCATION}" }TF_VAR_* environment variables:
azd env set TF_VAR_environment_name "$(azd env get-value AZURE_ENV_NAME)"variables.tf declares all required variables.terraform validate / plan and the scan now pass.Prefer putting static defaults in
variables.tfdefaultvalues. Usingterraform.tfvars(HCL) for static defaults is acceptable if your team prefers it; this restriction is specifically about avoiding Go-style template expressions in.tfvars.jsonfiles.
All checks pass → azure-deploy