CtrlK
BlogDocsLog inGet started
Tessl Logo

terraform-patterns

Reusable Azure Terraform patterns: hub-spoke, private endpoints, diagnostics, AVM-TF modules. USE FOR: Terraform template design, hub-spoke networking, AVM modules, plan interpretation. DO NOT USE FOR: Bicep code, architecture decisions, troubleshooting, diagram generation.

95

Quality

93%

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Passed

No known issues

SKILL.md
Quality
Evals
Security

Azure Terraform Patterns Skill

Composable architecture building blocks for Azure Terraform. Complements iac-terraform-best-practices.instructions.md (style) and azure-defaults skill (naming, tags, regions).


Quick Reference

PatternWhen to UseReference
Hub-Spoke NetworkingMulti-workload environments with shared servicesreferences/hub-spoke-pattern.md
Private Endpoint WiringAny PaaS service requiring private connectivityreferences/private-endpoint-pattern.md
Diagnostic SettingsEvery deployed resource (mandatory)references/common-patterns.md
Conditional DeploymentOptional resources controlled by variablesreferences/common-patterns.md
Module CompositionCalling multiple AVM modules in root moduleSee inline example below
Managed IdentityAny service-to-service authenticationreferences/common-patterns.md
Budget & Cost MonitoringEvery deployment (mandatory)references/budget-pattern.md
Plan InterpretationPre-deployment validation and change analysisreferences/plan-interpretation.md
AVM PitfallsSet-type diffs, provider pins, 4.x changesreferences/avm-pitfalls.md
AVM AuthoringAVM certification requirements, compliancereferences/avm-authoring-requirements.md
Module RefactoringMonolith → module extraction, state migrationreferences/refactor-module.md

Canonical Example — Module Composition

Wire AVM child modules by passing outputs as inputs; never hardcode IDs:

module "resource_group" {
  source  = "Azure/avm-res-resources-resourcegroup/azurerm"
  version = "~> 0.1"
  name     = "rg-${var.project}-${var.environment}"
  location = var.location
  tags     = local.tags
}

module "key_vault" {
  source  = "Azure/avm-res-keyvault-vault/azurerm"
  version = "~> 0.9"
  name                = local.kv_name
  resource_group_name = module.resource_group.name  # ← output wiring
  location            = var.location
  tenant_id           = data.azurerm_client_config.current.tenant_id
  tags                = local.tags
}

Key Rules

  • AVM-first: Use Azure/avm-res-* registry modules over raw azurerm_* resources
  • Hub-spoke: Spokes peer to hub only; never spoke-to-spoke
  • Private endpoints: Three resources per service — PE, DNS zone, VNet link
  • Diagnostics: Every resource MUST have a diagnostic setting → Log Analytics
  • Conditional: Use for_each (keyed) over count (indexed) for named resources
  • Identity: SystemAssigned managed identity + RBAC; avoid keys/connection strings
  • Provider pin: ~> 4.0 (allows 4.x patches, blocks 5.0)
  • Telemetry: Set enable_telemetry = false in restricted-network environments
  • Moved blocks: Use moved {} when renaming resources to prevent destroy/recreate
  • Budget: 3 forecast thresholds (80%/100%/120%); amount and emails MUST be variables

Gotchas

  • Set-type phantom diffsazurerm_application_gateway, azurerm_lb, azurerm_network_security_group, azurerm_firewall, azurerm_frontdoor: adding ONE element causes ALL elements to show ~ changes. Mitigation: ignore_changes on set-type blocks.
  • Provider pin ~> 4.0 is critical>= 3.0 crosses breaking versions; = 4.1.0 blocks patches. MUST use ~> 4.0.
  • for_each over count for named resourcescount causes drift when items are inserted/removed (Terraform reindexes). Use for_each = toset().
  • moved block required for renaming — Renaming a resource ID without a moved {} block causes destroy + recreate.
  • azurerm 4.x renamed attributesallow_blob_public_accessallow_nested_items_to_be_public; enable_https_traffic_onlyhttps_traffic_only_enabled; azurerm_app_service removed → use azurerm_linux_web_app.

Reference Index

FileContents
references/hub-spoke-pattern.mdFull hub & spoke VNet + peering HCL
references/private-endpoint-pattern.mdPE + DNS zone + VNet link HCL, subresource table
references/common-patterns.mdDiagnostics, conditional deployment, module composition, identity
references/budget-pattern.mdConsumption budget, forecast alerts, anomaly detection
references/plan-interpretation.mdPlan commands, change symbols, red flags, summary script
references/avm-pitfalls.mdSet-type diffs, provider pins, tag ignore, moved blocks, 4.x
references/tf-best-practices-examples.mdBest-practice code examples, formatting, code review checklist
references/bootstrap-backend-template.mdBackend bootstrap template
references/deploy-script-template.mdDeployment script template
references/project-scaffold.mdProject scaffolding structure
references/avm-authoring-requirements.mdAVM certification: 37 requirements, compliance checklist
references/refactor-module.mdModule extraction, state migration, refactoring patterns
Repository
jonathan-vella/azure-agentic-infraops
Last updated
Created

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.