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/Composition2518920149
CodeStyle222313131
Inputs/Outputs141110141110
Testing14131310109
Documentation555444
Release/Publishing555444
Summary786556948477

What changed recently?

See what specifications changed in the last 12 months...

#IDLast Modified (UTC)Git HistoryLast Commit
1TFFR82026-10-30 11:51:27All Commits8224eb1
2TFNFR252026-10-30 11:51:27All Commits8224eb1
3SFR32026-10-29 15:42:05All Commitsf76baaa
4SFR42026-10-29 15:42:05All Commitsf76baaa
5SNFR232026-09-30 20:15:32All Commits2bbadf2
6BCPFR42026-09-25 18:57:35All Commitsa5e9908
7RMNFR12026-09-24 12:11:47All Commits3d5ead4
8BCPNFR152026-09-23 14:49:31All Commitsed4a240
9SNFR202026-09-23 14:49:31All Commitsed4a240
10PMNFR12026-09-22 00:30:23All Commitse8d8c4d
11SNFR82026-09-22 00:30:23All Commitse8d8c4d
12UMNFR12026-09-22 00:30:23All Commitse8d8c4d
13TFFR92026-09-04 07:52:46All Commits911dd77
14RMFR72026-09-01 19:58:44All Commits917cf78
15TFFR12026-09-01 19:58:44All Commits917cf78
16TFFR22026-09-01 19:58:44All Commits917cf78
17TFFR32026-09-01 19:58:44All Commits917cf78
18TFFR42026-09-01 19:58:44All Commits917cf78
19TFFR52026-09-01 19:58:44All Commits917cf78
20TFFR62026-09-01 19:58:44All Commits917cf78
21TFFR72026-09-01 19:58:44All Commits917cf78
22TFNFR102026-09-01 19:58:44All Commits917cf78
23TFNFR232026-09-01 19:58:44All Commits917cf78
24TFNFR272026-09-01 19:58:44All Commits917cf78
25TFNFR392026-09-01 19:58:44All Commits917cf78
26TFNFR402026-09-01 19:58:44All Commits917cf78
27SNFR32026-09-01 19:06:42All Commits20d0864
28SNFR92026-09-01 19:06:42All Commits20d0864
29TFRMNFR12026-08-20 20:03:16All Commitsbd641f6
30TFNFR152026-08-20 20:03:16All Commitsbd641f6
31TFNFR202026-08-20 20:03:16All Commitsbd641f6
32TFNFR212026-08-20 20:03:16All Commitsbd641f6
33TFNFR262026-08-20 20:03:16All Commitsbd641f6
34TFNFR412026-08-20 20:03:16All Commitsbd641f6
35TFNFR82026-08-20 20:03:16All Commitsbd641f6
36TFNFR362026-08-20 19:45:20All Commits6f87e8e
37BCPRMNFR42026-08-19 12:02:54All Commits5bd25d8
38BCPNFR222026-08-19 12:02:54All Commits5bd25d8
39TFNFR72026-08-19 12:02:54All Commits5bd25d8
40TFNFR52026-08-10 16:48:22All Commits43fb148
41TFRMFR12026-06-01 20:01:29All Commits448be6e
42TFRMNFR22026-06-01 20:01:29All Commits448be6e
43RMFR32026-05-26 15:12:56All Commitsb7412ee
44SNFR122026-05-26 15:12:56All Commitsb7412ee
45SNFR22026-05-26 15:12:56All Commitsb7412ee
46SNFR262026-05-26 15:12:56All Commitsb7412ee
47TFNFR112026-05-26 15:12:56All Commitsb7412ee
48TFNFR122026-05-26 15:12:56All Commitsb7412ee
49TFNFR172026-05-26 15:12:56All Commitsb7412ee
50TFNFR182026-05-26 15:12:56All Commitsb7412ee
51TFNFR292026-05-26 15:12:56All Commitsb7412ee
52TFNFR342026-05-26 15:12:56All Commitsb7412ee
53TFNFR382026-05-26 15:12:56All Commitsb7412ee
54BCPFR62026-03-20 11:06:37All Commits2f883f7
55BCPFR72026-03-20 11:06:37All Commits2f883f7
56BCPNFR242026-03-20 11:06:37All Commits2f883f7
57SNFR222026-03-03 17:52:56All Commitsbfd2e82
58BCPRMNFR12025-11-20 03:40:40All Commits631e4ef
59BCPRMNFR22025-11-20 03:40:40All Commits631e4ef
60BCPFR12025-11-20 03:40:40All Commits631e4ef
61BCPNFR12025-11-20 03:40:40All Commits631e4ef
62BCPNFR102025-11-20 03:40:40All Commits631e4ef
63BCPNFR112025-11-20 03:40:40All Commits631e4ef
64BCPNFR122025-11-20 03:40:40All Commits631e4ef
65BCPNFR132025-11-20 03:40:40All Commits631e4ef
66BCPNFR162025-11-20 03:40:40All Commits631e4ef
67BCPNFR172025-11-20 03:40:40All Commits631e4ef
68BCPNFR182025-11-20 03:40:40All Commits631e4ef
69BCPNFR192025-11-20 03:40:40All Commits631e4ef
70BCPNFR22025-11-20 03:40:40All Commits631e4ef
71BCPNFR202025-11-20 03:40:40All Commits631e4ef
72BCPNFR212025-11-20 03:40:40All Commits631e4ef
73BCPNFR32025-11-20 03:40:40All Commits631e4ef
74BCPNFR42025-11-20 03:40:40All Commits631e4ef
75BCPNFR72025-11-20 03:40:40All Commits631e4ef
76BCPNFR82025-11-20 03:40:40All Commits631e4ef
77BCPNFR92025-11-20 03:40:40All Commits631e4ef
78SFR12025-11-20 03:40:40All Commits631e4ef
79SFR22025-11-20 03:40:40All Commits631e4ef
80SNFR12025-11-20 03:40:40All Commits631e4ef
81SNFR102025-11-20 03:40:40All Commits631e4ef
82SNFR112025-11-20 03:40:40All Commits631e4ef
83SNFR142025-11-20 03:40:40All Commits631e4ef
84SNFR152025-11-20 03:40:40All Commits631e4ef
85SNFR162025-11-20 03:40:40All Commits631e4ef
86SNFR182025-11-20 03:40:40All Commits631e4ef
87SNFR192025-11-20 03:40:40All Commits631e4ef
88SNFR212025-11-20 03:40:40All Commits631e4ef
89SNFR252025-11-20 03:40:40All Commits631e4ef
90SNFR42025-11-20 03:40:40All Commits631e4ef
91SNFR52025-11-20 03:40:40All Commits631e4ef
92SNFR62025-11-20 03:40:40All Commits631e4ef
93SNFR72025-11-20 03:40:40All Commits631e4ef
94TFNFR12025-11-20 03:40:40All Commits631e4ef
95TFNFR132025-11-20 03:40:40All Commits631e4ef
96TFNFR142025-11-20 03:40:40All Commits631e4ef
97TFNFR162025-11-20 03:40:40All Commits631e4ef
98TFNFR192025-11-20 03:40:40All Commits631e4ef
99TFNFR22025-11-20 03:40:40All Commits631e4ef
100TFNFR222025-11-20 03:40:40All Commits631e4ef
101TFNFR242025-11-20 03:40:40All Commits631e4ef
102TFNFR32025-11-20 03:40:40All Commits631e4ef
103TFNFR302025-11-20 03:40:40All Commits631e4ef
104TFNFR312025-11-20 03:40:40All Commits631e4ef
105TFNFR332025-11-20 03:40:40All Commits631e4ef
106TFNFR352025-11-20 03:40:40All Commits631e4ef
107TFNFR372025-11-20 03:40:40All Commits631e4ef
108TFNFR42025-11-20 03:40:40All Commits631e4ef
109TFNFR62025-11-20 03:40:40All Commits631e4ef
110TFNFR92025-11-20 03:40:40All Commits631e4ef
111BCPNFR142025-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.