Azure Verified Modules
Glossary GitHub GitHub Issues Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Last updated: 02 Dec 2024

Module Specifications

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

Specifications by IaC Language

What changed recently?

See what specifications changed in the last 30 days...
#IDLast Modified (UTC)Git HistoryLast Commit
1SFR32024-12-17 13:52:50All Commitsdb773f6
2TFNFR12024-12-12 14:11:49All Commits0125ead
3BCPFR12024-12-11 21:44:49All Commits995634f
4BCPNFR32024-12-11 21:44:49All Commits995634f
5BCPNFR142024-12-03 18:16:34All Commitsd778c7e
6SNFR172024-12-03 18:16:34All Commitsd778c7e
7BCPRMNFR12024-12-03 04:43:13All Commitsf68d135
8BCPFR22024-12-03 04:43:13All Commitsf68d135
9BCPFR42024-12-03 04:43:13All Commitsf68d135
10BCPFR52024-12-03 04:43:13All Commitsf68d135
11BCPNFR12024-12-03 04:43:13All Commitsf68d135
12BCPNFR102024-12-03 04:43:13All Commitsf68d135
13BCPNFR112024-12-03 04:43:13All Commitsf68d135
14BCPNFR122024-12-03 04:43:13All Commitsf68d135
15BCPNFR132024-12-03 04:43:13All Commitsf68d135
16BCPNFR152024-12-03 04:43:13All Commitsf68d135
17BCPNFR162024-12-03 04:43:13All Commitsf68d135
18BCPNFR172024-12-03 04:43:13All Commitsf68d135
19BCPNFR22024-12-03 04:43:13All Commitsf68d135
20BCPNFR42024-12-03 04:43:13All Commitsf68d135
21BCPNFR52024-12-03 04:43:13All Commitsf68d135
22BCPNFR62024-12-03 04:43:13All Commitsf68d135
23BCPNFR72024-12-03 04:43:13All Commitsf68d135
24BCPNFR82024-12-03 04:43:13All Commitsf68d135
25PMFR12024-12-03 04:43:13All Commitsf68d135
26PMNFR12024-12-03 04:43:13All Commitsf68d135
27PMNFR22024-12-03 04:43:13All Commitsf68d135
28PMNFR32024-12-03 04:43:13All Commitsf68d135
29PMNFR42024-12-03 04:43:13All Commitsf68d135
30PMNFR52024-12-03 04:43:13All Commitsf68d135
31RMFR12024-12-03 04:43:13All Commitsf68d135
32RMFR22024-12-03 04:43:13All Commitsf68d135
33RMFR32024-12-03 04:43:13All Commitsf68d135
34RMFR42024-12-03 04:43:13All Commitsf68d135
35RMFR52024-12-03 04:43:13All Commitsf68d135
36RMFR62024-12-03 04:43:13All Commitsf68d135
37RMFR72024-12-03 04:43:13All Commitsf68d135
38RMFR82024-12-03 04:43:13All Commitsf68d135
39RMFR92024-12-03 04:43:13All Commitsf68d135
40RMNFR12024-12-03 04:43:13All Commitsf68d135
41RMNFR22024-12-03 04:43:13All Commitsf68d135
42RMNFR32024-12-03 04:43:13All Commitsf68d135
43SFR12024-12-03 04:43:13All Commitsf68d135
44SFR22024-12-03 04:43:13All Commitsf68d135
45SFR42024-12-03 04:43:13All Commitsf68d135
46SFR52024-12-03 04:43:13All Commitsf68d135
47SFR62024-12-03 04:43:13All Commitsf68d135
48SNFR12024-12-03 04:43:13All Commitsf68d135
49SNFR102024-12-03 04:43:13All Commitsf68d135
50SNFR112024-12-03 04:43:13All Commitsf68d135
51SNFR122024-12-03 04:43:13All Commitsf68d135
52SNFR142024-12-03 04:43:13All Commitsf68d135
53SNFR152024-12-03 04:43:13All Commitsf68d135
54SNFR162024-12-03 04:43:13All Commitsf68d135
55SNFR182024-12-03 04:43:13All Commitsf68d135
56SNFR192024-12-03 04:43:13All Commitsf68d135
57SNFR22024-12-03 04:43:13All Commitsf68d135
58SNFR202024-12-03 04:43:13All Commitsf68d135
59SNFR212024-12-03 04:43:13All Commitsf68d135
60SNFR222024-12-03 04:43:13All Commitsf68d135
61SNFR232024-12-03 04:43:13All Commitsf68d135
62SNFR242024-12-03 04:43:13All Commitsf68d135
63SNFR252024-12-03 04:43:13All Commitsf68d135
64SNFR32024-12-03 04:43:13All Commitsf68d135
65SNFR42024-12-03 04:43:13All Commitsf68d135
66SNFR52024-12-03 04:43:13All Commitsf68d135
67SNFR62024-12-03 04:43:13All Commitsf68d135
68SNFR72024-12-03 04:43:13All Commitsf68d135
69SNFR82024-12-03 04:43:13All Commitsf68d135
70SNFR92024-12-03 04:43:13All Commitsf68d135
71TFFR12024-12-03 04:43:13All Commitsf68d135
72TFFR22024-12-03 04:43:13All Commitsf68d135
73TFNFR102024-12-03 04:43:13All Commitsf68d135
74TFNFR112024-12-03 04:43:13All Commitsf68d135
75TFNFR122024-12-03 04:43:13All Commitsf68d135
76TFNFR132024-12-03 04:43:13All Commitsf68d135
77TFNFR142024-12-03 04:43:13All Commitsf68d135
78TFNFR152024-12-03 04:43:13All Commitsf68d135
79TFNFR162024-12-03 04:43:13All Commitsf68d135
80TFNFR172024-12-03 04:43:13All Commitsf68d135
81TFNFR182024-12-03 04:43:13All Commitsf68d135
82TFNFR192024-12-03 04:43:13All Commitsf68d135
83TFNFR22024-12-03 04:43:13All Commitsf68d135
84TFNFR202024-12-03 04:43:13All Commitsf68d135
85TFNFR212024-12-03 04:43:13All Commitsf68d135
86TFNFR222024-12-03 04:43:13All Commitsf68d135
87TFNFR232024-12-03 04:43:13All Commitsf68d135
88TFNFR242024-12-03 04:43:13All Commitsf68d135
89TFNFR252024-12-03 04:43:13All Commitsf68d135
90TFNFR262024-12-03 04:43:13All Commitsf68d135
91TFNFR272024-12-03 04:43:13All Commitsf68d135
92TFNFR292024-12-03 04:43:13All Commitsf68d135
93TFNFR32024-12-03 04:43:13All Commitsf68d135
94TFNFR302024-12-03 04:43:13All Commitsf68d135
95TFNFR312024-12-03 04:43:13All Commitsf68d135
96TFNFR322024-12-03 04:43:13All Commitsf68d135
97TFNFR332024-12-03 04:43:13All Commitsf68d135
98TFNFR342024-12-03 04:43:13All Commitsf68d135
99TFNFR352024-12-03 04:43:13All Commitsf68d135
100TFNFR362024-12-03 04:43:13All Commitsf68d135
101TFNFR372024-12-03 04:43:13All Commitsf68d135
102TFNFR42024-12-03 04:43:13All Commitsf68d135
103TFNFR52024-12-03 04:43:13All Commitsf68d135
104TFNFR62024-12-03 04:43:13All Commitsf68d135
105TFNFR72024-12-03 04:43:13All Commitsf68d135
106TFNFR82024-12-03 04:43:13All Commitsf68d135
107TFNFR92024-12-03 04:43:13All Commitsf68d135

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?

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.