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/Support988988
Telemetry434222
Naming/Composition2417817127
CodeStyle222292929
Inputs/Outputs141110865
Testing14131310109
Documentation555444
Release/Publishing555444
Summary776455837568

What changed recently?

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

#IDLast Modified (UTC)Git HistoryLast Commit
1BCPRMNFR12025-11-20 03:40:40All Commits631e4ef
2BCPRMNFR22025-11-20 03:40:40All Commits631e4ef
3BCPFR12025-11-20 03:40:40All Commits631e4ef
4BCPFR42025-11-20 03:40:40All Commits631e4ef
5BCPNFR12025-11-20 03:40:40All Commits631e4ef
6BCPNFR102025-11-20 03:40:40All Commits631e4ef
7BCPNFR112025-11-20 03:40:40All Commits631e4ef
8BCPNFR122025-11-20 03:40:40All Commits631e4ef
9BCPNFR132025-11-20 03:40:40All Commits631e4ef
10BCPNFR152025-11-20 03:40:40All Commits631e4ef
11BCPNFR162025-11-20 03:40:40All Commits631e4ef
12BCPNFR172025-11-20 03:40:40All Commits631e4ef
13BCPNFR182025-11-20 03:40:40All Commits631e4ef
14BCPNFR192025-11-20 03:40:40All Commits631e4ef
15BCPNFR22025-11-20 03:40:40All Commits631e4ef
16BCPNFR202025-11-20 03:40:40All Commits631e4ef
17BCPNFR212025-11-20 03:40:40All Commits631e4ef
18BCPNFR32025-11-20 03:40:40All Commits631e4ef
19BCPNFR42025-11-20 03:40:40All Commits631e4ef
20BCPNFR72025-11-20 03:40:40All Commits631e4ef
21BCPNFR82025-11-20 03:40:40All Commits631e4ef
22BCPNFR92025-11-20 03:40:40All Commits631e4ef
23SFR12025-11-20 03:40:40All Commits631e4ef
24SFR22025-11-20 03:40:40All Commits631e4ef
25SNFR12025-11-20 03:40:40All Commits631e4ef
26SNFR102025-11-20 03:40:40All Commits631e4ef
27SNFR112025-11-20 03:40:40All Commits631e4ef
28SNFR122025-11-20 03:40:40All Commits631e4ef
29SNFR142025-11-20 03:40:40All Commits631e4ef
30SNFR152025-11-20 03:40:40All Commits631e4ef
31SNFR162025-11-20 03:40:40All Commits631e4ef
32SNFR182025-11-20 03:40:40All Commits631e4ef
33SNFR192025-11-20 03:40:40All Commits631e4ef
34SNFR22025-11-20 03:40:40All Commits631e4ef
35SNFR202025-11-20 03:40:40All Commits631e4ef
36SNFR212025-11-20 03:40:40All Commits631e4ef
37SNFR222025-11-20 03:40:40All Commits631e4ef
38SNFR232025-11-20 03:40:40All Commits631e4ef
39SNFR252025-11-20 03:40:40All Commits631e4ef
40SNFR262025-11-20 03:40:40All Commits631e4ef
41SNFR32025-11-20 03:40:40All Commits631e4ef
42SNFR42025-11-20 03:40:40All Commits631e4ef
43SNFR52025-11-20 03:40:40All Commits631e4ef
44SNFR62025-11-20 03:40:40All Commits631e4ef
45SNFR72025-11-20 03:40:40All Commits631e4ef
46SNFR82025-11-20 03:40:40All Commits631e4ef
47SNFR92025-11-20 03:40:40All Commits631e4ef
48TFFR12025-11-20 03:40:40All Commits631e4ef
49TFFR22025-11-20 03:40:40All Commits631e4ef
50TFNFR12025-11-20 03:40:40All Commits631e4ef
51TFNFR102025-11-20 03:40:40All Commits631e4ef
52TFNFR112025-11-20 03:40:40All Commits631e4ef
53TFNFR122025-11-20 03:40:40All Commits631e4ef
54TFNFR132025-11-20 03:40:40All Commits631e4ef
55TFNFR142025-11-20 03:40:40All Commits631e4ef
56TFNFR152025-11-20 03:40:40All Commits631e4ef
57TFNFR162025-11-20 03:40:40All Commits631e4ef
58TFNFR172025-11-20 03:40:40All Commits631e4ef
59TFNFR182025-11-20 03:40:40All Commits631e4ef
60TFNFR192025-11-20 03:40:40All Commits631e4ef
61TFNFR22025-11-20 03:40:40All Commits631e4ef
62TFNFR202025-11-20 03:40:40All Commits631e4ef
63TFNFR212025-11-20 03:40:40All Commits631e4ef
64TFNFR222025-11-20 03:40:40All Commits631e4ef
65TFNFR232025-11-20 03:40:40All Commits631e4ef
66TFNFR242025-11-20 03:40:40All Commits631e4ef
67TFNFR252025-11-20 03:40:40All Commits631e4ef
68TFNFR262025-11-20 03:40:40All Commits631e4ef
69TFNFR272025-11-20 03:40:40All Commits631e4ef
70TFNFR292025-11-20 03:40:40All Commits631e4ef
71TFNFR32025-11-20 03:40:40All Commits631e4ef
72TFNFR302025-11-20 03:40:40All Commits631e4ef
73TFNFR312025-11-20 03:40:40All Commits631e4ef
74TFNFR322025-11-20 03:40:40All Commits631e4ef
75TFNFR332025-11-20 03:40:40All Commits631e4ef
76TFNFR342025-11-20 03:40:40All Commits631e4ef
77TFNFR352025-11-20 03:40:40All Commits631e4ef
78TFNFR362025-11-20 03:40:40All Commits631e4ef
79TFNFR372025-11-20 03:40:40All Commits631e4ef
80TFNFR42025-11-20 03:40:40All Commits631e4ef
81TFNFR52025-11-20 03:40:40All Commits631e4ef
82TFNFR62025-11-20 03:40:40All Commits631e4ef
83TFNFR72025-11-20 03:40:40All Commits631e4ef
84TFNFR82025-11-20 03:40:40All Commits631e4ef
85TFNFR92025-11-20 03:40:40All Commits631e4ef
86BCPNFR142025-11-20 01:22:08All Commitsc2bf2cb
87PMNFR12025-11-20 01:22:08All Commitsc2bf2cb
88RMNFR12025-11-20 01:22:08All Commitsc2bf2cb
89SFR32025-11-20 01:22:08All Commitsc2bf2cb
90SFR42025-11-20 01:22:08All Commitsc2bf2cb
91UMNFR12025-11-20 01:22:08All Commitsc2bf2cb

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 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.

Info

All specifications have a 4-9 character long unique ID - a combination of letters and numbers. These letters only carry legacy meaning only leveraged by the AVM core team and are no longer used to group the specifications in any visible way. The ID is used to reference the specification in the code, documentation, and discussions.

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 (end of life) 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.