Module Specifications

This section documents all the specifications for Azure Verified Modules (AVM) and their respective IaC languages.

Specifications by IaC Language

CategoryBicepTerraform
ResourcePatternUtilityResourcePatternUtility
Contribution/Support980980
Telemetry540330
Naming/Composition2216117121
CodeStyle22029290
Inputs/Outputs14110750
Testing13120990
Documentation550440
Release/Publishing441441
Summary7462282742

What changed recently?

See what specifications changed in the last 30 days...

#IDLast Modified (UTC)Git HistoryLast Commit
1BCPFR72025-02-21 16:21:01All Commitsd24befb
2SFR42025-02-21 16:21:01All Commitsd24befb
3BCPRMNFR12025-01-30 07:09:12All Commits45e4d91
4BCPRMNFR22025-01-30 07:09:12All Commits45e4d91
5BCPRMNFR32025-01-30 07:09:12All Commits45e4d91
6BCPFR12025-01-30 07:09:12All Commits45e4d91
7BCPFR22025-01-30 07:09:12All Commits45e4d91
8BCPFR42025-01-30 07:09:12All Commits45e4d91
9BCPFR52025-01-30 07:09:12All Commits45e4d91
10BCPFR62025-01-30 07:09:12All Commits45e4d91
11BCPNFR12025-01-30 07:09:12All Commits45e4d91
12BCPNFR102025-01-30 07:09:12All Commits45e4d91
13BCPNFR112025-01-30 07:09:12All Commits45e4d91
14BCPNFR122025-01-30 07:09:12All Commits45e4d91
15BCPNFR132025-01-30 07:09:12All Commits45e4d91
16BCPNFR142025-01-30 07:09:12All Commits45e4d91
17BCPNFR152025-01-30 07:09:12All Commits45e4d91
18BCPNFR162025-01-30 07:09:12All Commits45e4d91
19BCPNFR172025-01-30 07:09:12All Commits45e4d91
20BCPNFR182025-01-30 07:09:12All Commits45e4d91
21BCPNFR192025-01-30 07:09:12All Commits45e4d91
22BCPNFR22025-01-30 07:09:12All Commits45e4d91
23BCPNFR202025-01-30 07:09:12All Commits45e4d91
24BCPNFR212025-01-30 07:09:12All Commits45e4d91
25BCPNFR32025-01-30 07:09:12All Commits45e4d91
26BCPNFR42025-01-30 07:09:12All Commits45e4d91
27BCPNFR52025-01-30 07:09:12All Commits45e4d91
28BCPNFR62025-01-30 07:09:12All Commits45e4d91
29BCPNFR72025-01-30 07:09:12All Commits45e4d91
30BCPNFR82025-01-30 07:09:12All Commits45e4d91
31BCPNFR92025-01-30 07:09:12All Commits45e4d91
32PMFR12025-01-30 07:09:12All Commits45e4d91
33PMNFR12025-01-30 07:09:12All Commits45e4d91
34PMNFR22025-01-30 07:09:12All Commits45e4d91
35PMNFR32025-01-30 07:09:12All Commits45e4d91
36PMNFR42025-01-30 07:09:12All Commits45e4d91
37PMNFR52025-01-30 07:09:12All Commits45e4d91
38RMFR12025-01-30 07:09:12All Commits45e4d91
39RMFR22025-01-30 07:09:12All Commits45e4d91
40RMFR32025-01-30 07:09:12All Commits45e4d91
41RMFR42025-01-30 07:09:12All Commits45e4d91
42RMFR52025-01-30 07:09:12All Commits45e4d91
43RMFR62025-01-30 07:09:12All Commits45e4d91
44RMFR72025-01-30 07:09:12All Commits45e4d91
45RMFR82025-01-30 07:09:12All Commits45e4d91
46RMFR92025-01-30 07:09:12All Commits45e4d91
47RMNFR12025-01-30 07:09:12All Commits45e4d91
48RMNFR22025-01-30 07:09:12All Commits45e4d91
49RMNFR32025-01-30 07:09:12All Commits45e4d91
50SFR12025-01-30 07:09:12All Commits45e4d91
51SFR22025-01-30 07:09:12All Commits45e4d91
52SFR32025-01-30 07:09:12All Commits45e4d91
53SFR52025-01-30 07:09:12All Commits45e4d91
54SFR62025-01-30 07:09:12All Commits45e4d91
55SNFR12025-01-30 07:09:12All Commits45e4d91
56SNFR102025-01-30 07:09:12All Commits45e4d91
57SNFR112025-01-30 07:09:12All Commits45e4d91
58SNFR122025-01-30 07:09:12All Commits45e4d91
59SNFR142025-01-30 07:09:12All Commits45e4d91
60SNFR152025-01-30 07:09:12All Commits45e4d91
61SNFR162025-01-30 07:09:12All Commits45e4d91
62SNFR172025-01-30 07:09:12All Commits45e4d91
63SNFR182025-01-30 07:09:12All Commits45e4d91
64SNFR192025-01-30 07:09:12All Commits45e4d91
65SNFR22025-01-30 07:09:12All Commits45e4d91
66SNFR202025-01-30 07:09:12All Commits45e4d91
67SNFR212025-01-30 07:09:12All Commits45e4d91
68SNFR222025-01-30 07:09:12All Commits45e4d91
69SNFR232025-01-30 07:09:12All Commits45e4d91
70SNFR242025-01-30 07:09:12All Commits45e4d91
71SNFR252025-01-30 07:09:12All Commits45e4d91
72SNFR32025-01-30 07:09:12All Commits45e4d91
73SNFR42025-01-30 07:09:12All Commits45e4d91
74SNFR52025-01-30 07:09:12All Commits45e4d91
75SNFR62025-01-30 07:09:12All Commits45e4d91
76SNFR72025-01-30 07:09:12All Commits45e4d91
77SNFR82025-01-30 07:09:12All Commits45e4d91
78SNFR92025-01-30 07:09:12All Commits45e4d91
79TFFR12025-01-30 07:09:12All Commits45e4d91
80TFFR22025-01-30 07:09:12All Commits45e4d91
81TFFR32025-01-30 07:09:12All Commits45e4d91
82TFNFR12025-01-30 07:09:12All Commits45e4d91
83TFNFR102025-01-30 07:09:12All Commits45e4d91
84TFNFR112025-01-30 07:09:12All Commits45e4d91
85TFNFR122025-01-30 07:09:12All Commits45e4d91
86TFNFR132025-01-30 07:09:12All Commits45e4d91
87TFNFR142025-01-30 07:09:12All Commits45e4d91
88TFNFR152025-01-30 07:09:12All Commits45e4d91
89TFNFR162025-01-30 07:09:12All Commits45e4d91
90TFNFR172025-01-30 07:09:12All Commits45e4d91
91TFNFR182025-01-30 07:09:12All Commits45e4d91
92TFNFR192025-01-30 07:09:12All Commits45e4d91
93TFNFR22025-01-30 07:09:12All Commits45e4d91
94TFNFR202025-01-30 07:09:12All Commits45e4d91
95TFNFR212025-01-30 07:09:12All Commits45e4d91
96TFNFR222025-01-30 07:09:12All Commits45e4d91
97TFNFR232025-01-30 07:09:12All Commits45e4d91
98TFNFR242025-01-30 07:09:12All Commits45e4d91
99TFNFR252025-01-30 07:09:12All Commits45e4d91
100TFNFR262025-01-30 07:09:12All Commits45e4d91
101TFNFR272025-01-30 07:09:12All Commits45e4d91
102TFNFR292025-01-30 07:09:12All Commits45e4d91
103TFNFR32025-01-30 07:09:12All Commits45e4d91
104TFNFR302025-01-30 07:09:12All Commits45e4d91
105TFNFR312025-01-30 07:09:12All Commits45e4d91
106TFNFR322025-01-30 07:09:12All Commits45e4d91
107TFNFR332025-01-30 07:09:12All Commits45e4d91
108TFNFR342025-01-30 07:09:12All Commits45e4d91
109TFNFR352025-01-30 07:09:12All Commits45e4d91
110TFNFR362025-01-30 07:09:12All Commits45e4d91
111TFNFR372025-01-30 07:09:12All Commits45e4d91
112TFNFR42025-01-30 07:09:12All Commits45e4d91
113TFNFR52025-01-30 07:09:12All Commits45e4d91
114TFNFR62025-01-30 07:09:12All Commits45e4d91
115TFNFR72025-01-30 07:09:12All Commits45e4d91
116TFNFR82025-01-30 07:09:12All Commits45e4d91
117TFNFR92025-01-30 07:09:12All Commits45e4d91

How to navigate the specifications?

The “Module Specifications” section uses tags to dynamically render content based on the selected attributes, such as the IaC language, module classification, category, severity and more. The tags are defined in hidden header of each specification page.

To make it easier for module owners and contributors to navigate the documentation, the specifications are grouped to distinct pages by the IaC language (Bicep | Terraform) and module classification ( resource | pattern | utility). The specifications on each page are further ordered by the category (e.g., Composition, CodeStyle, Testing, etc.), severity of the requirements (MUST | SHOULD | MAY) and at what stage of the module’s lifecycle the specification is typically applicable (Initial | BAU | EOL).

To find what you need, simply decide which IaC language you’d like develop in, and what classification your module falls under. Then, navigate to the respective page to find the specifications that are relevant to you.

Specification Tags

The following tags are used to qualify the specifications:

KeyAllowed ValuesMultiple/Single
LanguageBicep, TerraformMultiple
ClassResource, Pattern, UtilityMultiple
TypeFunctional, NonFunctionalSingle
CategoryTesting, Telemetry, Contribution/Support, Documentation, CodeStyle, Naming/Composition, Inputs/Outputs, Release/PublishingSingle
SeverityMUST, SHOULD, MAYSingle
PersonaOwner, ContributorMultiple
LifecycleInitial, BAU, EOLSingle
ValidationBicep: BCP/Manual, BCP/CI/Informational, BCP/CI/Enforced
Terraform: TF/Manual, TF/CI/Informational, TF/CI/Enforced
Single per language

Each tag is a concatenation of exactly one of the keys and one of the values, e.g., Language-Bicep, Class-Resource, Type-Functional, etc. When it’s marked as Multiple, it means that the tag can have multiple values, e.g., Language-Bicep, Language-Terraform, or Persona-Owner, Persona-Contributor, etc. When it’s marked as Single, it means that the tag can have only one value, e.g., Type-Functional, Lifecycle-Initial, etc.

➕ Click here to see the definition of the Severity, Persona, Lifecycle and Validation tags...

Severity

What’s the severity or importance of this specification? See “How to read the specifications?” section for more details.

Persona

Who is this specification for? The Owner is the module owner, while the Contributor is anyone who contributes to the module.

Lifecycle

When is this specification mostly relevant?

  • The Initial stage is when the module is being developed first - e.g., naming related specs are labeled with Lifecycle-Initial as the naming of the module only happens once: at the beginning of their life.
  • The BAU (business as usual) stage is at any time during the module’s typical lifecycle - e.g., specs that describe coding standards are relevant throughout the module’s life, for any time a new module version is released.
  • The EOL stage is when the module is being decommissioned - e.g., specs describing how a module should be retired are labeled with Lifecycle-EOL.

Validation

How is this specification checked/validated/enforced?

  • Manual means that the specification is manually enforced at the time of the module review (at the time of the first or any subsequent module version release).
  • CI/Informational means that the module is checked against the specification by a CI pipeline, but the failure is only informational and doesn’t block the module release.
  • CI/Enforced means that the specification is automatically enforced by a CI pipeline, and the failure blocks the module release.

Note: the BCP/ or TF/ prefix is required as shared (language-agnostic) specifications may have different level of validation/enforcement per each language - e.g., it is possible that a specification is enforced by a CI pipeline for Bicep modules, while it is manually enforced for Terraform modules.

Why are there language specific specifications?

While every effort is being made to standardize requirements and implementation details across all languages (and most specifications in fact, are applicable to all), it is expected that some of the specifications will be different between their respective languages to ensure we follow the best practices and leverage features of each language.

How to read the specifications?

Important

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

As you’re developing/maintaining a module as a module owner or contributor, you need to ensure that your module adheres to the specifications outlined in this section. The specifications are designed to ensure that all AVM modules are consistent, secure, and compliant with best practices.

There are 3 levels of specifications:

  • MUST: These are mandatory requirements that MUST be followed.
  • SHOULD: These are recommended requirements that SHOULD be followed, unless there are good reasons for not to.
  • MAY: These are optional requirements that MAY be followed at the module owner’s/contributor’s discretion.