[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-hashicorp-azure-verified-modules":3,"mdc-t7h8by-key":37,"related-repo-hashicorp-azure-verified-modules":4175,"related-org-hashicorp-azure-verified-modules":4261},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"azure-verified-modules","develop certified Azure Verified Modules","Azure Verified Modules (AVM) requirements and best practices for developing certified Azure Terraform modules. Use when creating or reviewing Azure modules that need AVM certification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"hashicorp","HashiCorp","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fhashicorp.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Azure","azure","tag",{"name":17,"slug":18,"type":15},"Compliance","compliance",{"name":20,"slug":21,"type":15},"Terraform","terraform",{"name":23,"slug":24,"type":15},"Infrastructure as Code","infrastructure-as-code",728,"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fagent-skills","2026-04-06T18:25:16.88768",null,104,[31],"doormat-managed",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"A collection of Agent skills and Claude Code plugins for HashiCorp products.","https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fterraform\u002Fcode-generation\u002Fskills\u002Fazure-verified-modules","---\nname: azure-verified-modules\ndescription: Azure Verified Modules (AVM) requirements and best practices for developing certified Azure Terraform modules. Use when creating or reviewing Azure modules that need AVM certification.\n---\n\n# Azure Verified Modules (AVM) Requirements\n\nThis guide covers the mandatory requirements for Azure Verified Modules certification. These requirements ensure consistency, quality, and maintainability across Azure Terraform modules.\n\n**References:**\n- [Azure Verified Modules](https:\u002F\u002Fazure.github.io\u002FAzure-Verified-Modules\u002F)\n- [AVM Terraform Requirements](https:\u002F\u002Fazure.github.io\u002FAzure-Verified-Modules\u002Fspecs\u002Fterraform\u002F)\n\n## Table of Contents\n\n- [Module Cross-Referencing](#module-cross-referencing)\n- [Azure Provider Requirements](#azure-provider-requirements)\n- [Code Style Standards](#code-style-standards)\n- [Variable Requirements](#variable-requirements)\n- [Output Requirements](#output-requirements)\n- [Local Values Standards](#local-values-standards)\n- [Terraform Configuration Requirements](#terraform-configuration-requirements)\n- [Testing Requirements](#testing-requirements)\n- [Documentation Requirements](#documentation-requirements)\n- [Breaking Changes & Feature Management](#breaking-changes--feature-management)\n- [Contribution Standards](#contribution-standards)\n- [Compliance Checklist](#compliance-checklist)\n\n---\n\n## Module Cross-Referencing\n\n**Severity:** MUST | **Requirement:** TFFR1\n\nWhen building Resource or Pattern modules, module owners **MAY** cross-reference other modules. However:\n\n- Modules **MUST** be referenced using HashiCorp Terraform registry reference to a pinned version\n  - Example: `source = \"Azure\u002Fxxx\u002Fazurerm\"` with `version = \"1.2.3\"`\n- Modules **MUST NOT** use git references (e.g., `git::https:\u002F\u002Fxxx.yyy\u002Fxxx.git` or `github.com\u002Fxxx\u002Fyyy`)\n- Modules **MUST NOT** contain references to non-AVM modules\n\n---\n\n## Azure Provider Requirements\n\n**Severity:** MUST | **Requirement:** TFFR3\n\nAuthors **MUST** only use the following Azure providers:\n\n| Provider | Min Version | Max Version |\n|----------|-------------|-------------|\n| azapi    | >= 2.0      | \u003C 3.0       |\n| azurerm  | >= 4.0      | \u003C 5.0       |\n\n**Requirements:**\n\n- Authors **MAY** select either Azurerm, Azapi, or both providers\n- **MUST** use `required_providers` block to enforce provider versions\n- **SHOULD** use pessimistic version constraint operator (`~>`)\n\n**Example:**\n\n```hcl\nterraform {\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp\u002Fazurerm\"\n      version = \"~> 4.0\"\n    }\n    azapi = {\n      source  = \"Azure\u002Fazapi\"\n      version = \"~> 2.0\"\n    }\n  }\n}\n```\n\n---\n\n## Code Style Standards\n\n### Lower snake_casing\n\n**Severity:** MUST | **Requirement:** TFNFR4\n\n**MUST** use lower snake_casing for:\n\n- Locals\n- Variables\n- Outputs\n- Resources (symbolic names)\n- Modules (symbolic names)\n\nExample: `snake_casing_example`\n\n### Resource & Data Source Ordering\n\n**Severity:** SHOULD | **Requirement:** TFNFR6\n\n- Resources that are depended on **SHOULD** come first\n- Resources with dependencies **SHOULD** be defined close to each other\n\n### Count & for_each Usage\n\n**Severity:** MUST | **Requirement:** TFNFR7\n\n- Use `count` for conditional resource creation\n- **MUST** use `map(xxx)` or `set(xxx)` as resource's `for_each` collection\n- The map's key or set's element **MUST** be static literals\n\n**Example:**\n\n```hcl\nresource \"azurerm_subnet\" \"pair\" {\n  for_each             = var.subnet_map  # map(string)\n  name                 = \"${each.value}-pair\"\n  resource_group_name  = azurerm_resource_group.example.name\n  virtual_network_name = azurerm_virtual_network.example.name\n  address_prefixes     = [\"10.0.1.0\u002F24\"]\n}\n```\n\n### Resource & Data Block Internal Ordering\n\n**Severity:** SHOULD | **Requirement:** TFNFR8\n\n**Order within resource\u002Fdata blocks:**\n\n1. **Meta-arguments (top)**:\n   - `provider`\n   - `count`\n   - `for_each`\n\n2. **Arguments\u002Fblocks (middle, alphabetical)**:\n   - Required arguments\n   - Optional arguments\n   - Required nested blocks\n   - Optional nested blocks\n\n3. **Meta-arguments (bottom)**:\n   - `depends_on`\n   - `lifecycle` (with sub-order: `create_before_destroy`, `ignore_changes`, `prevent_destroy`)\n\nSeparate sections with blank lines.\n\n### Module Block Ordering\n\n**Severity:** SHOULD | **Requirement:** TFNFR9\n\n**Order within module blocks:**\n\n1. **Top meta-arguments**:\n   - `source`\n   - `version`\n   - `count`\n   - `for_each`\n\n2. **Arguments (alphabetical)**:\n   - Required arguments\n   - Optional arguments\n\n3. **Bottom meta-arguments**:\n   - `depends_on`\n   - `providers`\n\n### Lifecycle ignore_changes Syntax\n\n**Severity:** MUST | **Requirement:** TFNFR10\n\nThe `ignore_changes` attribute **MUST NOT** be enclosed in double quotes.\n\n**Good:**\n\n```hcl\nlifecycle {\n  ignore_changes = [tags]\n}\n```\n\n**Bad:**\n\n```hcl\nlifecycle {\n  ignore_changes = [\"tags\"]\n}\n```\n\n### Null Comparison for Conditional Creation\n\n**Severity:** SHOULD | **Requirement:** TFNFR11\n\nFor parameters requiring conditional resource creation, wrap with `object` type to avoid \"known after apply\" issues during plan stage.\n\n**Recommended:**\n\n```hcl\nvariable \"security_group\" {\n  type = object({\n    id = string\n  })\n  default = null\n}\n```\n\n### Dynamic Blocks for Optional Nested Objects\n\n**Severity:** MUST | **Requirement:** TFNFR12\n\nNested blocks under conditions **MUST** use this pattern:\n\n```hcl\ndynamic \"identity\" {\n  for_each = \u003Ccondition> ? [\u003Csome_item>] : []\n\n  content {\n    # block content\n  }\n}\n```\n\n### Default Values with coalesce\u002Ftry\n\n**Severity:** SHOULD | **Requirement:** TFNFR13\n\n**Good:**\n\n```hcl\ncoalesce(var.new_network_security_group_name, \"${var.subnet_name}-nsg\")\n```\n\n**Bad:**\n\n```hcl\nvar.new_network_security_group_name == null ? \"${var.subnet_name}-nsg\" : var.new_network_security_group_name\n```\n\n### Provider Declarations in Modules\n\n**Severity:** MUST | **Requirement:** TFNFR27\n\n- `provider` **MUST NOT** be declared in modules (except for `configuration_aliases`)\n- `provider` blocks in modules **MUST** only use `alias`\n- Provider configurations **SHOULD** be passed in by module users\n\n---\n\n## Variable Requirements\n\n### Not Allowed Variables\n\n**Severity:** MUST | **Requirement:** TFNFR14\n\nModule owners **MUST NOT** add variables like `enabled` or `module_depends_on` to control entire module operation. Boolean feature toggles for specific resources are acceptable.\n\n### Variable Definition Order\n\n**Severity:** SHOULD | **Requirement:** TFNFR15\n\nVariables **SHOULD** follow this order:\n\n1. All required fields (alphabetical)\n2. All optional fields (alphabetical)\n\n### Variable Naming Rules\n\n**Severity:** SHOULD | **Requirement:** TFNFR16\n\n- Follow [HashiCorp's naming rules](https:\u002F\u002Fwww.terraform.io\u002Fdocs\u002Fextend\u002Fbest-practices\u002Fnaming.html)\n- Feature switches **SHOULD** use positive statements: `xxx_enabled` instead of `xxx_disabled`\n\n### Variables with Descriptions\n\n**Severity:** SHOULD | **Requirement:** TFNFR17\n\n- `description` **SHOULD** precisely describe the parameter's purpose and expected data type\n- Target audience is module users, not developers\n- For `object` types, use HEREDOC format\n\n### Variables with Types\n\n**Severity:** MUST | **Requirement:** TFNFR18\n\n- `type` **MUST** be defined for every variable\n- `type` **SHOULD** be as precise as possible\n- `any` **MAY** only be used with adequate reasons\n- Use `bool` instead of `string`\u002F`number` for true\u002Ffalse values\n- Use concrete `object` instead of `map(any)`\n\n### Sensitive Data Variables\n\n**Severity:** SHOULD | **Requirement:** TFNFR19\n\nIf a variable's type is `object` and contains sensitive fields, the entire variable **SHOULD** be `sensitive = true`, or extract sensitive fields into separate variables.\n\n### Non-Nullable Defaults for Collections\n\n**Severity:** SHOULD | **Requirement:** TFNFR20\n\nNullable **SHOULD** be set to `false` for collection values (sets, maps, lists) when using them in loops. For scalar values, null may have semantic meaning.\n\n### Discourage Nullability by Default\n\n**Severity:** MUST | **Requirement:** TFNFR21\n\n`nullable = true` **MUST** be avoided unless there's a specific semantic need for null values.\n\n### Avoid sensitive = false\n\n**Severity:** MUST | **Requirement:** TFNFR22\n\n`sensitive = false` **MUST** be avoided (this is the default).\n\n### Sensitive Default Value Conditions\n\n**Severity:** MUST | **Requirement:** TFNFR23\n\nA default value **MUST NOT** be set for sensitive inputs (e.g., default passwords).\n\n### Handling Deprecated Variables\n\n**Severity:** MUST | **Requirement:** TFNFR24\n\n- Move deprecated variables to `deprecated_variables.tf`\n- Annotate with `DEPRECATED` at the beginning of description\n- Declare the replacement's name\n- Clean up during major version releases\n\n---\n\n## Output Requirements\n\n### Additional Terraform Outputs\n\n**Severity:** SHOULD | **Requirement:** TFFR2\n\nAuthors **SHOULD NOT** output entire resource objects as these may contain sensitive data and the schema can change with API or provider versions.\n\n**Best Practices:**\n\n- Output *computed* attributes of resources as discrete outputs (anti-corruption layer pattern)\n- **SHOULD NOT** output values that are already inputs (except `name`)\n- Use `sensitive = true` for sensitive attributes\n- For resources deployed with `for_each`, output computed attributes in a map structure\n\n**Examples:**\n\n```hcl\n# Single resource computed attribute\noutput \"foo\" {\n  description = \"MyResource foo attribute\"\n  value       = azurerm_resource_myresource.foo\n}\n\n# for_each resources\noutput \"childresource_foos\" {\n  description = \"MyResource children's foo attributes\"\n  value = {\n    for key, value in azurerm_resource_mychildresource : key => value.foo\n  }\n}\n\n# Sensitive output\noutput \"bar\" {\n  description = \"MyResource bar attribute\"\n  value       = azurerm_resource_myresource.bar\n  sensitive   = true\n}\n```\n\n### Sensitive Data Outputs\n\n**Severity:** MUST | **Requirement:** TFNFR29\n\nOutputs containing confidential data **MUST** be declared with `sensitive = true`.\n\n### Handling Deprecated Outputs\n\n**Severity:** MUST | **Requirement:** TFNFR30\n\n- Move deprecated outputs to `deprecated_outputs.tf`\n- Define new outputs in `outputs.tf`\n- Clean up during major version releases\n\n---\n\n## Local Values Standards\n\n### locals.tf Organization\n\n**Severity:** MAY | **Requirement:** TFNFR31\n\n- `locals.tf` **SHOULD** only contain `locals` blocks\n- **MAY** declare `locals` blocks next to resources for advanced scenarios\n\n### Alphabetical Local Arrangement\n\n**Severity:** MUST | **Requirement:** TFNFR32\n\nExpressions in `locals` blocks **MUST** be arranged alphabetically.\n\n### Precise Local Types\n\n**Severity:** SHOULD | **Requirement:** TFNFR33\n\nUse precise types (e.g., `number` for age, not `string`).\n\n---\n\n## Terraform Configuration Requirements\n\n### Terraform Version Requirements\n\n**Severity:** MUST | **Requirement:** TFNFR25\n\n**`terraform.tf` requirements:**\n\n- **MUST** contain only one `terraform` block\n- First line **MUST** define `required_version`\n- **MUST** include minimum version constraint\n- **MUST** include maximum major version constraint\n- **SHOULD** use `~> #.#` or `>= #.#.#, \u003C #.#.#` format\n\n**Example:**\n\n```hcl\nterraform {\n  required_version = \"~> 1.6\"\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp\u002Fazurerm\"\n      version = \"~> 4.0\"\n    }\n  }\n}\n```\n\n### Providers in required_providers\n\n**Severity:** MUST | **Requirement:** TFNFR26\n\n- `terraform` block **MUST** contain `required_providers` block\n- Each provider **MUST** specify `source` and `version`\n- Providers **SHOULD** be sorted alphabetically\n- Only include directly required providers\n- `source` **MUST** be in format `namespace\u002Fname`\n- `version` **MUST** include minimum and maximum major version constraints\n- **SHOULD** use `~> #.#` or `>= #.#.#, \u003C #.#.#` format\n\n---\n\n## Testing Requirements\n\n### Test Tooling\n\n**Severity:** MUST | **Requirement:** TFNFR5\n\n**Required testing tools for AVM:**\n\n- Terraform (`terraform validate\u002Ffmt\u002Ftest`)\n- terrafmt\n- Checkov\n- tflint (with azurerm ruleset)\n- Go (optional for custom tests)\n\n### Test Provider Configuration\n\n**Severity:** SHOULD | **Requirement:** TFNFR36\n\nFor robust testing, `prevent_deletion_if_contains_resources` **SHOULD** be explicitly set to `false` in test provider configurations.\n\n---\n\n## Documentation Requirements\n\n### Module Documentation Generation\n\n**Severity:** MUST | **Requirement:** TFNFR2\n\n- Documentation **MUST** be automatically generated via [Terraform Docs](https:\u002F\u002Fgithub.com\u002Fterraform-docs\u002Fterraform-docs)\n- A `.terraform-docs.yml` file **MUST** be present in the module root\n\n---\n\n## Breaking Changes & Feature Management\n\n### Using Feature Toggles\n\n**Severity:** MUST | **Requirement:** TFNFR34\n\nNew resources added in minor\u002Fpatch versions **MUST** have a toggle variable to avoid creation by default:\n\n```hcl\nvariable \"create_route_table\" {\n  type     = bool\n  default  = false\n  nullable = false\n}\n\nresource \"azurerm_route_table\" \"this\" {\n  count = var.create_route_table ? 1 : 0\n  # ...\n}\n```\n\n### Reviewing Potential Breaking Changes\n\n**Severity:** MUST | **Requirement:** TFNFR35\n\n**Breaking changes requiring caution:**\n\n**Resource blocks:**\n\n1. Adding new resource without conditional creation\n2. Adding arguments with non-default values\n3. Adding nested blocks without `dynamic`\n4. Renaming resources without `moved` blocks\n5. Changing `count` to `for_each` or vice versa\n\n**Variable\u002FOutput blocks:**\n\n1. Deleting\u002Frenaming variables\n2. Changing variable `type`\n3. Changing variable `default` values\n4. Changing `nullable` to false\n5. Changing `sensitive` from false to true\n6. Adding variables without `default`\n7. Deleting outputs\n8. Changing output `value`\n9. Changing output `sensitive` value\n\n---\n\n## Contribution Standards\n\n### GitHub Repository Branch Protection\n\n**Severity:** MUST | **Requirement:** TFNFR3\n\nModule owners **MUST** set branch protection policies on the default branch (typically `main`):\n\n1. Require Pull Request before merging\n2. Require approval of most recent reviewable push\n3. Dismiss stale PR approvals when new commits are pushed\n4. Require linear history\n5. Prevent force pushes\n6. Not allow deletions\n7. Require CODEOWNERS review\n8. No bypassing settings allowed\n9. Enforce for administrators\n\n---\n\n## Compliance Checklist\n\nUse this checklist when developing or reviewing Azure Verified Modules:\n\n### Module Structure\n- [ ] Module cross-references use registry sources with pinned versions\n- [ ] Azure providers (azurerm\u002Fazapi) versions meet AVM requirements\n- [ ] `.terraform-docs.yml` present in module root\n- [ ] CODEOWNERS file present\n\n### Code Style\n- [ ] All names use lower snake_casing\n- [ ] Resources ordered with dependencies first\n- [ ] `for_each` uses `map()` or `set()` with static keys\n- [ ] Resource\u002Fdata\u002Fmodule blocks follow proper internal ordering\n- [ ] `ignore_changes` not quoted\n- [ ] Dynamic blocks used for conditional nested objects\n- [ ] `coalesce()` or `try()` used for default values\n\n### Variables\n- [ ] No `enabled` or `module_depends_on` variables\n- [ ] Variables ordered: required (alphabetical) then optional (alphabetical)\n- [ ] All variables have precise types (avoid `any`)\n- [ ] All variables have descriptions\n- [ ] Collections have `nullable = false`\n- [ ] No `sensitive = false` declarations\n- [ ] No default values for sensitive inputs\n- [ ] Deprecated variables moved to `deprecated_variables.tf`\n\n### Outputs\n- [ ] Outputs use anti-corruption layer pattern (discrete attributes)\n- [ ] Sensitive outputs marked `sensitive = true`\n- [ ] Deprecated outputs moved to `deprecated_outputs.tf`\n\n### Terraform Configuration\n- [ ] `terraform.tf` has version constraints (`~>` format)\n- [ ] `required_providers` block present with all providers\n- [ ] No `provider` declarations in module (except aliases)\n- [ ] Locals arranged alphabetically\n\n### Testing & Quality\n- [ ] Required testing tools configured\n- [ ] New resources have feature toggles\n- [ ] Breaking changes reviewed and documented\n\n---\n\n## Summary Statistics\n\n- **Functional Requirements:** 3\n- **Non-Functional Requirements:** 34\n- **Total Requirements:** 37\n\n### By Severity\n- **MUST:** 21 requirements\n- **SHOULD:** 14 requirements\n- **MAY:** 2 requirements\n\n---\n\n*Based on: Azure Verified Modules - Terraform Requirements*\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,57,66,93,100,211,215,220,237,249,324,327,332,346,357,426,434,481,489,609,612,617,624,638,647,675,685,691,706,731,737,751,809,816,878,884,898,906,1034,1039,1045,1059,1067,1165,1171,1185,1203,1211,1241,1249,1278,1284,1298,1311,1319,1373,1379,1393,1404,1466,1472,1486,1493,1507,1514,1528,1534,1548,1607,1610,1615,1621,1635,1661,1667,1681,1692,1705,1711,1725,1765,1771,1785,1821,1827,1841,1935,1941,1955,1981,1987,2001,2020,2026,2040,2056,2062,2076,2092,2098,2112,2123,2129,2143,2180,2183,2188,2194,2208,2219,2227,2282,2290,2459,2465,2479,2497,2503,2517,2546,2549,2554,2560,2575,2618,2624,2638,2656,2662,2676,2695,2698,2703,2709,2723,2737,2814,2821,2892,2898,2912,3032,3035,3040,3046,3060,3068,3103,3109,3123,3148,3151,3156,3162,3176,3216,3219,3224,3230,3244,3255,3339,3345,3359,3367,3375,3430,3438,3529,3532,3537,3543,3557,3575,3623,3626,3631,3636,3642,3692,3698,3806,3811,3923,3928,3969,3975,4040,4046,4077,4080,4086,4119,4125,4158,4161,4169],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"azure-verified-modules-avm-requirements",[48],{"type":49,"value":50},"text","Azure Verified Modules (AVM) Requirements",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"This guide covers the mandatory requirements for Azure Verified Modules certification. These requirements ensure consistency, quality, and maintainability across Azure Terraform modules.",{"type":43,"tag":52,"props":58,"children":59},{},[60],{"type":43,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":49,"value":65},"References:",{"type":43,"tag":67,"props":68,"children":69},"ul",{},[70,83],{"type":43,"tag":71,"props":72,"children":73},"li",{},[74],{"type":43,"tag":75,"props":76,"children":80},"a",{"href":77,"rel":78},"https:\u002F\u002Fazure.github.io\u002FAzure-Verified-Modules\u002F",[79],"nofollow",[81],{"type":49,"value":82},"Azure Verified Modules",{"type":43,"tag":71,"props":84,"children":85},{},[86],{"type":43,"tag":75,"props":87,"children":90},{"href":88,"rel":89},"https:\u002F\u002Fazure.github.io\u002FAzure-Verified-Modules\u002Fspecs\u002Fterraform\u002F",[79],[91],{"type":49,"value":92},"AVM Terraform Requirements",{"type":43,"tag":94,"props":95,"children":97},"h2",{"id":96},"table-of-contents",[98],{"type":49,"value":99},"Table of Contents",{"type":43,"tag":67,"props":101,"children":102},{},[103,112,121,130,139,148,157,166,175,184,193,202],{"type":43,"tag":71,"props":104,"children":105},{},[106],{"type":43,"tag":75,"props":107,"children":109},{"href":108},"#module-cross-referencing",[110],{"type":49,"value":111},"Module Cross-Referencing",{"type":43,"tag":71,"props":113,"children":114},{},[115],{"type":43,"tag":75,"props":116,"children":118},{"href":117},"#azure-provider-requirements",[119],{"type":49,"value":120},"Azure Provider Requirements",{"type":43,"tag":71,"props":122,"children":123},{},[124],{"type":43,"tag":75,"props":125,"children":127},{"href":126},"#code-style-standards",[128],{"type":49,"value":129},"Code Style Standards",{"type":43,"tag":71,"props":131,"children":132},{},[133],{"type":43,"tag":75,"props":134,"children":136},{"href":135},"#variable-requirements",[137],{"type":49,"value":138},"Variable Requirements",{"type":43,"tag":71,"props":140,"children":141},{},[142],{"type":43,"tag":75,"props":143,"children":145},{"href":144},"#output-requirements",[146],{"type":49,"value":147},"Output Requirements",{"type":43,"tag":71,"props":149,"children":150},{},[151],{"type":43,"tag":75,"props":152,"children":154},{"href":153},"#local-values-standards",[155],{"type":49,"value":156},"Local Values Standards",{"type":43,"tag":71,"props":158,"children":159},{},[160],{"type":43,"tag":75,"props":161,"children":163},{"href":162},"#terraform-configuration-requirements",[164],{"type":49,"value":165},"Terraform Configuration Requirements",{"type":43,"tag":71,"props":167,"children":168},{},[169],{"type":43,"tag":75,"props":170,"children":172},{"href":171},"#testing-requirements",[173],{"type":49,"value":174},"Testing Requirements",{"type":43,"tag":71,"props":176,"children":177},{},[178],{"type":43,"tag":75,"props":179,"children":181},{"href":180},"#documentation-requirements",[182],{"type":49,"value":183},"Documentation Requirements",{"type":43,"tag":71,"props":185,"children":186},{},[187],{"type":43,"tag":75,"props":188,"children":190},{"href":189},"#breaking-changes--feature-management",[191],{"type":49,"value":192},"Breaking Changes & Feature Management",{"type":43,"tag":71,"props":194,"children":195},{},[196],{"type":43,"tag":75,"props":197,"children":199},{"href":198},"#contribution-standards",[200],{"type":49,"value":201},"Contribution Standards",{"type":43,"tag":71,"props":203,"children":204},{},[205],{"type":43,"tag":75,"props":206,"children":208},{"href":207},"#compliance-checklist",[209],{"type":49,"value":210},"Compliance Checklist",{"type":43,"tag":212,"props":213,"children":214},"hr",{},[],{"type":43,"tag":94,"props":216,"children":218},{"id":217},"module-cross-referencing",[219],{"type":49,"value":111},{"type":43,"tag":52,"props":221,"children":222},{},[223,228,230,235],{"type":43,"tag":61,"props":224,"children":225},{},[226],{"type":49,"value":227},"Severity:",{"type":49,"value":229}," MUST | ",{"type":43,"tag":61,"props":231,"children":232},{},[233],{"type":49,"value":234},"Requirement:",{"type":49,"value":236}," TFFR1",{"type":43,"tag":52,"props":238,"children":239},{},[240,242,247],{"type":49,"value":241},"When building Resource or Pattern modules, module owners ",{"type":43,"tag":61,"props":243,"children":244},{},[245],{"type":49,"value":246},"MAY",{"type":49,"value":248}," cross-reference other modules. However:",{"type":43,"tag":67,"props":250,"children":251},{},[252,287,314],{"type":43,"tag":71,"props":253,"children":254},{},[255,257,262,264],{"type":49,"value":256},"Modules ",{"type":43,"tag":61,"props":258,"children":259},{},[260],{"type":49,"value":261},"MUST",{"type":49,"value":263}," be referenced using HashiCorp Terraform registry reference to a pinned version\n",{"type":43,"tag":67,"props":265,"children":266},{},[267],{"type":43,"tag":71,"props":268,"children":269},{},[270,272,279,281],{"type":49,"value":271},"Example: ",{"type":43,"tag":273,"props":274,"children":276},"code",{"className":275},[],[277],{"type":49,"value":278},"source = \"Azure\u002Fxxx\u002Fazurerm\"",{"type":49,"value":280}," with ",{"type":43,"tag":273,"props":282,"children":284},{"className":283},[],[285],{"type":49,"value":286},"version = \"1.2.3\"",{"type":43,"tag":71,"props":288,"children":289},{},[290,291,296,298,304,306,312],{"type":49,"value":256},{"type":43,"tag":61,"props":292,"children":293},{},[294],{"type":49,"value":295},"MUST NOT",{"type":49,"value":297}," use git references (e.g., ",{"type":43,"tag":273,"props":299,"children":301},{"className":300},[],[302],{"type":49,"value":303},"git::https:\u002F\u002Fxxx.yyy\u002Fxxx.git",{"type":49,"value":305}," or ",{"type":43,"tag":273,"props":307,"children":309},{"className":308},[],[310],{"type":49,"value":311},"github.com\u002Fxxx\u002Fyyy",{"type":49,"value":313},")",{"type":43,"tag":71,"props":315,"children":316},{},[317,318,322],{"type":49,"value":256},{"type":43,"tag":61,"props":319,"children":320},{},[321],{"type":49,"value":295},{"type":49,"value":323}," contain references to non-AVM modules",{"type":43,"tag":212,"props":325,"children":326},{},[],{"type":43,"tag":94,"props":328,"children":330},{"id":329},"azure-provider-requirements",[331],{"type":49,"value":120},{"type":43,"tag":52,"props":333,"children":334},{},[335,339,340,344],{"type":43,"tag":61,"props":336,"children":337},{},[338],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":341,"children":342},{},[343],{"type":49,"value":234},{"type":49,"value":345}," TFFR3",{"type":43,"tag":52,"props":347,"children":348},{},[349,351,355],{"type":49,"value":350},"Authors ",{"type":43,"tag":61,"props":352,"children":353},{},[354],{"type":49,"value":261},{"type":49,"value":356}," only use the following Azure providers:",{"type":43,"tag":358,"props":359,"children":360},"table",{},[361,385],{"type":43,"tag":362,"props":363,"children":364},"thead",{},[365],{"type":43,"tag":366,"props":367,"children":368},"tr",{},[369,375,380],{"type":43,"tag":370,"props":371,"children":372},"th",{},[373],{"type":49,"value":374},"Provider",{"type":43,"tag":370,"props":376,"children":377},{},[378],{"type":49,"value":379},"Min Version",{"type":43,"tag":370,"props":381,"children":382},{},[383],{"type":49,"value":384},"Max Version",{"type":43,"tag":386,"props":387,"children":388},"tbody",{},[389,408],{"type":43,"tag":366,"props":390,"children":391},{},[392,398,403],{"type":43,"tag":393,"props":394,"children":395},"td",{},[396],{"type":49,"value":397},"azapi",{"type":43,"tag":393,"props":399,"children":400},{},[401],{"type":49,"value":402},">= 2.0",{"type":43,"tag":393,"props":404,"children":405},{},[406],{"type":49,"value":407},"\u003C 3.0",{"type":43,"tag":366,"props":409,"children":410},{},[411,416,421],{"type":43,"tag":393,"props":412,"children":413},{},[414],{"type":49,"value":415},"azurerm",{"type":43,"tag":393,"props":417,"children":418},{},[419],{"type":49,"value":420},">= 4.0",{"type":43,"tag":393,"props":422,"children":423},{},[424],{"type":49,"value":425},"\u003C 5.0",{"type":43,"tag":52,"props":427,"children":428},{},[429],{"type":43,"tag":61,"props":430,"children":431},{},[432],{"type":49,"value":433},"Requirements:",{"type":43,"tag":67,"props":435,"children":436},{},[437,447,464],{"type":43,"tag":71,"props":438,"children":439},{},[440,441,445],{"type":49,"value":350},{"type":43,"tag":61,"props":442,"children":443},{},[444],{"type":49,"value":246},{"type":49,"value":446}," select either Azurerm, Azapi, or both providers",{"type":43,"tag":71,"props":448,"children":449},{},[450,454,456,462],{"type":43,"tag":61,"props":451,"children":452},{},[453],{"type":49,"value":261},{"type":49,"value":455}," use ",{"type":43,"tag":273,"props":457,"children":459},{"className":458},[],[460],{"type":49,"value":461},"required_providers",{"type":49,"value":463}," block to enforce provider versions",{"type":43,"tag":71,"props":465,"children":466},{},[467,472,474,480],{"type":43,"tag":61,"props":468,"children":469},{},[470],{"type":49,"value":471},"SHOULD",{"type":49,"value":473}," use pessimistic version constraint operator (",{"type":43,"tag":273,"props":475,"children":477},{"className":476},[],[478],{"type":49,"value":479},"~>",{"type":49,"value":313},{"type":43,"tag":52,"props":482,"children":483},{},[484],{"type":43,"tag":61,"props":485,"children":486},{},[487],{"type":49,"value":488},"Example:",{"type":43,"tag":490,"props":491,"children":496},"pre",{"className":492,"code":493,"language":494,"meta":495,"style":495},"language-hcl shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","terraform {\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp\u002Fazurerm\"\n      version = \"~> 4.0\"\n    }\n    azapi = {\n      source  = \"Azure\u002Fazapi\"\n      version = \"~> 2.0\"\n    }\n  }\n}\n","hcl","",[497],{"type":43,"tag":273,"props":498,"children":499},{"__ignoreMap":495},[500,511,520,529,538,547,556,565,574,583,591,600],{"type":43,"tag":501,"props":502,"children":505},"span",{"class":503,"line":504},"line",1,[506],{"type":43,"tag":501,"props":507,"children":508},{},[509],{"type":49,"value":510},"terraform {\n",{"type":43,"tag":501,"props":512,"children":514},{"class":503,"line":513},2,[515],{"type":43,"tag":501,"props":516,"children":517},{},[518],{"type":49,"value":519},"  required_providers {\n",{"type":43,"tag":501,"props":521,"children":523},{"class":503,"line":522},3,[524],{"type":43,"tag":501,"props":525,"children":526},{},[527],{"type":49,"value":528},"    azurerm = {\n",{"type":43,"tag":501,"props":530,"children":532},{"class":503,"line":531},4,[533],{"type":43,"tag":501,"props":534,"children":535},{},[536],{"type":49,"value":537},"      source  = \"hashicorp\u002Fazurerm\"\n",{"type":43,"tag":501,"props":539,"children":541},{"class":503,"line":540},5,[542],{"type":43,"tag":501,"props":543,"children":544},{},[545],{"type":49,"value":546},"      version = \"~> 4.0\"\n",{"type":43,"tag":501,"props":548,"children":550},{"class":503,"line":549},6,[551],{"type":43,"tag":501,"props":552,"children":553},{},[554],{"type":49,"value":555},"    }\n",{"type":43,"tag":501,"props":557,"children":559},{"class":503,"line":558},7,[560],{"type":43,"tag":501,"props":561,"children":562},{},[563],{"type":49,"value":564},"    azapi = {\n",{"type":43,"tag":501,"props":566,"children":568},{"class":503,"line":567},8,[569],{"type":43,"tag":501,"props":570,"children":571},{},[572],{"type":49,"value":573},"      source  = \"Azure\u002Fazapi\"\n",{"type":43,"tag":501,"props":575,"children":577},{"class":503,"line":576},9,[578],{"type":43,"tag":501,"props":579,"children":580},{},[581],{"type":49,"value":582},"      version = \"~> 2.0\"\n",{"type":43,"tag":501,"props":584,"children":586},{"class":503,"line":585},10,[587],{"type":43,"tag":501,"props":588,"children":589},{},[590],{"type":49,"value":555},{"type":43,"tag":501,"props":592,"children":594},{"class":503,"line":593},11,[595],{"type":43,"tag":501,"props":596,"children":597},{},[598],{"type":49,"value":599},"  }\n",{"type":43,"tag":501,"props":601,"children":603},{"class":503,"line":602},12,[604],{"type":43,"tag":501,"props":605,"children":606},{},[607],{"type":49,"value":608},"}\n",{"type":43,"tag":212,"props":610,"children":611},{},[],{"type":43,"tag":94,"props":613,"children":615},{"id":614},"code-style-standards",[616],{"type":49,"value":129},{"type":43,"tag":618,"props":619,"children":621},"h3",{"id":620},"lower-snake_casing",[622],{"type":49,"value":623},"Lower snake_casing",{"type":43,"tag":52,"props":625,"children":626},{},[627,631,632,636],{"type":43,"tag":61,"props":628,"children":629},{},[630],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":633,"children":634},{},[635],{"type":49,"value":234},{"type":49,"value":637}," TFNFR4",{"type":43,"tag":52,"props":639,"children":640},{},[641,645],{"type":43,"tag":61,"props":642,"children":643},{},[644],{"type":49,"value":261},{"type":49,"value":646}," use lower snake_casing for:",{"type":43,"tag":67,"props":648,"children":649},{},[650,655,660,665,670],{"type":43,"tag":71,"props":651,"children":652},{},[653],{"type":49,"value":654},"Locals",{"type":43,"tag":71,"props":656,"children":657},{},[658],{"type":49,"value":659},"Variables",{"type":43,"tag":71,"props":661,"children":662},{},[663],{"type":49,"value":664},"Outputs",{"type":43,"tag":71,"props":666,"children":667},{},[668],{"type":49,"value":669},"Resources (symbolic names)",{"type":43,"tag":71,"props":671,"children":672},{},[673],{"type":49,"value":674},"Modules (symbolic names)",{"type":43,"tag":52,"props":676,"children":677},{},[678,679],{"type":49,"value":271},{"type":43,"tag":273,"props":680,"children":682},{"className":681},[],[683],{"type":49,"value":684},"snake_casing_example",{"type":43,"tag":618,"props":686,"children":688},{"id":687},"resource-data-source-ordering",[689],{"type":49,"value":690},"Resource & Data Source Ordering",{"type":43,"tag":52,"props":692,"children":693},{},[694,698,700,704],{"type":43,"tag":61,"props":695,"children":696},{},[697],{"type":49,"value":227},{"type":49,"value":699}," SHOULD | ",{"type":43,"tag":61,"props":701,"children":702},{},[703],{"type":49,"value":234},{"type":49,"value":705}," TFNFR6",{"type":43,"tag":67,"props":707,"children":708},{},[709,720],{"type":43,"tag":71,"props":710,"children":711},{},[712,714,718],{"type":49,"value":713},"Resources that are depended on ",{"type":43,"tag":61,"props":715,"children":716},{},[717],{"type":49,"value":471},{"type":49,"value":719}," come first",{"type":43,"tag":71,"props":721,"children":722},{},[723,725,729],{"type":49,"value":724},"Resources with dependencies ",{"type":43,"tag":61,"props":726,"children":727},{},[728],{"type":49,"value":471},{"type":49,"value":730}," be defined close to each other",{"type":43,"tag":618,"props":732,"children":734},{"id":733},"count-for_each-usage",[735],{"type":49,"value":736},"Count & for_each Usage",{"type":43,"tag":52,"props":738,"children":739},{},[740,744,745,749],{"type":43,"tag":61,"props":741,"children":742},{},[743],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":746,"children":747},{},[748],{"type":49,"value":234},{"type":49,"value":750}," TFNFR7",{"type":43,"tag":67,"props":752,"children":753},{},[754,767,798],{"type":43,"tag":71,"props":755,"children":756},{},[757,759,765],{"type":49,"value":758},"Use ",{"type":43,"tag":273,"props":760,"children":762},{"className":761},[],[763],{"type":49,"value":764},"count",{"type":49,"value":766}," for conditional resource creation",{"type":43,"tag":71,"props":768,"children":769},{},[770,774,775,781,782,788,790,796],{"type":43,"tag":61,"props":771,"children":772},{},[773],{"type":49,"value":261},{"type":49,"value":455},{"type":43,"tag":273,"props":776,"children":778},{"className":777},[],[779],{"type":49,"value":780},"map(xxx)",{"type":49,"value":305},{"type":43,"tag":273,"props":783,"children":785},{"className":784},[],[786],{"type":49,"value":787},"set(xxx)",{"type":49,"value":789}," as resource's ",{"type":43,"tag":273,"props":791,"children":793},{"className":792},[],[794],{"type":49,"value":795},"for_each",{"type":49,"value":797}," collection",{"type":43,"tag":71,"props":799,"children":800},{},[801,803,807],{"type":49,"value":802},"The map's key or set's element ",{"type":43,"tag":61,"props":804,"children":805},{},[806],{"type":49,"value":261},{"type":49,"value":808}," be static literals",{"type":43,"tag":52,"props":810,"children":811},{},[812],{"type":43,"tag":61,"props":813,"children":814},{},[815],{"type":49,"value":488},{"type":43,"tag":490,"props":817,"children":819},{"className":492,"code":818,"language":494,"meta":495,"style":495},"resource \"azurerm_subnet\" \"pair\" {\n  for_each             = var.subnet_map  # map(string)\n  name                 = \"${each.value}-pair\"\n  resource_group_name  = azurerm_resource_group.example.name\n  virtual_network_name = azurerm_virtual_network.example.name\n  address_prefixes     = [\"10.0.1.0\u002F24\"]\n}\n",[820],{"type":43,"tag":273,"props":821,"children":822},{"__ignoreMap":495},[823,831,839,847,855,863,871],{"type":43,"tag":501,"props":824,"children":825},{"class":503,"line":504},[826],{"type":43,"tag":501,"props":827,"children":828},{},[829],{"type":49,"value":830},"resource \"azurerm_subnet\" \"pair\" {\n",{"type":43,"tag":501,"props":832,"children":833},{"class":503,"line":513},[834],{"type":43,"tag":501,"props":835,"children":836},{},[837],{"type":49,"value":838},"  for_each             = var.subnet_map  # map(string)\n",{"type":43,"tag":501,"props":840,"children":841},{"class":503,"line":522},[842],{"type":43,"tag":501,"props":843,"children":844},{},[845],{"type":49,"value":846},"  name                 = \"${each.value}-pair\"\n",{"type":43,"tag":501,"props":848,"children":849},{"class":503,"line":531},[850],{"type":43,"tag":501,"props":851,"children":852},{},[853],{"type":49,"value":854},"  resource_group_name  = azurerm_resource_group.example.name\n",{"type":43,"tag":501,"props":856,"children":857},{"class":503,"line":540},[858],{"type":43,"tag":501,"props":859,"children":860},{},[861],{"type":49,"value":862},"  virtual_network_name = azurerm_virtual_network.example.name\n",{"type":43,"tag":501,"props":864,"children":865},{"class":503,"line":549},[866],{"type":43,"tag":501,"props":867,"children":868},{},[869],{"type":49,"value":870},"  address_prefixes     = [\"10.0.1.0\u002F24\"]\n",{"type":43,"tag":501,"props":872,"children":873},{"class":503,"line":558},[874],{"type":43,"tag":501,"props":875,"children":876},{},[877],{"type":49,"value":608},{"type":43,"tag":618,"props":879,"children":881},{"id":880},"resource-data-block-internal-ordering",[882],{"type":49,"value":883},"Resource & Data Block Internal Ordering",{"type":43,"tag":52,"props":885,"children":886},{},[887,891,892,896],{"type":43,"tag":61,"props":888,"children":889},{},[890],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":893,"children":894},{},[895],{"type":49,"value":234},{"type":49,"value":897}," TFNFR8",{"type":43,"tag":52,"props":899,"children":900},{},[901],{"type":43,"tag":61,"props":902,"children":903},{},[904],{"type":49,"value":905},"Order within resource\u002Fdata blocks:",{"type":43,"tag":907,"props":908,"children":909},"ol",{},[910,948,980],{"type":43,"tag":71,"props":911,"children":912},{},[913,918,920],{"type":43,"tag":61,"props":914,"children":915},{},[916],{"type":49,"value":917},"Meta-arguments (top)",{"type":49,"value":919},":",{"type":43,"tag":67,"props":921,"children":922},{},[923,932,940],{"type":43,"tag":71,"props":924,"children":925},{},[926],{"type":43,"tag":273,"props":927,"children":929},{"className":928},[],[930],{"type":49,"value":931},"provider",{"type":43,"tag":71,"props":933,"children":934},{},[935],{"type":43,"tag":273,"props":936,"children":938},{"className":937},[],[939],{"type":49,"value":764},{"type":43,"tag":71,"props":941,"children":942},{},[943],{"type":43,"tag":273,"props":944,"children":946},{"className":945},[],[947],{"type":49,"value":795},{"type":43,"tag":71,"props":949,"children":950},{},[951,956,957],{"type":43,"tag":61,"props":952,"children":953},{},[954],{"type":49,"value":955},"Arguments\u002Fblocks (middle, alphabetical)",{"type":49,"value":919},{"type":43,"tag":67,"props":958,"children":959},{},[960,965,970,975],{"type":43,"tag":71,"props":961,"children":962},{},[963],{"type":49,"value":964},"Required arguments",{"type":43,"tag":71,"props":966,"children":967},{},[968],{"type":49,"value":969},"Optional arguments",{"type":43,"tag":71,"props":971,"children":972},{},[973],{"type":49,"value":974},"Required nested blocks",{"type":43,"tag":71,"props":976,"children":977},{},[978],{"type":49,"value":979},"Optional nested blocks",{"type":43,"tag":71,"props":981,"children":982},{},[983,988,989],{"type":43,"tag":61,"props":984,"children":985},{},[986],{"type":49,"value":987},"Meta-arguments (bottom)",{"type":49,"value":919},{"type":43,"tag":67,"props":990,"children":991},{},[992,1001],{"type":43,"tag":71,"props":993,"children":994},{},[995],{"type":43,"tag":273,"props":996,"children":998},{"className":997},[],[999],{"type":49,"value":1000},"depends_on",{"type":43,"tag":71,"props":1002,"children":1003},{},[1004,1010,1012,1018,1020,1026,1027,1033],{"type":43,"tag":273,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":49,"value":1009},"lifecycle",{"type":49,"value":1011}," (with sub-order: ",{"type":43,"tag":273,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":49,"value":1017},"create_before_destroy",{"type":49,"value":1019},", ",{"type":43,"tag":273,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":49,"value":1025},"ignore_changes",{"type":49,"value":1019},{"type":43,"tag":273,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":49,"value":1032},"prevent_destroy",{"type":49,"value":313},{"type":43,"tag":52,"props":1035,"children":1036},{},[1037],{"type":49,"value":1038},"Separate sections with blank lines.",{"type":43,"tag":618,"props":1040,"children":1042},{"id":1041},"module-block-ordering",[1043],{"type":49,"value":1044},"Module Block Ordering",{"type":43,"tag":52,"props":1046,"children":1047},{},[1048,1052,1053,1057],{"type":43,"tag":61,"props":1049,"children":1050},{},[1051],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1054,"children":1055},{},[1056],{"type":49,"value":234},{"type":49,"value":1058}," TFNFR9",{"type":43,"tag":52,"props":1060,"children":1061},{},[1062],{"type":43,"tag":61,"props":1063,"children":1064},{},[1065],{"type":49,"value":1066},"Order within module blocks:",{"type":43,"tag":907,"props":1068,"children":1069},{},[1070,1116,1136],{"type":43,"tag":71,"props":1071,"children":1072},{},[1073,1078,1079],{"type":43,"tag":61,"props":1074,"children":1075},{},[1076],{"type":49,"value":1077},"Top meta-arguments",{"type":49,"value":919},{"type":43,"tag":67,"props":1080,"children":1081},{},[1082,1091,1100,1108],{"type":43,"tag":71,"props":1083,"children":1084},{},[1085],{"type":43,"tag":273,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":49,"value":1090},"source",{"type":43,"tag":71,"props":1092,"children":1093},{},[1094],{"type":43,"tag":273,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":49,"value":1099},"version",{"type":43,"tag":71,"props":1101,"children":1102},{},[1103],{"type":43,"tag":273,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":49,"value":764},{"type":43,"tag":71,"props":1109,"children":1110},{},[1111],{"type":43,"tag":273,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":49,"value":795},{"type":43,"tag":71,"props":1117,"children":1118},{},[1119,1124,1125],{"type":43,"tag":61,"props":1120,"children":1121},{},[1122],{"type":49,"value":1123},"Arguments (alphabetical)",{"type":49,"value":919},{"type":43,"tag":67,"props":1126,"children":1127},{},[1128,1132],{"type":43,"tag":71,"props":1129,"children":1130},{},[1131],{"type":49,"value":964},{"type":43,"tag":71,"props":1133,"children":1134},{},[1135],{"type":49,"value":969},{"type":43,"tag":71,"props":1137,"children":1138},{},[1139,1144,1145],{"type":43,"tag":61,"props":1140,"children":1141},{},[1142],{"type":49,"value":1143},"Bottom meta-arguments",{"type":49,"value":919},{"type":43,"tag":67,"props":1146,"children":1147},{},[1148,1156],{"type":43,"tag":71,"props":1149,"children":1150},{},[1151],{"type":43,"tag":273,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":49,"value":1000},{"type":43,"tag":71,"props":1157,"children":1158},{},[1159],{"type":43,"tag":273,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":49,"value":1164},"providers",{"type":43,"tag":618,"props":1166,"children":1168},{"id":1167},"lifecycle-ignore_changes-syntax",[1169],{"type":49,"value":1170},"Lifecycle ignore_changes Syntax",{"type":43,"tag":52,"props":1172,"children":1173},{},[1174,1178,1179,1183],{"type":43,"tag":61,"props":1175,"children":1176},{},[1177],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":1180,"children":1181},{},[1182],{"type":49,"value":234},{"type":49,"value":1184}," TFNFR10",{"type":43,"tag":52,"props":1186,"children":1187},{},[1188,1190,1195,1197,1201],{"type":49,"value":1189},"The ",{"type":43,"tag":273,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":49,"value":1025},{"type":49,"value":1196}," attribute ",{"type":43,"tag":61,"props":1198,"children":1199},{},[1200],{"type":49,"value":295},{"type":49,"value":1202}," be enclosed in double quotes.",{"type":43,"tag":52,"props":1204,"children":1205},{},[1206],{"type":43,"tag":61,"props":1207,"children":1208},{},[1209],{"type":49,"value":1210},"Good:",{"type":43,"tag":490,"props":1212,"children":1214},{"className":492,"code":1213,"language":494,"meta":495,"style":495},"lifecycle {\n  ignore_changes = [tags]\n}\n",[1215],{"type":43,"tag":273,"props":1216,"children":1217},{"__ignoreMap":495},[1218,1226,1234],{"type":43,"tag":501,"props":1219,"children":1220},{"class":503,"line":504},[1221],{"type":43,"tag":501,"props":1222,"children":1223},{},[1224],{"type":49,"value":1225},"lifecycle {\n",{"type":43,"tag":501,"props":1227,"children":1228},{"class":503,"line":513},[1229],{"type":43,"tag":501,"props":1230,"children":1231},{},[1232],{"type":49,"value":1233},"  ignore_changes = [tags]\n",{"type":43,"tag":501,"props":1235,"children":1236},{"class":503,"line":522},[1237],{"type":43,"tag":501,"props":1238,"children":1239},{},[1240],{"type":49,"value":608},{"type":43,"tag":52,"props":1242,"children":1243},{},[1244],{"type":43,"tag":61,"props":1245,"children":1246},{},[1247],{"type":49,"value":1248},"Bad:",{"type":43,"tag":490,"props":1250,"children":1252},{"className":492,"code":1251,"language":494,"meta":495,"style":495},"lifecycle {\n  ignore_changes = [\"tags\"]\n}\n",[1253],{"type":43,"tag":273,"props":1254,"children":1255},{"__ignoreMap":495},[1256,1263,1271],{"type":43,"tag":501,"props":1257,"children":1258},{"class":503,"line":504},[1259],{"type":43,"tag":501,"props":1260,"children":1261},{},[1262],{"type":49,"value":1225},{"type":43,"tag":501,"props":1264,"children":1265},{"class":503,"line":513},[1266],{"type":43,"tag":501,"props":1267,"children":1268},{},[1269],{"type":49,"value":1270},"  ignore_changes = [\"tags\"]\n",{"type":43,"tag":501,"props":1272,"children":1273},{"class":503,"line":522},[1274],{"type":43,"tag":501,"props":1275,"children":1276},{},[1277],{"type":49,"value":608},{"type":43,"tag":618,"props":1279,"children":1281},{"id":1280},"null-comparison-for-conditional-creation",[1282],{"type":49,"value":1283},"Null Comparison for Conditional Creation",{"type":43,"tag":52,"props":1285,"children":1286},{},[1287,1291,1292,1296],{"type":43,"tag":61,"props":1288,"children":1289},{},[1290],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1293,"children":1294},{},[1295],{"type":49,"value":234},{"type":49,"value":1297}," TFNFR11",{"type":43,"tag":52,"props":1299,"children":1300},{},[1301,1303,1309],{"type":49,"value":1302},"For parameters requiring conditional resource creation, wrap with ",{"type":43,"tag":273,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":49,"value":1308},"object",{"type":49,"value":1310}," type to avoid \"known after apply\" issues during plan stage.",{"type":43,"tag":52,"props":1312,"children":1313},{},[1314],{"type":43,"tag":61,"props":1315,"children":1316},{},[1317],{"type":49,"value":1318},"Recommended:",{"type":43,"tag":490,"props":1320,"children":1322},{"className":492,"code":1321,"language":494,"meta":495,"style":495},"variable \"security_group\" {\n  type = object({\n    id = string\n  })\n  default = null\n}\n",[1323],{"type":43,"tag":273,"props":1324,"children":1325},{"__ignoreMap":495},[1326,1334,1342,1350,1358,1366],{"type":43,"tag":501,"props":1327,"children":1328},{"class":503,"line":504},[1329],{"type":43,"tag":501,"props":1330,"children":1331},{},[1332],{"type":49,"value":1333},"variable \"security_group\" {\n",{"type":43,"tag":501,"props":1335,"children":1336},{"class":503,"line":513},[1337],{"type":43,"tag":501,"props":1338,"children":1339},{},[1340],{"type":49,"value":1341},"  type = object({\n",{"type":43,"tag":501,"props":1343,"children":1344},{"class":503,"line":522},[1345],{"type":43,"tag":501,"props":1346,"children":1347},{},[1348],{"type":49,"value":1349},"    id = string\n",{"type":43,"tag":501,"props":1351,"children":1352},{"class":503,"line":531},[1353],{"type":43,"tag":501,"props":1354,"children":1355},{},[1356],{"type":49,"value":1357},"  })\n",{"type":43,"tag":501,"props":1359,"children":1360},{"class":503,"line":540},[1361],{"type":43,"tag":501,"props":1362,"children":1363},{},[1364],{"type":49,"value":1365},"  default = null\n",{"type":43,"tag":501,"props":1367,"children":1368},{"class":503,"line":549},[1369],{"type":43,"tag":501,"props":1370,"children":1371},{},[1372],{"type":49,"value":608},{"type":43,"tag":618,"props":1374,"children":1376},{"id":1375},"dynamic-blocks-for-optional-nested-objects",[1377],{"type":49,"value":1378},"Dynamic Blocks for Optional Nested Objects",{"type":43,"tag":52,"props":1380,"children":1381},{},[1382,1386,1387,1391],{"type":43,"tag":61,"props":1383,"children":1384},{},[1385],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":1388,"children":1389},{},[1390],{"type":49,"value":234},{"type":49,"value":1392}," TFNFR12",{"type":43,"tag":52,"props":1394,"children":1395},{},[1396,1398,1402],{"type":49,"value":1397},"Nested blocks under conditions ",{"type":43,"tag":61,"props":1399,"children":1400},{},[1401],{"type":49,"value":261},{"type":49,"value":1403}," use this pattern:",{"type":43,"tag":490,"props":1405,"children":1407},{"className":492,"code":1406,"language":494,"meta":495,"style":495},"dynamic \"identity\" {\n  for_each = \u003Ccondition> ? [\u003Csome_item>] : []\n\n  content {\n    # block content\n  }\n}\n",[1408],{"type":43,"tag":273,"props":1409,"children":1410},{"__ignoreMap":495},[1411,1419,1427,1436,1444,1452,1459],{"type":43,"tag":501,"props":1412,"children":1413},{"class":503,"line":504},[1414],{"type":43,"tag":501,"props":1415,"children":1416},{},[1417],{"type":49,"value":1418},"dynamic \"identity\" {\n",{"type":43,"tag":501,"props":1420,"children":1421},{"class":503,"line":513},[1422],{"type":43,"tag":501,"props":1423,"children":1424},{},[1425],{"type":49,"value":1426},"  for_each = \u003Ccondition> ? [\u003Csome_item>] : []\n",{"type":43,"tag":501,"props":1428,"children":1429},{"class":503,"line":522},[1430],{"type":43,"tag":501,"props":1431,"children":1433},{"emptyLinePlaceholder":1432},true,[1434],{"type":49,"value":1435},"\n",{"type":43,"tag":501,"props":1437,"children":1438},{"class":503,"line":531},[1439],{"type":43,"tag":501,"props":1440,"children":1441},{},[1442],{"type":49,"value":1443},"  content {\n",{"type":43,"tag":501,"props":1445,"children":1446},{"class":503,"line":540},[1447],{"type":43,"tag":501,"props":1448,"children":1449},{},[1450],{"type":49,"value":1451},"    # block content\n",{"type":43,"tag":501,"props":1453,"children":1454},{"class":503,"line":549},[1455],{"type":43,"tag":501,"props":1456,"children":1457},{},[1458],{"type":49,"value":599},{"type":43,"tag":501,"props":1460,"children":1461},{"class":503,"line":558},[1462],{"type":43,"tag":501,"props":1463,"children":1464},{},[1465],{"type":49,"value":608},{"type":43,"tag":618,"props":1467,"children":1469},{"id":1468},"default-values-with-coalescetry",[1470],{"type":49,"value":1471},"Default Values with coalesce\u002Ftry",{"type":43,"tag":52,"props":1473,"children":1474},{},[1475,1479,1480,1484],{"type":43,"tag":61,"props":1476,"children":1477},{},[1478],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1481,"children":1482},{},[1483],{"type":49,"value":234},{"type":49,"value":1485}," TFNFR13",{"type":43,"tag":52,"props":1487,"children":1488},{},[1489],{"type":43,"tag":61,"props":1490,"children":1491},{},[1492],{"type":49,"value":1210},{"type":43,"tag":490,"props":1494,"children":1496},{"className":492,"code":1495,"language":494,"meta":495,"style":495},"coalesce(var.new_network_security_group_name, \"${var.subnet_name}-nsg\")\n",[1497],{"type":43,"tag":273,"props":1498,"children":1499},{"__ignoreMap":495},[1500],{"type":43,"tag":501,"props":1501,"children":1502},{"class":503,"line":504},[1503],{"type":43,"tag":501,"props":1504,"children":1505},{},[1506],{"type":49,"value":1495},{"type":43,"tag":52,"props":1508,"children":1509},{},[1510],{"type":43,"tag":61,"props":1511,"children":1512},{},[1513],{"type":49,"value":1248},{"type":43,"tag":490,"props":1515,"children":1517},{"className":492,"code":1516,"language":494,"meta":495,"style":495},"var.new_network_security_group_name == null ? \"${var.subnet_name}-nsg\" : var.new_network_security_group_name\n",[1518],{"type":43,"tag":273,"props":1519,"children":1520},{"__ignoreMap":495},[1521],{"type":43,"tag":501,"props":1522,"children":1523},{"class":503,"line":504},[1524],{"type":43,"tag":501,"props":1525,"children":1526},{},[1527],{"type":49,"value":1516},{"type":43,"tag":618,"props":1529,"children":1531},{"id":1530},"provider-declarations-in-modules",[1532],{"type":49,"value":1533},"Provider Declarations in Modules",{"type":43,"tag":52,"props":1535,"children":1536},{},[1537,1541,1542,1546],{"type":43,"tag":61,"props":1538,"children":1539},{},[1540],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":1543,"children":1544},{},[1545],{"type":49,"value":234},{"type":49,"value":1547}," TFNFR27",{"type":43,"tag":67,"props":1549,"children":1550},{},[1551,1574,1596],{"type":43,"tag":71,"props":1552,"children":1553},{},[1554,1559,1561,1565,1567,1573],{"type":43,"tag":273,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":49,"value":931},{"type":49,"value":1560}," ",{"type":43,"tag":61,"props":1562,"children":1563},{},[1564],{"type":49,"value":295},{"type":49,"value":1566}," be declared in modules (except for ",{"type":43,"tag":273,"props":1568,"children":1570},{"className":1569},[],[1571],{"type":49,"value":1572},"configuration_aliases",{"type":49,"value":313},{"type":43,"tag":71,"props":1575,"children":1576},{},[1577,1582,1584,1588,1590],{"type":43,"tag":273,"props":1578,"children":1580},{"className":1579},[],[1581],{"type":49,"value":931},{"type":49,"value":1583}," blocks in modules ",{"type":43,"tag":61,"props":1585,"children":1586},{},[1587],{"type":49,"value":261},{"type":49,"value":1589}," only use ",{"type":43,"tag":273,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":49,"value":1595},"alias",{"type":43,"tag":71,"props":1597,"children":1598},{},[1599,1601,1605],{"type":49,"value":1600},"Provider configurations ",{"type":43,"tag":61,"props":1602,"children":1603},{},[1604],{"type":49,"value":471},{"type":49,"value":1606}," be passed in by module users",{"type":43,"tag":212,"props":1608,"children":1609},{},[],{"type":43,"tag":94,"props":1611,"children":1613},{"id":1612},"variable-requirements",[1614],{"type":49,"value":138},{"type":43,"tag":618,"props":1616,"children":1618},{"id":1617},"not-allowed-variables",[1619],{"type":49,"value":1620},"Not Allowed Variables",{"type":43,"tag":52,"props":1622,"children":1623},{},[1624,1628,1629,1633],{"type":43,"tag":61,"props":1625,"children":1626},{},[1627],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":1630,"children":1631},{},[1632],{"type":49,"value":234},{"type":49,"value":1634}," TFNFR14",{"type":43,"tag":52,"props":1636,"children":1637},{},[1638,1640,1644,1646,1652,1653,1659],{"type":49,"value":1639},"Module owners ",{"type":43,"tag":61,"props":1641,"children":1642},{},[1643],{"type":49,"value":295},{"type":49,"value":1645}," add variables like ",{"type":43,"tag":273,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":49,"value":1651},"enabled",{"type":49,"value":305},{"type":43,"tag":273,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":49,"value":1658},"module_depends_on",{"type":49,"value":1660}," to control entire module operation. Boolean feature toggles for specific resources are acceptable.",{"type":43,"tag":618,"props":1662,"children":1664},{"id":1663},"variable-definition-order",[1665],{"type":49,"value":1666},"Variable Definition Order",{"type":43,"tag":52,"props":1668,"children":1669},{},[1670,1674,1675,1679],{"type":43,"tag":61,"props":1671,"children":1672},{},[1673],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1676,"children":1677},{},[1678],{"type":49,"value":234},{"type":49,"value":1680}," TFNFR15",{"type":43,"tag":52,"props":1682,"children":1683},{},[1684,1686,1690],{"type":49,"value":1685},"Variables ",{"type":43,"tag":61,"props":1687,"children":1688},{},[1689],{"type":49,"value":471},{"type":49,"value":1691}," follow this order:",{"type":43,"tag":907,"props":1693,"children":1694},{},[1695,1700],{"type":43,"tag":71,"props":1696,"children":1697},{},[1698],{"type":49,"value":1699},"All required fields (alphabetical)",{"type":43,"tag":71,"props":1701,"children":1702},{},[1703],{"type":49,"value":1704},"All optional fields (alphabetical)",{"type":43,"tag":618,"props":1706,"children":1708},{"id":1707},"variable-naming-rules",[1709],{"type":49,"value":1710},"Variable Naming Rules",{"type":43,"tag":52,"props":1712,"children":1713},{},[1714,1718,1719,1723],{"type":43,"tag":61,"props":1715,"children":1716},{},[1717],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1720,"children":1721},{},[1722],{"type":49,"value":234},{"type":49,"value":1724}," TFNFR16",{"type":43,"tag":67,"props":1726,"children":1727},{},[1728,1740],{"type":43,"tag":71,"props":1729,"children":1730},{},[1731,1733],{"type":49,"value":1732},"Follow ",{"type":43,"tag":75,"props":1734,"children":1737},{"href":1735,"rel":1736},"https:\u002F\u002Fwww.terraform.io\u002Fdocs\u002Fextend\u002Fbest-practices\u002Fnaming.html",[79],[1738],{"type":49,"value":1739},"HashiCorp's naming rules",{"type":43,"tag":71,"props":1741,"children":1742},{},[1743,1745,1749,1751,1757,1759],{"type":49,"value":1744},"Feature switches ",{"type":43,"tag":61,"props":1746,"children":1747},{},[1748],{"type":49,"value":471},{"type":49,"value":1750}," use positive statements: ",{"type":43,"tag":273,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":49,"value":1756},"xxx_enabled",{"type":49,"value":1758}," instead of ",{"type":43,"tag":273,"props":1760,"children":1762},{"className":1761},[],[1763],{"type":49,"value":1764},"xxx_disabled",{"type":43,"tag":618,"props":1766,"children":1768},{"id":1767},"variables-with-descriptions",[1769],{"type":49,"value":1770},"Variables with Descriptions",{"type":43,"tag":52,"props":1772,"children":1773},{},[1774,1778,1779,1783],{"type":43,"tag":61,"props":1775,"children":1776},{},[1777],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1780,"children":1781},{},[1782],{"type":49,"value":234},{"type":49,"value":1784}," TFNFR17",{"type":43,"tag":67,"props":1786,"children":1787},{},[1788,1804,1809],{"type":43,"tag":71,"props":1789,"children":1790},{},[1791,1797,1798,1802],{"type":43,"tag":273,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":49,"value":1796},"description",{"type":49,"value":1560},{"type":43,"tag":61,"props":1799,"children":1800},{},[1801],{"type":49,"value":471},{"type":49,"value":1803}," precisely describe the parameter's purpose and expected data type",{"type":43,"tag":71,"props":1805,"children":1806},{},[1807],{"type":49,"value":1808},"Target audience is module users, not developers",{"type":43,"tag":71,"props":1810,"children":1811},{},[1812,1814,1819],{"type":49,"value":1813},"For ",{"type":43,"tag":273,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":49,"value":1308},{"type":49,"value":1820}," types, use HEREDOC format",{"type":43,"tag":618,"props":1822,"children":1824},{"id":1823},"variables-with-types",[1825],{"type":49,"value":1826},"Variables with Types",{"type":43,"tag":52,"props":1828,"children":1829},{},[1830,1834,1835,1839],{"type":43,"tag":61,"props":1831,"children":1832},{},[1833],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":1836,"children":1837},{},[1838],{"type":49,"value":234},{"type":49,"value":1840}," TFNFR18",{"type":43,"tag":67,"props":1842,"children":1843},{},[1844,1860,1875,1891,1918],{"type":43,"tag":71,"props":1845,"children":1846},{},[1847,1853,1854,1858],{"type":43,"tag":273,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":49,"value":1852},"type",{"type":49,"value":1560},{"type":43,"tag":61,"props":1855,"children":1856},{},[1857],{"type":49,"value":261},{"type":49,"value":1859}," be defined for every variable",{"type":43,"tag":71,"props":1861,"children":1862},{},[1863,1868,1869,1873],{"type":43,"tag":273,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":49,"value":1852},{"type":49,"value":1560},{"type":43,"tag":61,"props":1870,"children":1871},{},[1872],{"type":49,"value":471},{"type":49,"value":1874}," be as precise as possible",{"type":43,"tag":71,"props":1876,"children":1877},{},[1878,1884,1885,1889],{"type":43,"tag":273,"props":1879,"children":1881},{"className":1880},[],[1882],{"type":49,"value":1883},"any",{"type":49,"value":1560},{"type":43,"tag":61,"props":1886,"children":1887},{},[1888],{"type":49,"value":246},{"type":49,"value":1890}," only be used with adequate reasons",{"type":43,"tag":71,"props":1892,"children":1893},{},[1894,1895,1901,1902,1908,1910,1916],{"type":49,"value":758},{"type":43,"tag":273,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":49,"value":1900},"bool",{"type":49,"value":1758},{"type":43,"tag":273,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":49,"value":1907},"string",{"type":49,"value":1909},"\u002F",{"type":43,"tag":273,"props":1911,"children":1913},{"className":1912},[],[1914],{"type":49,"value":1915},"number",{"type":49,"value":1917}," for true\u002Ffalse values",{"type":43,"tag":71,"props":1919,"children":1920},{},[1921,1923,1928,1929],{"type":49,"value":1922},"Use concrete ",{"type":43,"tag":273,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":49,"value":1308},{"type":49,"value":1758},{"type":43,"tag":273,"props":1930,"children":1932},{"className":1931},[],[1933],{"type":49,"value":1934},"map(any)",{"type":43,"tag":618,"props":1936,"children":1938},{"id":1937},"sensitive-data-variables",[1939],{"type":49,"value":1940},"Sensitive Data Variables",{"type":43,"tag":52,"props":1942,"children":1943},{},[1944,1948,1949,1953],{"type":43,"tag":61,"props":1945,"children":1946},{},[1947],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1950,"children":1951},{},[1952],{"type":49,"value":234},{"type":49,"value":1954}," TFNFR19",{"type":43,"tag":52,"props":1956,"children":1957},{},[1958,1960,1965,1967,1971,1973,1979],{"type":49,"value":1959},"If a variable's type is ",{"type":43,"tag":273,"props":1961,"children":1963},{"className":1962},[],[1964],{"type":49,"value":1308},{"type":49,"value":1966}," and contains sensitive fields, the entire variable ",{"type":43,"tag":61,"props":1968,"children":1969},{},[1970],{"type":49,"value":471},{"type":49,"value":1972}," be ",{"type":43,"tag":273,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":49,"value":1978},"sensitive = true",{"type":49,"value":1980},", or extract sensitive fields into separate variables.",{"type":43,"tag":618,"props":1982,"children":1984},{"id":1983},"non-nullable-defaults-for-collections",[1985],{"type":49,"value":1986},"Non-Nullable Defaults for Collections",{"type":43,"tag":52,"props":1988,"children":1989},{},[1990,1994,1995,1999],{"type":43,"tag":61,"props":1991,"children":1992},{},[1993],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":1996,"children":1997},{},[1998],{"type":49,"value":234},{"type":49,"value":2000}," TFNFR20",{"type":43,"tag":52,"props":2002,"children":2003},{},[2004,2006,2010,2012,2018],{"type":49,"value":2005},"Nullable ",{"type":43,"tag":61,"props":2007,"children":2008},{},[2009],{"type":49,"value":471},{"type":49,"value":2011}," be set to ",{"type":43,"tag":273,"props":2013,"children":2015},{"className":2014},[],[2016],{"type":49,"value":2017},"false",{"type":49,"value":2019}," for collection values (sets, maps, lists) when using them in loops. For scalar values, null may have semantic meaning.",{"type":43,"tag":618,"props":2021,"children":2023},{"id":2022},"discourage-nullability-by-default",[2024],{"type":49,"value":2025},"Discourage Nullability by Default",{"type":43,"tag":52,"props":2027,"children":2028},{},[2029,2033,2034,2038],{"type":43,"tag":61,"props":2030,"children":2031},{},[2032],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2035,"children":2036},{},[2037],{"type":49,"value":234},{"type":49,"value":2039}," TFNFR21",{"type":43,"tag":52,"props":2041,"children":2042},{},[2043,2049,2050,2054],{"type":43,"tag":273,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":49,"value":2048},"nullable = true",{"type":49,"value":1560},{"type":43,"tag":61,"props":2051,"children":2052},{},[2053],{"type":49,"value":261},{"type":49,"value":2055}," be avoided unless there's a specific semantic need for null values.",{"type":43,"tag":618,"props":2057,"children":2059},{"id":2058},"avoid-sensitive-false",[2060],{"type":49,"value":2061},"Avoid sensitive = false",{"type":43,"tag":52,"props":2063,"children":2064},{},[2065,2069,2070,2074],{"type":43,"tag":61,"props":2066,"children":2067},{},[2068],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2071,"children":2072},{},[2073],{"type":49,"value":234},{"type":49,"value":2075}," TFNFR22",{"type":43,"tag":52,"props":2077,"children":2078},{},[2079,2085,2086,2090],{"type":43,"tag":273,"props":2080,"children":2082},{"className":2081},[],[2083],{"type":49,"value":2084},"sensitive = false",{"type":49,"value":1560},{"type":43,"tag":61,"props":2087,"children":2088},{},[2089],{"type":49,"value":261},{"type":49,"value":2091}," be avoided (this is the default).",{"type":43,"tag":618,"props":2093,"children":2095},{"id":2094},"sensitive-default-value-conditions",[2096],{"type":49,"value":2097},"Sensitive Default Value Conditions",{"type":43,"tag":52,"props":2099,"children":2100},{},[2101,2105,2106,2110],{"type":43,"tag":61,"props":2102,"children":2103},{},[2104],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2107,"children":2108},{},[2109],{"type":49,"value":234},{"type":49,"value":2111}," TFNFR23",{"type":43,"tag":52,"props":2113,"children":2114},{},[2115,2117,2121],{"type":49,"value":2116},"A default value ",{"type":43,"tag":61,"props":2118,"children":2119},{},[2120],{"type":49,"value":295},{"type":49,"value":2122}," be set for sensitive inputs (e.g., default passwords).",{"type":43,"tag":618,"props":2124,"children":2126},{"id":2125},"handling-deprecated-variables",[2127],{"type":49,"value":2128},"Handling Deprecated Variables",{"type":43,"tag":52,"props":2130,"children":2131},{},[2132,2136,2137,2141],{"type":43,"tag":61,"props":2133,"children":2134},{},[2135],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2138,"children":2139},{},[2140],{"type":49,"value":234},{"type":49,"value":2142}," TFNFR24",{"type":43,"tag":67,"props":2144,"children":2145},{},[2146,2157,2170,2175],{"type":43,"tag":71,"props":2147,"children":2148},{},[2149,2151],{"type":49,"value":2150},"Move deprecated variables to ",{"type":43,"tag":273,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":49,"value":2156},"deprecated_variables.tf",{"type":43,"tag":71,"props":2158,"children":2159},{},[2160,2162,2168],{"type":49,"value":2161},"Annotate with ",{"type":43,"tag":273,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":49,"value":2167},"DEPRECATED",{"type":49,"value":2169}," at the beginning of description",{"type":43,"tag":71,"props":2171,"children":2172},{},[2173],{"type":49,"value":2174},"Declare the replacement's name",{"type":43,"tag":71,"props":2176,"children":2177},{},[2178],{"type":49,"value":2179},"Clean up during major version releases",{"type":43,"tag":212,"props":2181,"children":2182},{},[],{"type":43,"tag":94,"props":2184,"children":2186},{"id":2185},"output-requirements",[2187],{"type":49,"value":147},{"type":43,"tag":618,"props":2189,"children":2191},{"id":2190},"additional-terraform-outputs",[2192],{"type":49,"value":2193},"Additional Terraform Outputs",{"type":43,"tag":52,"props":2195,"children":2196},{},[2197,2201,2202,2206],{"type":43,"tag":61,"props":2198,"children":2199},{},[2200],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":2203,"children":2204},{},[2205],{"type":49,"value":234},{"type":49,"value":2207}," TFFR2",{"type":43,"tag":52,"props":2209,"children":2210},{},[2211,2212,2217],{"type":49,"value":350},{"type":43,"tag":61,"props":2213,"children":2214},{},[2215],{"type":49,"value":2216},"SHOULD NOT",{"type":49,"value":2218}," output entire resource objects as these may contain sensitive data and the schema can change with API or provider versions.",{"type":43,"tag":52,"props":2220,"children":2221},{},[2222],{"type":43,"tag":61,"props":2223,"children":2224},{},[2225],{"type":49,"value":2226},"Best Practices:",{"type":43,"tag":67,"props":2228,"children":2229},{},[2230,2243,2259,2270],{"type":43,"tag":71,"props":2231,"children":2232},{},[2233,2235,2241],{"type":49,"value":2234},"Output ",{"type":43,"tag":2236,"props":2237,"children":2238},"em",{},[2239],{"type":49,"value":2240},"computed",{"type":49,"value":2242}," attributes of resources as discrete outputs (anti-corruption layer pattern)",{"type":43,"tag":71,"props":2244,"children":2245},{},[2246,2250,2252,2258],{"type":43,"tag":61,"props":2247,"children":2248},{},[2249],{"type":49,"value":2216},{"type":49,"value":2251}," output values that are already inputs (except ",{"type":43,"tag":273,"props":2253,"children":2255},{"className":2254},[],[2256],{"type":49,"value":2257},"name",{"type":49,"value":313},{"type":43,"tag":71,"props":2260,"children":2261},{},[2262,2263,2268],{"type":49,"value":758},{"type":43,"tag":273,"props":2264,"children":2266},{"className":2265},[],[2267],{"type":49,"value":1978},{"type":49,"value":2269}," for sensitive attributes",{"type":43,"tag":71,"props":2271,"children":2272},{},[2273,2275,2280],{"type":49,"value":2274},"For resources deployed with ",{"type":43,"tag":273,"props":2276,"children":2278},{"className":2277},[],[2279],{"type":49,"value":795},{"type":49,"value":2281},", output computed attributes in a map structure",{"type":43,"tag":52,"props":2283,"children":2284},{},[2285],{"type":43,"tag":61,"props":2286,"children":2287},{},[2288],{"type":49,"value":2289},"Examples:",{"type":43,"tag":490,"props":2291,"children":2293},{"className":492,"code":2292,"language":494,"meta":495,"style":495},"# Single resource computed attribute\noutput \"foo\" {\n  description = \"MyResource foo attribute\"\n  value       = azurerm_resource_myresource.foo\n}\n\n# for_each resources\noutput \"childresource_foos\" {\n  description = \"MyResource children's foo attributes\"\n  value = {\n    for key, value in azurerm_resource_mychildresource : key => value.foo\n  }\n}\n\n# Sensitive output\noutput \"bar\" {\n  description = \"MyResource bar attribute\"\n  value       = azurerm_resource_myresource.bar\n  sensitive   = true\n}\n",[2294],{"type":43,"tag":273,"props":2295,"children":2296},{"__ignoreMap":495},[2297,2305,2313,2321,2329,2336,2343,2351,2359,2367,2375,2383,2390,2398,2406,2415,2424,2433,2442,2451],{"type":43,"tag":501,"props":2298,"children":2299},{"class":503,"line":504},[2300],{"type":43,"tag":501,"props":2301,"children":2302},{},[2303],{"type":49,"value":2304},"# Single resource computed attribute\n",{"type":43,"tag":501,"props":2306,"children":2307},{"class":503,"line":513},[2308],{"type":43,"tag":501,"props":2309,"children":2310},{},[2311],{"type":49,"value":2312},"output \"foo\" {\n",{"type":43,"tag":501,"props":2314,"children":2315},{"class":503,"line":522},[2316],{"type":43,"tag":501,"props":2317,"children":2318},{},[2319],{"type":49,"value":2320},"  description = \"MyResource foo attribute\"\n",{"type":43,"tag":501,"props":2322,"children":2323},{"class":503,"line":531},[2324],{"type":43,"tag":501,"props":2325,"children":2326},{},[2327],{"type":49,"value":2328},"  value       = azurerm_resource_myresource.foo\n",{"type":43,"tag":501,"props":2330,"children":2331},{"class":503,"line":540},[2332],{"type":43,"tag":501,"props":2333,"children":2334},{},[2335],{"type":49,"value":608},{"type":43,"tag":501,"props":2337,"children":2338},{"class":503,"line":549},[2339],{"type":43,"tag":501,"props":2340,"children":2341},{"emptyLinePlaceholder":1432},[2342],{"type":49,"value":1435},{"type":43,"tag":501,"props":2344,"children":2345},{"class":503,"line":558},[2346],{"type":43,"tag":501,"props":2347,"children":2348},{},[2349],{"type":49,"value":2350},"# for_each resources\n",{"type":43,"tag":501,"props":2352,"children":2353},{"class":503,"line":567},[2354],{"type":43,"tag":501,"props":2355,"children":2356},{},[2357],{"type":49,"value":2358},"output \"childresource_foos\" {\n",{"type":43,"tag":501,"props":2360,"children":2361},{"class":503,"line":576},[2362],{"type":43,"tag":501,"props":2363,"children":2364},{},[2365],{"type":49,"value":2366},"  description = \"MyResource children's foo attributes\"\n",{"type":43,"tag":501,"props":2368,"children":2369},{"class":503,"line":585},[2370],{"type":43,"tag":501,"props":2371,"children":2372},{},[2373],{"type":49,"value":2374},"  value = {\n",{"type":43,"tag":501,"props":2376,"children":2377},{"class":503,"line":593},[2378],{"type":43,"tag":501,"props":2379,"children":2380},{},[2381],{"type":49,"value":2382},"    for key, value in azurerm_resource_mychildresource : key => value.foo\n",{"type":43,"tag":501,"props":2384,"children":2385},{"class":503,"line":602},[2386],{"type":43,"tag":501,"props":2387,"children":2388},{},[2389],{"type":49,"value":599},{"type":43,"tag":501,"props":2391,"children":2393},{"class":503,"line":2392},13,[2394],{"type":43,"tag":501,"props":2395,"children":2396},{},[2397],{"type":49,"value":608},{"type":43,"tag":501,"props":2399,"children":2401},{"class":503,"line":2400},14,[2402],{"type":43,"tag":501,"props":2403,"children":2404},{"emptyLinePlaceholder":1432},[2405],{"type":49,"value":1435},{"type":43,"tag":501,"props":2407,"children":2409},{"class":503,"line":2408},15,[2410],{"type":43,"tag":501,"props":2411,"children":2412},{},[2413],{"type":49,"value":2414},"# Sensitive output\n",{"type":43,"tag":501,"props":2416,"children":2418},{"class":503,"line":2417},16,[2419],{"type":43,"tag":501,"props":2420,"children":2421},{},[2422],{"type":49,"value":2423},"output \"bar\" {\n",{"type":43,"tag":501,"props":2425,"children":2427},{"class":503,"line":2426},17,[2428],{"type":43,"tag":501,"props":2429,"children":2430},{},[2431],{"type":49,"value":2432},"  description = \"MyResource bar attribute\"\n",{"type":43,"tag":501,"props":2434,"children":2436},{"class":503,"line":2435},18,[2437],{"type":43,"tag":501,"props":2438,"children":2439},{},[2440],{"type":49,"value":2441},"  value       = azurerm_resource_myresource.bar\n",{"type":43,"tag":501,"props":2443,"children":2445},{"class":503,"line":2444},19,[2446],{"type":43,"tag":501,"props":2447,"children":2448},{},[2449],{"type":49,"value":2450},"  sensitive   = true\n",{"type":43,"tag":501,"props":2452,"children":2454},{"class":503,"line":2453},20,[2455],{"type":43,"tag":501,"props":2456,"children":2457},{},[2458],{"type":49,"value":608},{"type":43,"tag":618,"props":2460,"children":2462},{"id":2461},"sensitive-data-outputs",[2463],{"type":49,"value":2464},"Sensitive Data Outputs",{"type":43,"tag":52,"props":2466,"children":2467},{},[2468,2472,2473,2477],{"type":43,"tag":61,"props":2469,"children":2470},{},[2471],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2474,"children":2475},{},[2476],{"type":49,"value":234},{"type":49,"value":2478}," TFNFR29",{"type":43,"tag":52,"props":2480,"children":2481},{},[2482,2484,2488,2490,2495],{"type":49,"value":2483},"Outputs containing confidential data ",{"type":43,"tag":61,"props":2485,"children":2486},{},[2487],{"type":49,"value":261},{"type":49,"value":2489}," be declared with ",{"type":43,"tag":273,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":49,"value":1978},{"type":49,"value":2496},".",{"type":43,"tag":618,"props":2498,"children":2500},{"id":2499},"handling-deprecated-outputs",[2501],{"type":49,"value":2502},"Handling Deprecated Outputs",{"type":43,"tag":52,"props":2504,"children":2505},{},[2506,2510,2511,2515],{"type":43,"tag":61,"props":2507,"children":2508},{},[2509],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2512,"children":2513},{},[2514],{"type":49,"value":234},{"type":49,"value":2516}," TFNFR30",{"type":43,"tag":67,"props":2518,"children":2519},{},[2520,2531,2542],{"type":43,"tag":71,"props":2521,"children":2522},{},[2523,2525],{"type":49,"value":2524},"Move deprecated outputs to ",{"type":43,"tag":273,"props":2526,"children":2528},{"className":2527},[],[2529],{"type":49,"value":2530},"deprecated_outputs.tf",{"type":43,"tag":71,"props":2532,"children":2533},{},[2534,2536],{"type":49,"value":2535},"Define new outputs in ",{"type":43,"tag":273,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":49,"value":2541},"outputs.tf",{"type":43,"tag":71,"props":2543,"children":2544},{},[2545],{"type":49,"value":2179},{"type":43,"tag":212,"props":2547,"children":2548},{},[],{"type":43,"tag":94,"props":2550,"children":2552},{"id":2551},"local-values-standards",[2553],{"type":49,"value":156},{"type":43,"tag":618,"props":2555,"children":2557},{"id":2556},"localstf-organization",[2558],{"type":49,"value":2559},"locals.tf Organization",{"type":43,"tag":52,"props":2561,"children":2562},{},[2563,2567,2569,2573],{"type":43,"tag":61,"props":2564,"children":2565},{},[2566],{"type":49,"value":227},{"type":49,"value":2568}," MAY | ",{"type":43,"tag":61,"props":2570,"children":2571},{},[2572],{"type":49,"value":234},{"type":49,"value":2574}," TFNFR31",{"type":43,"tag":67,"props":2576,"children":2577},{},[2578,2602],{"type":43,"tag":71,"props":2579,"children":2580},{},[2581,2587,2588,2592,2594,2600],{"type":43,"tag":273,"props":2582,"children":2584},{"className":2583},[],[2585],{"type":49,"value":2586},"locals.tf",{"type":49,"value":1560},{"type":43,"tag":61,"props":2589,"children":2590},{},[2591],{"type":49,"value":471},{"type":49,"value":2593}," only contain ",{"type":43,"tag":273,"props":2595,"children":2597},{"className":2596},[],[2598],{"type":49,"value":2599},"locals",{"type":49,"value":2601}," blocks",{"type":43,"tag":71,"props":2603,"children":2604},{},[2605,2609,2611,2616],{"type":43,"tag":61,"props":2606,"children":2607},{},[2608],{"type":49,"value":246},{"type":49,"value":2610}," declare ",{"type":43,"tag":273,"props":2612,"children":2614},{"className":2613},[],[2615],{"type":49,"value":2599},{"type":49,"value":2617}," blocks next to resources for advanced scenarios",{"type":43,"tag":618,"props":2619,"children":2621},{"id":2620},"alphabetical-local-arrangement",[2622],{"type":49,"value":2623},"Alphabetical Local Arrangement",{"type":43,"tag":52,"props":2625,"children":2626},{},[2627,2631,2632,2636],{"type":43,"tag":61,"props":2628,"children":2629},{},[2630],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2633,"children":2634},{},[2635],{"type":49,"value":234},{"type":49,"value":2637}," TFNFR32",{"type":43,"tag":52,"props":2639,"children":2640},{},[2641,2643,2648,2650,2654],{"type":49,"value":2642},"Expressions in ",{"type":43,"tag":273,"props":2644,"children":2646},{"className":2645},[],[2647],{"type":49,"value":2599},{"type":49,"value":2649}," blocks ",{"type":43,"tag":61,"props":2651,"children":2652},{},[2653],{"type":49,"value":261},{"type":49,"value":2655}," be arranged alphabetically.",{"type":43,"tag":618,"props":2657,"children":2659},{"id":2658},"precise-local-types",[2660],{"type":49,"value":2661},"Precise Local Types",{"type":43,"tag":52,"props":2663,"children":2664},{},[2665,2669,2670,2674],{"type":43,"tag":61,"props":2666,"children":2667},{},[2668],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":2671,"children":2672},{},[2673],{"type":49,"value":234},{"type":49,"value":2675}," TFNFR33",{"type":43,"tag":52,"props":2677,"children":2678},{},[2679,2681,2686,2688,2693],{"type":49,"value":2680},"Use precise types (e.g., ",{"type":43,"tag":273,"props":2682,"children":2684},{"className":2683},[],[2685],{"type":49,"value":1915},{"type":49,"value":2687}," for age, not ",{"type":43,"tag":273,"props":2689,"children":2691},{"className":2690},[],[2692],{"type":49,"value":1907},{"type":49,"value":2694},").",{"type":43,"tag":212,"props":2696,"children":2697},{},[],{"type":43,"tag":94,"props":2699,"children":2701},{"id":2700},"terraform-configuration-requirements",[2702],{"type":49,"value":165},{"type":43,"tag":618,"props":2704,"children":2706},{"id":2705},"terraform-version-requirements",[2707],{"type":49,"value":2708},"Terraform Version Requirements",{"type":43,"tag":52,"props":2710,"children":2711},{},[2712,2716,2717,2721],{"type":43,"tag":61,"props":2713,"children":2714},{},[2715],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2718,"children":2719},{},[2720],{"type":49,"value":234},{"type":49,"value":2722}," TFNFR25",{"type":43,"tag":52,"props":2724,"children":2725},{},[2726],{"type":43,"tag":61,"props":2727,"children":2728},{},[2729,2735],{"type":43,"tag":273,"props":2730,"children":2732},{"className":2731},[],[2733],{"type":49,"value":2734},"terraform.tf",{"type":49,"value":2736}," requirements:",{"type":43,"tag":67,"props":2738,"children":2739},{},[2740,2756,2773,2782,2791],{"type":43,"tag":71,"props":2741,"children":2742},{},[2743,2747,2749,2754],{"type":43,"tag":61,"props":2744,"children":2745},{},[2746],{"type":49,"value":261},{"type":49,"value":2748}," contain only one ",{"type":43,"tag":273,"props":2750,"children":2752},{"className":2751},[],[2753],{"type":49,"value":21},{"type":49,"value":2755}," block",{"type":43,"tag":71,"props":2757,"children":2758},{},[2759,2761,2765,2767],{"type":49,"value":2760},"First line ",{"type":43,"tag":61,"props":2762,"children":2763},{},[2764],{"type":49,"value":261},{"type":49,"value":2766}," define ",{"type":43,"tag":273,"props":2768,"children":2770},{"className":2769},[],[2771],{"type":49,"value":2772},"required_version",{"type":43,"tag":71,"props":2774,"children":2775},{},[2776,2780],{"type":43,"tag":61,"props":2777,"children":2778},{},[2779],{"type":49,"value":261},{"type":49,"value":2781}," include minimum version constraint",{"type":43,"tag":71,"props":2783,"children":2784},{},[2785,2789],{"type":43,"tag":61,"props":2786,"children":2787},{},[2788],{"type":49,"value":261},{"type":49,"value":2790}," include maximum major version constraint",{"type":43,"tag":71,"props":2792,"children":2793},{},[2794,2798,2799,2805,2806,2812],{"type":43,"tag":61,"props":2795,"children":2796},{},[2797],{"type":49,"value":471},{"type":49,"value":455},{"type":43,"tag":273,"props":2800,"children":2802},{"className":2801},[],[2803],{"type":49,"value":2804},"~> #.#",{"type":49,"value":305},{"type":43,"tag":273,"props":2807,"children":2809},{"className":2808},[],[2810],{"type":49,"value":2811},">= #.#.#, \u003C #.#.#",{"type":49,"value":2813}," format",{"type":43,"tag":52,"props":2815,"children":2816},{},[2817],{"type":43,"tag":61,"props":2818,"children":2819},{},[2820],{"type":49,"value":488},{"type":43,"tag":490,"props":2822,"children":2824},{"className":492,"code":2823,"language":494,"meta":495,"style":495},"terraform {\n  required_version = \"~> 1.6\"\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp\u002Fazurerm\"\n      version = \"~> 4.0\"\n    }\n  }\n}\n",[2825],{"type":43,"tag":273,"props":2826,"children":2827},{"__ignoreMap":495},[2828,2835,2843,2850,2857,2864,2871,2878,2885],{"type":43,"tag":501,"props":2829,"children":2830},{"class":503,"line":504},[2831],{"type":43,"tag":501,"props":2832,"children":2833},{},[2834],{"type":49,"value":510},{"type":43,"tag":501,"props":2836,"children":2837},{"class":503,"line":513},[2838],{"type":43,"tag":501,"props":2839,"children":2840},{},[2841],{"type":49,"value":2842},"  required_version = \"~> 1.6\"\n",{"type":43,"tag":501,"props":2844,"children":2845},{"class":503,"line":522},[2846],{"type":43,"tag":501,"props":2847,"children":2848},{},[2849],{"type":49,"value":519},{"type":43,"tag":501,"props":2851,"children":2852},{"class":503,"line":531},[2853],{"type":43,"tag":501,"props":2854,"children":2855},{},[2856],{"type":49,"value":528},{"type":43,"tag":501,"props":2858,"children":2859},{"class":503,"line":540},[2860],{"type":43,"tag":501,"props":2861,"children":2862},{},[2863],{"type":49,"value":537},{"type":43,"tag":501,"props":2865,"children":2866},{"class":503,"line":549},[2867],{"type":43,"tag":501,"props":2868,"children":2869},{},[2870],{"type":49,"value":546},{"type":43,"tag":501,"props":2872,"children":2873},{"class":503,"line":558},[2874],{"type":43,"tag":501,"props":2875,"children":2876},{},[2877],{"type":49,"value":555},{"type":43,"tag":501,"props":2879,"children":2880},{"class":503,"line":567},[2881],{"type":43,"tag":501,"props":2882,"children":2883},{},[2884],{"type":49,"value":599},{"type":43,"tag":501,"props":2886,"children":2887},{"class":503,"line":576},[2888],{"type":43,"tag":501,"props":2889,"children":2890},{},[2891],{"type":49,"value":608},{"type":43,"tag":618,"props":2893,"children":2895},{"id":2894},"providers-in-required_providers",[2896],{"type":49,"value":2897},"Providers in required_providers",{"type":43,"tag":52,"props":2899,"children":2900},{},[2901,2905,2906,2910],{"type":43,"tag":61,"props":2902,"children":2903},{},[2904],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":2907,"children":2908},{},[2909],{"type":49,"value":234},{"type":49,"value":2911}," TFNFR26",{"type":43,"tag":67,"props":2913,"children":2914},{},[2915,2937,2960,2971,2976,2997,3012],{"type":43,"tag":71,"props":2916,"children":2917},{},[2918,2923,2925,2929,2931,2936],{"type":43,"tag":273,"props":2919,"children":2921},{"className":2920},[],[2922],{"type":49,"value":21},{"type":49,"value":2924}," block ",{"type":43,"tag":61,"props":2926,"children":2927},{},[2928],{"type":49,"value":261},{"type":49,"value":2930}," contain ",{"type":43,"tag":273,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":49,"value":461},{"type":49,"value":2755},{"type":43,"tag":71,"props":2938,"children":2939},{},[2940,2942,2946,2948,2953,2955],{"type":49,"value":2941},"Each provider ",{"type":43,"tag":61,"props":2943,"children":2944},{},[2945],{"type":49,"value":261},{"type":49,"value":2947}," specify ",{"type":43,"tag":273,"props":2949,"children":2951},{"className":2950},[],[2952],{"type":49,"value":1090},{"type":49,"value":2954}," and ",{"type":43,"tag":273,"props":2956,"children":2958},{"className":2957},[],[2959],{"type":49,"value":1099},{"type":43,"tag":71,"props":2961,"children":2962},{},[2963,2965,2969],{"type":49,"value":2964},"Providers ",{"type":43,"tag":61,"props":2966,"children":2967},{},[2968],{"type":49,"value":471},{"type":49,"value":2970}," be sorted alphabetically",{"type":43,"tag":71,"props":2972,"children":2973},{},[2974],{"type":49,"value":2975},"Only include directly required providers",{"type":43,"tag":71,"props":2977,"children":2978},{},[2979,2984,2985,2989,2991],{"type":43,"tag":273,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":49,"value":1090},{"type":49,"value":1560},{"type":43,"tag":61,"props":2986,"children":2987},{},[2988],{"type":49,"value":261},{"type":49,"value":2990}," be in format ",{"type":43,"tag":273,"props":2992,"children":2994},{"className":2993},[],[2995],{"type":49,"value":2996},"namespace\u002Fname",{"type":43,"tag":71,"props":2998,"children":2999},{},[3000,3005,3006,3010],{"type":43,"tag":273,"props":3001,"children":3003},{"className":3002},[],[3004],{"type":49,"value":1099},{"type":49,"value":1560},{"type":43,"tag":61,"props":3007,"children":3008},{},[3009],{"type":49,"value":261},{"type":49,"value":3011}," include minimum and maximum major version constraints",{"type":43,"tag":71,"props":3013,"children":3014},{},[3015,3019,3020,3025,3026,3031],{"type":43,"tag":61,"props":3016,"children":3017},{},[3018],{"type":49,"value":471},{"type":49,"value":455},{"type":43,"tag":273,"props":3021,"children":3023},{"className":3022},[],[3024],{"type":49,"value":2804},{"type":49,"value":305},{"type":43,"tag":273,"props":3027,"children":3029},{"className":3028},[],[3030],{"type":49,"value":2811},{"type":49,"value":2813},{"type":43,"tag":212,"props":3033,"children":3034},{},[],{"type":43,"tag":94,"props":3036,"children":3038},{"id":3037},"testing-requirements",[3039],{"type":49,"value":174},{"type":43,"tag":618,"props":3041,"children":3043},{"id":3042},"test-tooling",[3044],{"type":49,"value":3045},"Test Tooling",{"type":43,"tag":52,"props":3047,"children":3048},{},[3049,3053,3054,3058],{"type":43,"tag":61,"props":3050,"children":3051},{},[3052],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":3055,"children":3056},{},[3057],{"type":49,"value":234},{"type":49,"value":3059}," TFNFR5",{"type":43,"tag":52,"props":3061,"children":3062},{},[3063],{"type":43,"tag":61,"props":3064,"children":3065},{},[3066],{"type":49,"value":3067},"Required testing tools for AVM:",{"type":43,"tag":67,"props":3069,"children":3070},{},[3071,3083,3088,3093,3098],{"type":43,"tag":71,"props":3072,"children":3073},{},[3074,3076,3082],{"type":49,"value":3075},"Terraform (",{"type":43,"tag":273,"props":3077,"children":3079},{"className":3078},[],[3080],{"type":49,"value":3081},"terraform validate\u002Ffmt\u002Ftest",{"type":49,"value":313},{"type":43,"tag":71,"props":3084,"children":3085},{},[3086],{"type":49,"value":3087},"terrafmt",{"type":43,"tag":71,"props":3089,"children":3090},{},[3091],{"type":49,"value":3092},"Checkov",{"type":43,"tag":71,"props":3094,"children":3095},{},[3096],{"type":49,"value":3097},"tflint (with azurerm ruleset)",{"type":43,"tag":71,"props":3099,"children":3100},{},[3101],{"type":49,"value":3102},"Go (optional for custom tests)",{"type":43,"tag":618,"props":3104,"children":3106},{"id":3105},"test-provider-configuration",[3107],{"type":49,"value":3108},"Test Provider Configuration",{"type":43,"tag":52,"props":3110,"children":3111},{},[3112,3116,3117,3121],{"type":43,"tag":61,"props":3113,"children":3114},{},[3115],{"type":49,"value":227},{"type":49,"value":699},{"type":43,"tag":61,"props":3118,"children":3119},{},[3120],{"type":49,"value":234},{"type":49,"value":3122}," TFNFR36",{"type":43,"tag":52,"props":3124,"children":3125},{},[3126,3128,3134,3135,3139,3141,3146],{"type":49,"value":3127},"For robust testing, ",{"type":43,"tag":273,"props":3129,"children":3131},{"className":3130},[],[3132],{"type":49,"value":3133},"prevent_deletion_if_contains_resources",{"type":49,"value":1560},{"type":43,"tag":61,"props":3136,"children":3137},{},[3138],{"type":49,"value":471},{"type":49,"value":3140}," be explicitly set to ",{"type":43,"tag":273,"props":3142,"children":3144},{"className":3143},[],[3145],{"type":49,"value":2017},{"type":49,"value":3147}," in test provider configurations.",{"type":43,"tag":212,"props":3149,"children":3150},{},[],{"type":43,"tag":94,"props":3152,"children":3154},{"id":3153},"documentation-requirements",[3155],{"type":49,"value":183},{"type":43,"tag":618,"props":3157,"children":3159},{"id":3158},"module-documentation-generation",[3160],{"type":49,"value":3161},"Module Documentation Generation",{"type":43,"tag":52,"props":3163,"children":3164},{},[3165,3169,3170,3174],{"type":43,"tag":61,"props":3166,"children":3167},{},[3168],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":3171,"children":3172},{},[3173],{"type":49,"value":234},{"type":49,"value":3175}," TFNFR2",{"type":43,"tag":67,"props":3177,"children":3178},{},[3179,3197],{"type":43,"tag":71,"props":3180,"children":3181},{},[3182,3184,3188,3190],{"type":49,"value":3183},"Documentation ",{"type":43,"tag":61,"props":3185,"children":3186},{},[3187],{"type":49,"value":261},{"type":49,"value":3189}," be automatically generated via ",{"type":43,"tag":75,"props":3191,"children":3194},{"href":3192,"rel":3193},"https:\u002F\u002Fgithub.com\u002Fterraform-docs\u002Fterraform-docs",[79],[3195],{"type":49,"value":3196},"Terraform Docs",{"type":43,"tag":71,"props":3198,"children":3199},{},[3200,3202,3208,3210,3214],{"type":49,"value":3201},"A ",{"type":43,"tag":273,"props":3203,"children":3205},{"className":3204},[],[3206],{"type":49,"value":3207},".terraform-docs.yml",{"type":49,"value":3209}," file ",{"type":43,"tag":61,"props":3211,"children":3212},{},[3213],{"type":49,"value":261},{"type":49,"value":3215}," be present in the module root",{"type":43,"tag":212,"props":3217,"children":3218},{},[],{"type":43,"tag":94,"props":3220,"children":3222},{"id":3221},"breaking-changes-feature-management",[3223],{"type":49,"value":192},{"type":43,"tag":618,"props":3225,"children":3227},{"id":3226},"using-feature-toggles",[3228],{"type":49,"value":3229},"Using Feature Toggles",{"type":43,"tag":52,"props":3231,"children":3232},{},[3233,3237,3238,3242],{"type":43,"tag":61,"props":3234,"children":3235},{},[3236],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":3239,"children":3240},{},[3241],{"type":49,"value":234},{"type":49,"value":3243}," TFNFR34",{"type":43,"tag":52,"props":3245,"children":3246},{},[3247,3249,3253],{"type":49,"value":3248},"New resources added in minor\u002Fpatch versions ",{"type":43,"tag":61,"props":3250,"children":3251},{},[3252],{"type":49,"value":261},{"type":49,"value":3254}," have a toggle variable to avoid creation by default:",{"type":43,"tag":490,"props":3256,"children":3258},{"className":492,"code":3257,"language":494,"meta":495,"style":495},"variable \"create_route_table\" {\n  type     = bool\n  default  = false\n  nullable = false\n}\n\nresource \"azurerm_route_table\" \"this\" {\n  count = var.create_route_table ? 1 : 0\n  # ...\n}\n",[3259],{"type":43,"tag":273,"props":3260,"children":3261},{"__ignoreMap":495},[3262,3270,3278,3286,3294,3301,3308,3316,3324,3332],{"type":43,"tag":501,"props":3263,"children":3264},{"class":503,"line":504},[3265],{"type":43,"tag":501,"props":3266,"children":3267},{},[3268],{"type":49,"value":3269},"variable \"create_route_table\" {\n",{"type":43,"tag":501,"props":3271,"children":3272},{"class":503,"line":513},[3273],{"type":43,"tag":501,"props":3274,"children":3275},{},[3276],{"type":49,"value":3277},"  type     = bool\n",{"type":43,"tag":501,"props":3279,"children":3280},{"class":503,"line":522},[3281],{"type":43,"tag":501,"props":3282,"children":3283},{},[3284],{"type":49,"value":3285},"  default  = false\n",{"type":43,"tag":501,"props":3287,"children":3288},{"class":503,"line":531},[3289],{"type":43,"tag":501,"props":3290,"children":3291},{},[3292],{"type":49,"value":3293},"  nullable = false\n",{"type":43,"tag":501,"props":3295,"children":3296},{"class":503,"line":540},[3297],{"type":43,"tag":501,"props":3298,"children":3299},{},[3300],{"type":49,"value":608},{"type":43,"tag":501,"props":3302,"children":3303},{"class":503,"line":549},[3304],{"type":43,"tag":501,"props":3305,"children":3306},{"emptyLinePlaceholder":1432},[3307],{"type":49,"value":1435},{"type":43,"tag":501,"props":3309,"children":3310},{"class":503,"line":558},[3311],{"type":43,"tag":501,"props":3312,"children":3313},{},[3314],{"type":49,"value":3315},"resource \"azurerm_route_table\" \"this\" {\n",{"type":43,"tag":501,"props":3317,"children":3318},{"class":503,"line":567},[3319],{"type":43,"tag":501,"props":3320,"children":3321},{},[3322],{"type":49,"value":3323},"  count = var.create_route_table ? 1 : 0\n",{"type":43,"tag":501,"props":3325,"children":3326},{"class":503,"line":576},[3327],{"type":43,"tag":501,"props":3328,"children":3329},{},[3330],{"type":49,"value":3331},"  # ...\n",{"type":43,"tag":501,"props":3333,"children":3334},{"class":503,"line":585},[3335],{"type":43,"tag":501,"props":3336,"children":3337},{},[3338],{"type":49,"value":608},{"type":43,"tag":618,"props":3340,"children":3342},{"id":3341},"reviewing-potential-breaking-changes",[3343],{"type":49,"value":3344},"Reviewing Potential Breaking Changes",{"type":43,"tag":52,"props":3346,"children":3347},{},[3348,3352,3353,3357],{"type":43,"tag":61,"props":3349,"children":3350},{},[3351],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":3354,"children":3355},{},[3356],{"type":49,"value":234},{"type":49,"value":3358}," TFNFR35",{"type":43,"tag":52,"props":3360,"children":3361},{},[3362],{"type":43,"tag":61,"props":3363,"children":3364},{},[3365],{"type":49,"value":3366},"Breaking changes requiring caution:",{"type":43,"tag":52,"props":3368,"children":3369},{},[3370],{"type":43,"tag":61,"props":3371,"children":3372},{},[3373],{"type":49,"value":3374},"Resource blocks:",{"type":43,"tag":907,"props":3376,"children":3377},{},[3378,3383,3388,3399,3411],{"type":43,"tag":71,"props":3379,"children":3380},{},[3381],{"type":49,"value":3382},"Adding new resource without conditional creation",{"type":43,"tag":71,"props":3384,"children":3385},{},[3386],{"type":49,"value":3387},"Adding arguments with non-default values",{"type":43,"tag":71,"props":3389,"children":3390},{},[3391,3393],{"type":49,"value":3392},"Adding nested blocks without ",{"type":43,"tag":273,"props":3394,"children":3396},{"className":3395},[],[3397],{"type":49,"value":3398},"dynamic",{"type":43,"tag":71,"props":3400,"children":3401},{},[3402,3404,3410],{"type":49,"value":3403},"Renaming resources without ",{"type":43,"tag":273,"props":3405,"children":3407},{"className":3406},[],[3408],{"type":49,"value":3409},"moved",{"type":49,"value":2601},{"type":43,"tag":71,"props":3412,"children":3413},{},[3414,3416,3421,3423,3428],{"type":49,"value":3415},"Changing ",{"type":43,"tag":273,"props":3417,"children":3419},{"className":3418},[],[3420],{"type":49,"value":764},{"type":49,"value":3422}," to ",{"type":43,"tag":273,"props":3424,"children":3426},{"className":3425},[],[3427],{"type":49,"value":795},{"type":49,"value":3429}," or vice versa",{"type":43,"tag":52,"props":3431,"children":3432},{},[3433],{"type":43,"tag":61,"props":3434,"children":3435},{},[3436],{"type":49,"value":3437},"Variable\u002FOutput blocks:",{"type":43,"tag":907,"props":3439,"children":3440},{},[3441,3446,3456,3468,3480,3492,3502,3507,3518],{"type":43,"tag":71,"props":3442,"children":3443},{},[3444],{"type":49,"value":3445},"Deleting\u002Frenaming variables",{"type":43,"tag":71,"props":3447,"children":3448},{},[3449,3451],{"type":49,"value":3450},"Changing variable ",{"type":43,"tag":273,"props":3452,"children":3454},{"className":3453},[],[3455],{"type":49,"value":1852},{"type":43,"tag":71,"props":3457,"children":3458},{},[3459,3460,3466],{"type":49,"value":3450},{"type":43,"tag":273,"props":3461,"children":3463},{"className":3462},[],[3464],{"type":49,"value":3465},"default",{"type":49,"value":3467}," values",{"type":43,"tag":71,"props":3469,"children":3470},{},[3471,3472,3478],{"type":49,"value":3415},{"type":43,"tag":273,"props":3473,"children":3475},{"className":3474},[],[3476],{"type":49,"value":3477},"nullable",{"type":49,"value":3479}," to false",{"type":43,"tag":71,"props":3481,"children":3482},{},[3483,3484,3490],{"type":49,"value":3415},{"type":43,"tag":273,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":49,"value":3489},"sensitive",{"type":49,"value":3491}," from false to true",{"type":43,"tag":71,"props":3493,"children":3494},{},[3495,3497],{"type":49,"value":3496},"Adding variables without ",{"type":43,"tag":273,"props":3498,"children":3500},{"className":3499},[],[3501],{"type":49,"value":3465},{"type":43,"tag":71,"props":3503,"children":3504},{},[3505],{"type":49,"value":3506},"Deleting outputs",{"type":43,"tag":71,"props":3508,"children":3509},{},[3510,3512],{"type":49,"value":3511},"Changing output ",{"type":43,"tag":273,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":49,"value":3517},"value",{"type":43,"tag":71,"props":3519,"children":3520},{},[3521,3522,3527],{"type":49,"value":3511},{"type":43,"tag":273,"props":3523,"children":3525},{"className":3524},[],[3526],{"type":49,"value":3489},{"type":49,"value":3528}," value",{"type":43,"tag":212,"props":3530,"children":3531},{},[],{"type":43,"tag":94,"props":3533,"children":3535},{"id":3534},"contribution-standards",[3536],{"type":49,"value":201},{"type":43,"tag":618,"props":3538,"children":3540},{"id":3539},"github-repository-branch-protection",[3541],{"type":49,"value":3542},"GitHub Repository Branch Protection",{"type":43,"tag":52,"props":3544,"children":3545},{},[3546,3550,3551,3555],{"type":43,"tag":61,"props":3547,"children":3548},{},[3549],{"type":49,"value":227},{"type":49,"value":229},{"type":43,"tag":61,"props":3552,"children":3553},{},[3554],{"type":49,"value":234},{"type":49,"value":3556}," TFNFR3",{"type":43,"tag":52,"props":3558,"children":3559},{},[3560,3561,3565,3567,3573],{"type":49,"value":1639},{"type":43,"tag":61,"props":3562,"children":3563},{},[3564],{"type":49,"value":261},{"type":49,"value":3566}," set branch protection policies on the default branch (typically ",{"type":43,"tag":273,"props":3568,"children":3570},{"className":3569},[],[3571],{"type":49,"value":3572},"main",{"type":49,"value":3574},"):",{"type":43,"tag":907,"props":3576,"children":3577},{},[3578,3583,3588,3593,3598,3603,3608,3613,3618],{"type":43,"tag":71,"props":3579,"children":3580},{},[3581],{"type":49,"value":3582},"Require Pull Request before merging",{"type":43,"tag":71,"props":3584,"children":3585},{},[3586],{"type":49,"value":3587},"Require approval of most recent reviewable push",{"type":43,"tag":71,"props":3589,"children":3590},{},[3591],{"type":49,"value":3592},"Dismiss stale PR approvals when new commits are pushed",{"type":43,"tag":71,"props":3594,"children":3595},{},[3596],{"type":49,"value":3597},"Require linear history",{"type":43,"tag":71,"props":3599,"children":3600},{},[3601],{"type":49,"value":3602},"Prevent force pushes",{"type":43,"tag":71,"props":3604,"children":3605},{},[3606],{"type":49,"value":3607},"Not allow deletions",{"type":43,"tag":71,"props":3609,"children":3610},{},[3611],{"type":49,"value":3612},"Require CODEOWNERS review",{"type":43,"tag":71,"props":3614,"children":3615},{},[3616],{"type":49,"value":3617},"No bypassing settings allowed",{"type":43,"tag":71,"props":3619,"children":3620},{},[3621],{"type":49,"value":3622},"Enforce for administrators",{"type":43,"tag":212,"props":3624,"children":3625},{},[],{"type":43,"tag":94,"props":3627,"children":3629},{"id":3628},"compliance-checklist",[3630],{"type":49,"value":210},{"type":43,"tag":52,"props":3632,"children":3633},{},[3634],{"type":49,"value":3635},"Use this checklist when developing or reviewing Azure Verified Modules:",{"type":43,"tag":618,"props":3637,"children":3639},{"id":3638},"module-structure",[3640],{"type":49,"value":3641},"Module Structure",{"type":43,"tag":67,"props":3643,"children":3646},{"className":3644},[3645],"contains-task-list",[3647,3659,3668,3683],{"type":43,"tag":71,"props":3648,"children":3651},{"className":3649},[3650],"task-list-item",[3652,3657],{"type":43,"tag":3653,"props":3654,"children":3656},"input",{"disabled":1432,"type":3655},"checkbox",[],{"type":49,"value":3658}," Module cross-references use registry sources with pinned versions",{"type":43,"tag":71,"props":3660,"children":3662},{"className":3661},[3650],[3663,3666],{"type":43,"tag":3653,"props":3664,"children":3665},{"disabled":1432,"type":3655},[],{"type":49,"value":3667}," Azure providers (azurerm\u002Fazapi) versions meet AVM requirements",{"type":43,"tag":71,"props":3669,"children":3671},{"className":3670},[3650],[3672,3675,3676,3681],{"type":43,"tag":3653,"props":3673,"children":3674},{"disabled":1432,"type":3655},[],{"type":49,"value":1560},{"type":43,"tag":273,"props":3677,"children":3679},{"className":3678},[],[3680],{"type":49,"value":3207},{"type":49,"value":3682}," present in module root",{"type":43,"tag":71,"props":3684,"children":3686},{"className":3685},[3650],[3687,3690],{"type":43,"tag":3653,"props":3688,"children":3689},{"disabled":1432,"type":3655},[],{"type":49,"value":3691}," CODEOWNERS file present",{"type":43,"tag":618,"props":3693,"children":3695},{"id":3694},"code-style",[3696],{"type":49,"value":3697},"Code Style",{"type":43,"tag":67,"props":3699,"children":3701},{"className":3700},[3645],[3702,3711,3720,3750,3759,3774,3783],{"type":43,"tag":71,"props":3703,"children":3705},{"className":3704},[3650],[3706,3709],{"type":43,"tag":3653,"props":3707,"children":3708},{"disabled":1432,"type":3655},[],{"type":49,"value":3710}," All names use lower snake_casing",{"type":43,"tag":71,"props":3712,"children":3714},{"className":3713},[3650],[3715,3718],{"type":43,"tag":3653,"props":3716,"children":3717},{"disabled":1432,"type":3655},[],{"type":49,"value":3719}," Resources ordered with dependencies first",{"type":43,"tag":71,"props":3721,"children":3723},{"className":3722},[3650],[3724,3727,3728,3733,3735,3741,3742,3748],{"type":43,"tag":3653,"props":3725,"children":3726},{"disabled":1432,"type":3655},[],{"type":49,"value":1560},{"type":43,"tag":273,"props":3729,"children":3731},{"className":3730},[],[3732],{"type":49,"value":795},{"type":49,"value":3734}," uses ",{"type":43,"tag":273,"props":3736,"children":3738},{"className":3737},[],[3739],{"type":49,"value":3740},"map()",{"type":49,"value":305},{"type":43,"tag":273,"props":3743,"children":3745},{"className":3744},[],[3746],{"type":49,"value":3747},"set()",{"type":49,"value":3749}," with static keys",{"type":43,"tag":71,"props":3751,"children":3753},{"className":3752},[3650],[3754,3757],{"type":43,"tag":3653,"props":3755,"children":3756},{"disabled":1432,"type":3655},[],{"type":49,"value":3758}," Resource\u002Fdata\u002Fmodule blocks follow proper internal ordering",{"type":43,"tag":71,"props":3760,"children":3762},{"className":3761},[3650],[3763,3766,3767,3772],{"type":43,"tag":3653,"props":3764,"children":3765},{"disabled":1432,"type":3655},[],{"type":49,"value":1560},{"type":43,"tag":273,"props":3768,"children":3770},{"className":3769},[],[3771],{"type":49,"value":1025},{"type":49,"value":3773}," not quoted",{"type":43,"tag":71,"props":3775,"children":3777},{"className":3776},[3650],[3778,3781],{"type":43,"tag":3653,"props":3779,"children":3780},{"disabled":1432,"type":3655},[],{"type":49,"value":3782}," Dynamic blocks used for conditional nested objects",{"type":43,"tag":71,"props":3784,"children":3786},{"className":3785},[3650],[3787,3790,3791,3797,3798,3804],{"type":43,"tag":3653,"props":3788,"children":3789},{"disabled":1432,"type":3655},[],{"type":49,"value":1560},{"type":43,"tag":273,"props":3792,"children":3794},{"className":3793},[],[3795],{"type":49,"value":3796},"coalesce()",{"type":49,"value":305},{"type":43,"tag":273,"props":3799,"children":3801},{"className":3800},[],[3802],{"type":49,"value":3803},"try()",{"type":49,"value":3805}," used for default values",{"type":43,"tag":618,"props":3807,"children":3809},{"id":3808},"variables",[3810],{"type":49,"value":659},{"type":43,"tag":67,"props":3812,"children":3814},{"className":3813},[3645],[3815,3837,3846,3861,3870,3885,3900,3909],{"type":43,"tag":71,"props":3816,"children":3818},{"className":3817},[3650],[3819,3822,3824,3829,3830,3835],{"type":43,"tag":3653,"props":3820,"children":3821},{"disabled":1432,"type":3655},[],{"type":49,"value":3823}," No ",{"type":43,"tag":273,"props":3825,"children":3827},{"className":3826},[],[3828],{"type":49,"value":1651},{"type":49,"value":305},{"type":43,"tag":273,"props":3831,"children":3833},{"className":3832},[],[3834],{"type":49,"value":1658},{"type":49,"value":3836}," variables",{"type":43,"tag":71,"props":3838,"children":3840},{"className":3839},[3650],[3841,3844],{"type":43,"tag":3653,"props":3842,"children":3843},{"disabled":1432,"type":3655},[],{"type":49,"value":3845}," Variables ordered: required (alphabetical) then optional (alphabetical)",{"type":43,"tag":71,"props":3847,"children":3849},{"className":3848},[3650],[3850,3853,3855,3860],{"type":43,"tag":3653,"props":3851,"children":3852},{"disabled":1432,"type":3655},[],{"type":49,"value":3854}," All variables have precise types (avoid ",{"type":43,"tag":273,"props":3856,"children":3858},{"className":3857},[],[3859],{"type":49,"value":1883},{"type":49,"value":313},{"type":43,"tag":71,"props":3862,"children":3864},{"className":3863},[3650],[3865,3868],{"type":43,"tag":3653,"props":3866,"children":3867},{"disabled":1432,"type":3655},[],{"type":49,"value":3869}," All variables have descriptions",{"type":43,"tag":71,"props":3871,"children":3873},{"className":3872},[3650],[3874,3877,3879],{"type":43,"tag":3653,"props":3875,"children":3876},{"disabled":1432,"type":3655},[],{"type":49,"value":3878}," Collections have ",{"type":43,"tag":273,"props":3880,"children":3882},{"className":3881},[],[3883],{"type":49,"value":3884},"nullable = false",{"type":43,"tag":71,"props":3886,"children":3888},{"className":3887},[3650],[3889,3892,3893,3898],{"type":43,"tag":3653,"props":3890,"children":3891},{"disabled":1432,"type":3655},[],{"type":49,"value":3823},{"type":43,"tag":273,"props":3894,"children":3896},{"className":3895},[],[3897],{"type":49,"value":2084},{"type":49,"value":3899}," declarations",{"type":43,"tag":71,"props":3901,"children":3903},{"className":3902},[3650],[3904,3907],{"type":43,"tag":3653,"props":3905,"children":3906},{"disabled":1432,"type":3655},[],{"type":49,"value":3908}," No default values for sensitive inputs",{"type":43,"tag":71,"props":3910,"children":3912},{"className":3911},[3650],[3913,3916,3918],{"type":43,"tag":3653,"props":3914,"children":3915},{"disabled":1432,"type":3655},[],{"type":49,"value":3917}," Deprecated variables moved to ",{"type":43,"tag":273,"props":3919,"children":3921},{"className":3920},[],[3922],{"type":49,"value":2156},{"type":43,"tag":618,"props":3924,"children":3926},{"id":3925},"outputs",[3927],{"type":49,"value":664},{"type":43,"tag":67,"props":3929,"children":3931},{"className":3930},[3645],[3932,3941,3955],{"type":43,"tag":71,"props":3933,"children":3935},{"className":3934},[3650],[3936,3939],{"type":43,"tag":3653,"props":3937,"children":3938},{"disabled":1432,"type":3655},[],{"type":49,"value":3940}," Outputs use anti-corruption layer pattern (discrete attributes)",{"type":43,"tag":71,"props":3942,"children":3944},{"className":3943},[3650],[3945,3948,3950],{"type":43,"tag":3653,"props":3946,"children":3947},{"disabled":1432,"type":3655},[],{"type":49,"value":3949}," Sensitive outputs marked ",{"type":43,"tag":273,"props":3951,"children":3953},{"className":3952},[],[3954],{"type":49,"value":1978},{"type":43,"tag":71,"props":3956,"children":3958},{"className":3957},[3650],[3959,3962,3964],{"type":43,"tag":3653,"props":3960,"children":3961},{"disabled":1432,"type":3655},[],{"type":49,"value":3963}," Deprecated outputs moved to ",{"type":43,"tag":273,"props":3965,"children":3967},{"className":3966},[],[3968],{"type":49,"value":2530},{"type":43,"tag":618,"props":3970,"children":3972},{"id":3971},"terraform-configuration",[3973],{"type":49,"value":3974},"Terraform Configuration",{"type":43,"tag":67,"props":3976,"children":3978},{"className":3977},[3645],[3979,4001,4016,4031],{"type":43,"tag":71,"props":3980,"children":3982},{"className":3981},[3650],[3983,3986,3987,3992,3994,3999],{"type":43,"tag":3653,"props":3984,"children":3985},{"disabled":1432,"type":3655},[],{"type":49,"value":1560},{"type":43,"tag":273,"props":3988,"children":3990},{"className":3989},[],[3991],{"type":49,"value":2734},{"type":49,"value":3993}," has version constraints (",{"type":43,"tag":273,"props":3995,"children":3997},{"className":3996},[],[3998],{"type":49,"value":479},{"type":49,"value":4000}," format)",{"type":43,"tag":71,"props":4002,"children":4004},{"className":4003},[3650],[4005,4008,4009,4014],{"type":43,"tag":3653,"props":4006,"children":4007},{"disabled":1432,"type":3655},[],{"type":49,"value":1560},{"type":43,"tag":273,"props":4010,"children":4012},{"className":4011},[],[4013],{"type":49,"value":461},{"type":49,"value":4015}," block present with all providers",{"type":43,"tag":71,"props":4017,"children":4019},{"className":4018},[3650],[4020,4023,4024,4029],{"type":43,"tag":3653,"props":4021,"children":4022},{"disabled":1432,"type":3655},[],{"type":49,"value":3823},{"type":43,"tag":273,"props":4025,"children":4027},{"className":4026},[],[4028],{"type":49,"value":931},{"type":49,"value":4030}," declarations in module (except aliases)",{"type":43,"tag":71,"props":4032,"children":4034},{"className":4033},[3650],[4035,4038],{"type":43,"tag":3653,"props":4036,"children":4037},{"disabled":1432,"type":3655},[],{"type":49,"value":4039}," Locals arranged alphabetically",{"type":43,"tag":618,"props":4041,"children":4043},{"id":4042},"testing-quality",[4044],{"type":49,"value":4045},"Testing & Quality",{"type":43,"tag":67,"props":4047,"children":4049},{"className":4048},[3645],[4050,4059,4068],{"type":43,"tag":71,"props":4051,"children":4053},{"className":4052},[3650],[4054,4057],{"type":43,"tag":3653,"props":4055,"children":4056},{"disabled":1432,"type":3655},[],{"type":49,"value":4058}," Required testing tools configured",{"type":43,"tag":71,"props":4060,"children":4062},{"className":4061},[3650],[4063,4066],{"type":43,"tag":3653,"props":4064,"children":4065},{"disabled":1432,"type":3655},[],{"type":49,"value":4067}," New resources have feature toggles",{"type":43,"tag":71,"props":4069,"children":4071},{"className":4070},[3650],[4072,4075],{"type":43,"tag":3653,"props":4073,"children":4074},{"disabled":1432,"type":3655},[],{"type":49,"value":4076}," Breaking changes reviewed and documented",{"type":43,"tag":212,"props":4078,"children":4079},{},[],{"type":43,"tag":94,"props":4081,"children":4083},{"id":4082},"summary-statistics",[4084],{"type":49,"value":4085},"Summary Statistics",{"type":43,"tag":67,"props":4087,"children":4088},{},[4089,4099,4109],{"type":43,"tag":71,"props":4090,"children":4091},{},[4092,4097],{"type":43,"tag":61,"props":4093,"children":4094},{},[4095],{"type":49,"value":4096},"Functional Requirements:",{"type":49,"value":4098}," 3",{"type":43,"tag":71,"props":4100,"children":4101},{},[4102,4107],{"type":43,"tag":61,"props":4103,"children":4104},{},[4105],{"type":49,"value":4106},"Non-Functional Requirements:",{"type":49,"value":4108}," 34",{"type":43,"tag":71,"props":4110,"children":4111},{},[4112,4117],{"type":43,"tag":61,"props":4113,"children":4114},{},[4115],{"type":49,"value":4116},"Total Requirements:",{"type":49,"value":4118}," 37",{"type":43,"tag":618,"props":4120,"children":4122},{"id":4121},"by-severity",[4123],{"type":49,"value":4124},"By Severity",{"type":43,"tag":67,"props":4126,"children":4127},{},[4128,4138,4148],{"type":43,"tag":71,"props":4129,"children":4130},{},[4131,4136],{"type":43,"tag":61,"props":4132,"children":4133},{},[4134],{"type":49,"value":4135},"MUST:",{"type":49,"value":4137}," 21 requirements",{"type":43,"tag":71,"props":4139,"children":4140},{},[4141,4146],{"type":43,"tag":61,"props":4142,"children":4143},{},[4144],{"type":49,"value":4145},"SHOULD:",{"type":49,"value":4147}," 14 requirements",{"type":43,"tag":71,"props":4149,"children":4150},{},[4151,4156],{"type":43,"tag":61,"props":4152,"children":4153},{},[4154],{"type":49,"value":4155},"MAY:",{"type":49,"value":4157}," 2 requirements",{"type":43,"tag":212,"props":4159,"children":4160},{},[],{"type":43,"tag":52,"props":4162,"children":4163},{},[4164],{"type":43,"tag":2236,"props":4165,"children":4166},{},[4167],{"type":49,"value":4168},"Based on: Azure Verified Modules - Terraform Requirements",{"type":43,"tag":4170,"props":4171,"children":4172},"style",{},[4173],{"type":49,"value":4174},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4176,"total":2426},[4177,4194,4204,4211,4225,4237,4251],{"slug":4178,"name":4178,"fn":4179,"description":4180,"org":4181,"tags":4182,"stars":25,"repoUrl":26,"updatedAt":4193},"aws-ami-builder","build Amazon Machine Images with Packer","Build Amazon Machine Images (AMIs) with Packer using the amazon-ebs builder. Use when creating custom AMIs for EC2 instances.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4183,4186,4189,4190],{"name":4184,"slug":4185,"type":15},"AWS","aws",{"name":4187,"slug":4188,"type":15},"Deployment","deployment",{"name":23,"slug":24,"type":15},{"name":4191,"slug":4192,"type":15},"Packer","packer","2026-04-06T18:25:04.01571",{"slug":4195,"name":4195,"fn":4196,"description":4197,"org":4198,"tags":4199,"stars":25,"repoUrl":26,"updatedAt":4203},"azure-image-builder","build Azure managed images with Packer","Build Azure managed images and Azure Compute Gallery images with Packer. Use when creating custom images for Azure VMs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4200,4201,4202],{"name":13,"slug":14,"type":15},{"name":4187,"slug":4188,"type":15},{"name":4191,"slug":4192,"type":15},"2026-04-06T18:25:06.590174",{"slug":4,"name":4,"fn":5,"description":6,"org":4205,"tags":4206,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4207,4208,4209,4210],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":4212,"name":4212,"fn":4213,"description":4214,"org":4215,"tags":4216,"stars":25,"repoUrl":26,"updatedAt":4224},"new-terraform-provider","scaffold new Terraform providers","Use this when scaffolding a new Terraform provider.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4217,4220,4223],{"name":4218,"slug":4219,"type":15},"Plugin Development","plugin-development",{"name":4221,"slug":4222,"type":15},"Templates","templates",{"name":20,"slug":21,"type":15},"2026-04-06T18:25:11.814973",{"slug":4226,"name":4226,"fn":4227,"description":4228,"org":4229,"tags":4230,"stars":25,"repoUrl":26,"updatedAt":4236},"provider-actions","implement Terraform Provider lifecycle actions","Implement Terraform Provider actions using the Plugin Framework. Use when developing imperative operations that execute at lifecycle events (before\u002Fafter create, update, destroy).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4231,4234,4235],{"name":4232,"slug":4233,"type":15},"API Development","api-development",{"name":4218,"slug":4219,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:07.880533",{"slug":4238,"name":4238,"fn":4239,"description":4240,"org":4241,"tags":4242,"stars":25,"repoUrl":26,"updatedAt":4250},"provider-docs","generate and review Terraform provider documentation","Create, update, and review Terraform provider documentation for Terraform Registry using HashiCorp-recommended patterns, tfplugindocs templates, and schema descriptions. Use when adding or changing provider configuration, resources, data sources, ephemeral resources, list resources, functions, or guides; when validating generated docs; and when troubleshooting missing or incorrect Registry documentation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4243,4246,4249],{"name":4244,"slug":4245,"type":15},"Documentation","documentation",{"name":4247,"slug":4248,"type":15},"Technical Writing","technical-writing",{"name":20,"slug":21,"type":15},"2026-04-06T18:25:09.261559",{"slug":4252,"name":4252,"fn":4253,"description":4254,"org":4255,"tags":4256,"stars":25,"repoUrl":26,"updatedAt":4260},"provider-resources","implement Terraform Provider resources and data sources","Implement Terraform Provider resources and data sources using the Plugin Framework. Use when developing CRUD operations, schema design, state management, and acceptance testing for provider resources.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4257,4258,4259],{"name":4232,"slug":4233,"type":15},{"name":4218,"slug":4219,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:10.56237",{"items":4262,"total":2435},[4263,4270,4276,4283,4289,4295,4301,4307,4322,4337,4349,4360],{"slug":4178,"name":4178,"fn":4179,"description":4180,"org":4264,"tags":4265,"stars":25,"repoUrl":26,"updatedAt":4193},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4266,4267,4268,4269],{"name":4184,"slug":4185,"type":15},{"name":4187,"slug":4188,"type":15},{"name":23,"slug":24,"type":15},{"name":4191,"slug":4192,"type":15},{"slug":4195,"name":4195,"fn":4196,"description":4197,"org":4271,"tags":4272,"stars":25,"repoUrl":26,"updatedAt":4203},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4273,4274,4275],{"name":13,"slug":14,"type":15},{"name":4187,"slug":4188,"type":15},{"name":4191,"slug":4192,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":4277,"tags":4278,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4279,4280,4281,4282],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"slug":4212,"name":4212,"fn":4213,"description":4214,"org":4284,"tags":4285,"stars":25,"repoUrl":26,"updatedAt":4224},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4286,4287,4288],{"name":4218,"slug":4219,"type":15},{"name":4221,"slug":4222,"type":15},{"name":20,"slug":21,"type":15},{"slug":4226,"name":4226,"fn":4227,"description":4228,"org":4290,"tags":4291,"stars":25,"repoUrl":26,"updatedAt":4236},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4292,4293,4294],{"name":4232,"slug":4233,"type":15},{"name":4218,"slug":4219,"type":15},{"name":20,"slug":21,"type":15},{"slug":4238,"name":4238,"fn":4239,"description":4240,"org":4296,"tags":4297,"stars":25,"repoUrl":26,"updatedAt":4250},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4298,4299,4300],{"name":4244,"slug":4245,"type":15},{"name":4247,"slug":4248,"type":15},{"name":20,"slug":21,"type":15},{"slug":4252,"name":4252,"fn":4253,"description":4254,"org":4302,"tags":4303,"stars":25,"repoUrl":26,"updatedAt":4260},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4304,4305,4306],{"name":4232,"slug":4233,"type":15},{"name":4218,"slug":4219,"type":15},{"name":20,"slug":21,"type":15},{"slug":4308,"name":4308,"fn":4309,"description":4310,"org":4311,"tags":4312,"stars":25,"repoUrl":26,"updatedAt":4321},"provider-test-patterns","implement Terraform provider acceptance test patterns","Terraform provider acceptance test patterns using terraform-plugin-testing with the Plugin Framework. Covers test structure, TestCase\u002FTestStep fields, ConfigStateChecks with custom statecheck.StateCheck implementations, plan checks, CompareValue for cross-step assertions, config helpers, import testing with ImportStateKind, sweepers, and scenario patterns (basic, update, disappears, validation, regression), and ephemeral resource testing with the echoprovider package. Use when writing, reviewing, or debugging provider acceptance tests, including questions about statecheck, plancheck, TestCheckFunc, CheckDestroy, ExpectError, import state verification, ephemeral resources, or how to structure test files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4313,4314,4317,4318],{"name":4218,"slug":4219,"type":15},{"name":4315,"slug":4316,"type":15},"QA","qa",{"name":20,"slug":21,"type":15},{"name":4319,"slug":4320,"type":15},"Testing","testing","2026-04-06T18:25:14.352781",{"slug":4323,"name":4323,"fn":4324,"description":4325,"org":4326,"tags":4327,"stars":25,"repoUrl":26,"updatedAt":4336},"push-to-registry","push Packer build metadata to HCP registry","Push Packer build metadata to HCP Packer registry for tracking and managing image lifecycle. Use when integrating Packer builds with HCP Packer for version control and governance.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4328,4329,4332,4335],{"name":4187,"slug":4188,"type":15},{"name":4330,"slug":4331,"type":15},"Governance","governance",{"name":4333,"slug":4334,"type":15},"HCP","hcp",{"name":4191,"slug":4192,"type":15},"2026-04-06T18:25:02.749563",{"slug":4338,"name":4338,"fn":4339,"description":4340,"org":4341,"tags":4342,"stars":25,"repoUrl":26,"updatedAt":4348},"refactor-module","refactor Terraform configurations into reusable modules","Transform monolithic Terraform configurations into reusable, maintainable modules following HashiCorp's module design principles and community best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4343,4346,4347],{"name":4344,"slug":4345,"type":15},"Architecture","architecture",{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:20.953737",{"slug":4350,"name":4350,"fn":4351,"description":4352,"org":4353,"tags":4354,"stars":25,"repoUrl":26,"updatedAt":4359},"run-acceptance-tests","run acceptance tests for Terraform providers","Guide for running acceptance tests for a Terraform provider. Use this when asked to run an acceptance test or to run a test with the prefix `TestAcc`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4355,4356,4357,4358],{"name":4218,"slug":4219,"type":15},{"name":4315,"slug":4316,"type":15},{"name":20,"slug":21,"type":15},{"name":4319,"slug":4320,"type":15},"2026-04-06T18:25:13.098191",{"slug":4361,"name":4361,"fn":4362,"description":4363,"org":4364,"tags":4365,"stars":25,"repoUrl":26,"updatedAt":4372},"terraform-policy","write and test Terraform policy files","Write, test, or convert Terraform Policy files (.policy.hcl, .policytest.hcl, Sentinel→tfpolicy). Triggers: policy.hcl, policytest, convert sentinel, tfpolicy, write a policy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4366,4367,4368,4371],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":4369,"slug":4370,"type":15},"Security","security",{"name":20,"slug":21,"type":15},"2026-07-18T05:48:20.299442"]