Bicep vs ARM JSON vs Terraform for Azure infrastructure as code

Verdict: For an Azure-only estate choose Bicep: readable, transpiles to ARM JSON, no author-managed state file. Preview any deployment with az deployment group what-if, which shows the create, modify and delete diff. Terraform only when you need multi-cloud.

CriterionBicepARM JSONTerraform
StateNone; Azure stores all stateNone; Azure stores all stateAuthor-managed remote state file
LanguageAzure-native DSL, transpiles to ARM JSON at deployVerbose JSON with bracket function syntaxHCL, multi-cloud via providers
ModulesPublishable to a Bicep registry backed by an ACRNested (inline) and linked (URI) templatesProvider and registry modules
Change previewaz deployment group what-if shows the create/modify/delete diffSame what-if applies to ARM deploymentsterraform plan
Choose whenAzure-only estate wanting readable IaC without state filesDeployment scripts; per-resource apiVersion pinningMulti-cloud across AWS, GCP and Azure

Rules

Traps