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
Telemetry440330
Naming/Composition2216117121
CodeStyle22029290
Inputs/Outputs14110750
Testing13120990
Documentation550440
Release/Publishing441441
Summary7362282742

What changed recently?

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

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

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.