[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-hashicorp-terraform-style-guide":3,"mdc-9ygx12-key":37,"related-org-hashicorp-terraform-style-guide":2157,"related-repo-hashicorp-terraform-style-guide":2315},{"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},"terraform-style-guide","generate idiomatic Terraform HCL code","Generate Terraform HCL code following HashiCorp's official style conventions and best practices. Use when writing, reviewing, or generating Terraform configurations.",{"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},"Documentation","documentation","tag",{"name":17,"slug":18,"type":15},"Terraform","terraform",{"name":20,"slug":21,"type":15},"Cloud","cloud",{"name":23,"slug":24,"type":15},"Infrastructure as Code","infrastructure-as-code",728,"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fagent-skills","2026-04-06T18:25:18.394192",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\u002Fterraform-style-guide","---\nname: terraform-style-guide\ndescription: Generate Terraform HCL code following HashiCorp's official style conventions and best practices. Use when writing, reviewing, or generating Terraform configurations.\n---\n\n# Terraform Style Guide\n\nGenerate and maintain Terraform code following HashiCorp's official style conventions and best practices.\n\n**Reference:** [HashiCorp Terraform Style Guide](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Flanguage\u002Fstyle)\n\n## Code Generation Strategy\n\nWhen generating Terraform code:\n\n1. Start with provider configuration and version constraints\n2. Create data sources before dependent resources\n3. Build resources in dependency order\n4. Add outputs for key resource attributes\n5. Use variables for all configurable values\n\n## File Organization\n\n| File | Purpose |\n|------|---------|\n| `terraform.tf` | Terraform and provider version requirements |\n| `providers.tf` | Provider configurations |\n| `main.tf` | Primary resources and data sources |\n| `variables.tf` | Input variable declarations (alphabetical) |\n| `outputs.tf` | Output value declarations (alphabetical) |\n| `locals.tf` | Local value declarations |\n\n### Example Structure\n\n```hcl\n# terraform.tf\nterraform {\n  required_version = \">= 1.14\"\n\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 6.0\"\n    }\n  }\n}\n\n# variables.tf\nvariable \"environment\" {\n  description = \"Target deployment environment\"\n  type        = string\n\n  validation {\n    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)\n    error_message = \"Environment must be dev, staging, or prod.\"\n  }\n}\n\n# locals.tf\nlocals {\n  common_tags = {\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n  }\n}\n\n# main.tf\nresource \"aws_vpc\" \"main\" {\n  cidr_block           = var.vpc_cidr\n  enable_dns_hostnames = true\n\n  tags = merge(local.common_tags, {\n    Name = \"${var.project_name}-${var.environment}-vpc\"\n  })\n}\n\n# outputs.tf\noutput \"vpc_id\" {\n  description = \"ID of the created VPC\"\n  value       = aws_vpc.main.id\n}\n```\n\n## Code Formatting\n\n### Indentation and Alignment\n\n- Use **two spaces** per nesting level (no tabs)\n- Align equals signs for consecutive arguments\n\n```hcl\nresource \"aws_instance\" \"web\" {\n  ami           = \"ami-0c55b159cbfafe1f0\"\n  instance_type = \"t2.micro\"\n  subnet_id     = \"subnet-12345678\"\n\n  tags = {\n    Name        = \"web-server\"\n    Environment = \"production\"\n  }\n}\n```\n\n### Block Organization\n\nArguments precede blocks, with meta-arguments first:\n\n```hcl\nresource \"aws_instance\" \"example\" {\n  # Meta-arguments\n  count = 3\n\n  # Arguments\n  ami           = \"ami-0c55b159cbfafe1f0\"\n  instance_type = \"t2.micro\"\n\n  # Blocks\n  root_block_device {\n    volume_size = 20\n  }\n\n  # Lifecycle last\n  lifecycle {\n    create_before_destroy = true\n  }\n}\n```\n\n## Naming Conventions\n\n- Use **lowercase with underscores** for all names\n- Use **descriptive nouns** excluding the resource type\n- Be specific and meaningful\n- Resource names must be singular, not plural\n- Default to `main` for resources where a specific descriptive name is redundant or unavailable, provided only one instance exists\n\n```hcl\n# Bad\nresource \"aws_instance\" \"webAPI-aws-instance\" {}\nresource \"aws_instance\" \"web_apis\" {}\nvariable \"name\" {}\n\n# Good\nresource \"aws_instance\" \"web_api\" {}\nresource \"aws_vpc\" \"main\" {}\nvariable \"application_name\" {}\n```\n\n## Variables\n\nEvery variable must include `type` and `description`:\n\n```hcl\nvariable \"instance_type\" {\n  description = \"EC2 instance type for the web server\"\n  type        = string\n  default     = \"t2.micro\"\n\n  validation {\n    condition     = contains([\"t2.micro\", \"t2.small\", \"t2.medium\"], var.instance_type)\n    error_message = \"Instance type must be t2.micro, t2.small, or t2.medium.\"\n  }\n}\n\nvariable \"database_password\" {\n  description = \"Password for the database admin user\"\n  type        = string\n  sensitive   = true\n}\n```\n\n## Outputs\n\nEvery output must include `description`:\n\n```hcl\noutput \"instance_id\" {\n  description = \"ID of the EC2 instance\"\n  value       = aws_instance.web.id\n}\n\noutput \"database_password\" {\n  description = \"Database administrator password\"\n  value       = aws_db_instance.main.password\n  sensitive   = true\n}\n```\n\n## Dynamic Resource Creation\n\n### Prefer for_each over count\n\n```hcl\n# Bad - count for multiple resources\nresource \"aws_instance\" \"web\" {\n  count = var.instance_count\n  tags  = { Name = \"web-${count.index}\" }\n}\n\n# Good - for_each with named instances\nvariable \"instance_names\" {\n  type    = set(string)\n  default = [\"web-1\", \"web-2\", \"web-3\"]\n}\n\nresource \"aws_instance\" \"web\" {\n  for_each = var.instance_names\n  tags     = { Name = each.key }\n}\n```\n\n### count for Conditional Creation\n\n```hcl\nresource \"aws_cloudwatch_metric_alarm\" \"cpu\" {\n  count = var.enable_monitoring ? 1 : 0\n\n  alarm_name = \"high-cpu-usage\"\n  threshold  = 80\n}\n```\n\n## Security Best Practices\n\nRefer to SECURITY.md. It includes guidance on encrypting resources,\npreventing sensitive data in state, and secure configurations.\n\n## Version Pinning\n\n```hcl\nterraform {\n  required_version = \">= 1.14\"\n\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 6.0\"\n    }\n  }\n}\n```\n\nUse the latest major version of each provider and the latest minor version of\nTerraform, unless otherwise constrained by a dependency lock file or by other\nmodules used by the configuration.\n\n**Version constraint operators:**\n- `= 1.0.0` - Exact version\n- `>= 1.0.0` - Greater than or equal\n- `~> 1.0` - Allow rightmost component to increment\n- `>= 1.0, \u003C 2.0` - Version range\n\n## Provider Configuration\n\n```hcl\nprovider \"aws\" {\n  region = \"us-west-2\"\n\n  default_tags {\n    tags = {\n      ManagedBy = \"Terraform\"\n      Project   = var.project_name\n    }\n  }\n}\n\n# Aliased provider for multi-region\nprovider \"aws\" {\n  alias  = \"east\"\n  region = \"us-east-1\"\n}\n```\n\n## Version Control\n\n**Never commit:**\n- `terraform.tfstate`, `terraform.tfstate.backup`\n- `.terraform\u002F` directory\n- `*.tfplan`\n- `.tfvars` files with sensitive data\n\n**Always commit:**\n- All `.tf` configuration files\n- `.terraform.lock.hcl` (dependency lock file)\n\n## Validation Tools\n\nRun before committing:\n\n```bash\nterraform fmt -recursive\nterraform validate\n```\n\nAdditional tools:\n- `tflint` - Linting and best practices\n- `checkov` \u002F `tfsec` - Security scanning\n\n## Code Review Checklist\n\n- [ ] Code formatted with `terraform fmt`\n- [ ] Configuration validated with `terraform validate`\n- [ ] Files organized according to standard structure\n- [ ] All variables have type and description\n- [ ] All outputs have descriptions\n- [ ] Resource names use descriptive nouns with underscores\n- [ ] Version constraints pinned explicitly\n- [ ] Sensitive values marked with `sensitive = true`\n- [ ] No hardcoded credentials or secrets\n- [ ] Security best practices applied\n\n---\n\n*Based on: [HashiCorp Terraform Style Guide](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Flanguage\u002Fstyle)*\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,56,76,83,88,118,124,255,262,678,684,690,711,795,801,806,949,955,1003,1081,1087,1108,1235,1241,1252,1335,1341,1347,1475,1481,1534,1540,1545,1551,1628,1633,1641,1688,1694,1822,1828,1836,1887,1895,1922,1928,1933,1973,1978,2011,2017,2133,2137,2151],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Terraform Style Guide",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Generate and maintain Terraform code following HashiCorp's official style conventions and best practices.",{"type":43,"tag":51,"props":57,"children":58},{},[59,65,67],{"type":43,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":48,"value":64},"Reference:",{"type":48,"value":66}," ",{"type":43,"tag":68,"props":69,"children":73},"a",{"href":70,"rel":71},"https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Flanguage\u002Fstyle",[72],"nofollow",[74],{"type":48,"value":75},"HashiCorp Terraform Style Guide",{"type":43,"tag":77,"props":78,"children":80},"h2",{"id":79},"code-generation-strategy",[81],{"type":48,"value":82},"Code Generation Strategy",{"type":43,"tag":51,"props":84,"children":85},{},[86],{"type":48,"value":87},"When generating Terraform code:",{"type":43,"tag":89,"props":90,"children":91},"ol",{},[92,98,103,108,113],{"type":43,"tag":93,"props":94,"children":95},"li",{},[96],{"type":48,"value":97},"Start with provider configuration and version constraints",{"type":43,"tag":93,"props":99,"children":100},{},[101],{"type":48,"value":102},"Create data sources before dependent resources",{"type":43,"tag":93,"props":104,"children":105},{},[106],{"type":48,"value":107},"Build resources in dependency order",{"type":43,"tag":93,"props":109,"children":110},{},[111],{"type":48,"value":112},"Add outputs for key resource attributes",{"type":43,"tag":93,"props":114,"children":115},{},[116],{"type":48,"value":117},"Use variables for all configurable values",{"type":43,"tag":77,"props":119,"children":121},{"id":120},"file-organization",[122],{"type":48,"value":123},"File Organization",{"type":43,"tag":125,"props":126,"children":127},"table",{},[128,147],{"type":43,"tag":129,"props":130,"children":131},"thead",{},[132],{"type":43,"tag":133,"props":134,"children":135},"tr",{},[136,142],{"type":43,"tag":137,"props":138,"children":139},"th",{},[140],{"type":48,"value":141},"File",{"type":43,"tag":137,"props":143,"children":144},{},[145],{"type":48,"value":146},"Purpose",{"type":43,"tag":148,"props":149,"children":150},"tbody",{},[151,170,187,204,221,238],{"type":43,"tag":133,"props":152,"children":153},{},[154,165],{"type":43,"tag":155,"props":156,"children":157},"td",{},[158],{"type":43,"tag":159,"props":160,"children":162},"code",{"className":161},[],[163],{"type":48,"value":164},"terraform.tf",{"type":43,"tag":155,"props":166,"children":167},{},[168],{"type":48,"value":169},"Terraform and provider version requirements",{"type":43,"tag":133,"props":171,"children":172},{},[173,182],{"type":43,"tag":155,"props":174,"children":175},{},[176],{"type":43,"tag":159,"props":177,"children":179},{"className":178},[],[180],{"type":48,"value":181},"providers.tf",{"type":43,"tag":155,"props":183,"children":184},{},[185],{"type":48,"value":186},"Provider configurations",{"type":43,"tag":133,"props":188,"children":189},{},[190,199],{"type":43,"tag":155,"props":191,"children":192},{},[193],{"type":43,"tag":159,"props":194,"children":196},{"className":195},[],[197],{"type":48,"value":198},"main.tf",{"type":43,"tag":155,"props":200,"children":201},{},[202],{"type":48,"value":203},"Primary resources and data sources",{"type":43,"tag":133,"props":205,"children":206},{},[207,216],{"type":43,"tag":155,"props":208,"children":209},{},[210],{"type":43,"tag":159,"props":211,"children":213},{"className":212},[],[214],{"type":48,"value":215},"variables.tf",{"type":43,"tag":155,"props":217,"children":218},{},[219],{"type":48,"value":220},"Input variable declarations (alphabetical)",{"type":43,"tag":133,"props":222,"children":223},{},[224,233],{"type":43,"tag":155,"props":225,"children":226},{},[227],{"type":43,"tag":159,"props":228,"children":230},{"className":229},[],[231],{"type":48,"value":232},"outputs.tf",{"type":43,"tag":155,"props":234,"children":235},{},[236],{"type":48,"value":237},"Output value declarations (alphabetical)",{"type":43,"tag":133,"props":239,"children":240},{},[241,250],{"type":43,"tag":155,"props":242,"children":243},{},[244],{"type":43,"tag":159,"props":245,"children":247},{"className":246},[],[248],{"type":48,"value":249},"locals.tf",{"type":43,"tag":155,"props":251,"children":252},{},[253],{"type":48,"value":254},"Local value declarations",{"type":43,"tag":256,"props":257,"children":259},"h3",{"id":258},"example-structure",[260],{"type":48,"value":261},"Example Structure",{"type":43,"tag":263,"props":264,"children":269},"pre",{"className":265,"code":266,"language":267,"meta":268,"style":268},"language-hcl shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# terraform.tf\nterraform {\n  required_version = \">= 1.14\"\n\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 6.0\"\n    }\n  }\n}\n\n# variables.tf\nvariable \"environment\" {\n  description = \"Target deployment environment\"\n  type        = string\n\n  validation {\n    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)\n    error_message = \"Environment must be dev, staging, or prod.\"\n  }\n}\n\n# locals.tf\nlocals {\n  common_tags = {\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n  }\n}\n\n# main.tf\nresource \"aws_vpc\" \"main\" {\n  cidr_block           = var.vpc_cidr\n  enable_dns_hostnames = true\n\n  tags = merge(local.common_tags, {\n    Name = \"${var.project_name}-${var.environment}-vpc\"\n  })\n}\n\n# outputs.tf\noutput \"vpc_id\" {\n  description = \"ID of the created VPC\"\n  value       = aws_vpc.main.id\n}\n","hcl","",[270],{"type":43,"tag":159,"props":271,"children":272},{"__ignoreMap":268},[273,284,293,302,312,321,330,339,348,357,366,375,383,392,401,410,419,427,436,445,454,462,470,478,487,496,505,514,523,531,539,547,556,565,574,583,591,600,609,618,626,634,643,652,661,670],{"type":43,"tag":274,"props":275,"children":278},"span",{"class":276,"line":277},"line",1,[279],{"type":43,"tag":274,"props":280,"children":281},{},[282],{"type":48,"value":283},"# terraform.tf\n",{"type":43,"tag":274,"props":285,"children":287},{"class":276,"line":286},2,[288],{"type":43,"tag":274,"props":289,"children":290},{},[291],{"type":48,"value":292},"terraform {\n",{"type":43,"tag":274,"props":294,"children":296},{"class":276,"line":295},3,[297],{"type":43,"tag":274,"props":298,"children":299},{},[300],{"type":48,"value":301},"  required_version = \">= 1.14\"\n",{"type":43,"tag":274,"props":303,"children":305},{"class":276,"line":304},4,[306],{"type":43,"tag":274,"props":307,"children":309},{"emptyLinePlaceholder":308},true,[310],{"type":48,"value":311},"\n",{"type":43,"tag":274,"props":313,"children":315},{"class":276,"line":314},5,[316],{"type":43,"tag":274,"props":317,"children":318},{},[319],{"type":48,"value":320},"  required_providers {\n",{"type":43,"tag":274,"props":322,"children":324},{"class":276,"line":323},6,[325],{"type":43,"tag":274,"props":326,"children":327},{},[328],{"type":48,"value":329},"    aws = {\n",{"type":43,"tag":274,"props":331,"children":333},{"class":276,"line":332},7,[334],{"type":43,"tag":274,"props":335,"children":336},{},[337],{"type":48,"value":338},"      source  = \"hashicorp\u002Faws\"\n",{"type":43,"tag":274,"props":340,"children":342},{"class":276,"line":341},8,[343],{"type":43,"tag":274,"props":344,"children":345},{},[346],{"type":48,"value":347},"      version = \"~> 6.0\"\n",{"type":43,"tag":274,"props":349,"children":351},{"class":276,"line":350},9,[352],{"type":43,"tag":274,"props":353,"children":354},{},[355],{"type":48,"value":356},"    }\n",{"type":43,"tag":274,"props":358,"children":360},{"class":276,"line":359},10,[361],{"type":43,"tag":274,"props":362,"children":363},{},[364],{"type":48,"value":365},"  }\n",{"type":43,"tag":274,"props":367,"children":369},{"class":276,"line":368},11,[370],{"type":43,"tag":274,"props":371,"children":372},{},[373],{"type":48,"value":374},"}\n",{"type":43,"tag":274,"props":376,"children":378},{"class":276,"line":377},12,[379],{"type":43,"tag":274,"props":380,"children":381},{"emptyLinePlaceholder":308},[382],{"type":48,"value":311},{"type":43,"tag":274,"props":384,"children":386},{"class":276,"line":385},13,[387],{"type":43,"tag":274,"props":388,"children":389},{},[390],{"type":48,"value":391},"# variables.tf\n",{"type":43,"tag":274,"props":393,"children":395},{"class":276,"line":394},14,[396],{"type":43,"tag":274,"props":397,"children":398},{},[399],{"type":48,"value":400},"variable \"environment\" {\n",{"type":43,"tag":274,"props":402,"children":404},{"class":276,"line":403},15,[405],{"type":43,"tag":274,"props":406,"children":407},{},[408],{"type":48,"value":409},"  description = \"Target deployment environment\"\n",{"type":43,"tag":274,"props":411,"children":413},{"class":276,"line":412},16,[414],{"type":43,"tag":274,"props":415,"children":416},{},[417],{"type":48,"value":418},"  type        = string\n",{"type":43,"tag":274,"props":420,"children":422},{"class":276,"line":421},17,[423],{"type":43,"tag":274,"props":424,"children":425},{"emptyLinePlaceholder":308},[426],{"type":48,"value":311},{"type":43,"tag":274,"props":428,"children":430},{"class":276,"line":429},18,[431],{"type":43,"tag":274,"props":432,"children":433},{},[434],{"type":48,"value":435},"  validation {\n",{"type":43,"tag":274,"props":437,"children":439},{"class":276,"line":438},19,[440],{"type":43,"tag":274,"props":441,"children":442},{},[443],{"type":48,"value":444},"    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)\n",{"type":43,"tag":274,"props":446,"children":448},{"class":276,"line":447},20,[449],{"type":43,"tag":274,"props":450,"children":451},{},[452],{"type":48,"value":453},"    error_message = \"Environment must be dev, staging, or prod.\"\n",{"type":43,"tag":274,"props":455,"children":457},{"class":276,"line":456},21,[458],{"type":43,"tag":274,"props":459,"children":460},{},[461],{"type":48,"value":365},{"type":43,"tag":274,"props":463,"children":465},{"class":276,"line":464},22,[466],{"type":43,"tag":274,"props":467,"children":468},{},[469],{"type":48,"value":374},{"type":43,"tag":274,"props":471,"children":473},{"class":276,"line":472},23,[474],{"type":43,"tag":274,"props":475,"children":476},{"emptyLinePlaceholder":308},[477],{"type":48,"value":311},{"type":43,"tag":274,"props":479,"children":481},{"class":276,"line":480},24,[482],{"type":43,"tag":274,"props":483,"children":484},{},[485],{"type":48,"value":486},"# locals.tf\n",{"type":43,"tag":274,"props":488,"children":490},{"class":276,"line":489},25,[491],{"type":43,"tag":274,"props":492,"children":493},{},[494],{"type":48,"value":495},"locals {\n",{"type":43,"tag":274,"props":497,"children":499},{"class":276,"line":498},26,[500],{"type":43,"tag":274,"props":501,"children":502},{},[503],{"type":48,"value":504},"  common_tags = {\n",{"type":43,"tag":274,"props":506,"children":508},{"class":276,"line":507},27,[509],{"type":43,"tag":274,"props":510,"children":511},{},[512],{"type":48,"value":513},"    Environment = var.environment\n",{"type":43,"tag":274,"props":515,"children":517},{"class":276,"line":516},28,[518],{"type":43,"tag":274,"props":519,"children":520},{},[521],{"type":48,"value":522},"    ManagedBy   = \"Terraform\"\n",{"type":43,"tag":274,"props":524,"children":526},{"class":276,"line":525},29,[527],{"type":43,"tag":274,"props":528,"children":529},{},[530],{"type":48,"value":365},{"type":43,"tag":274,"props":532,"children":534},{"class":276,"line":533},30,[535],{"type":43,"tag":274,"props":536,"children":537},{},[538],{"type":48,"value":374},{"type":43,"tag":274,"props":540,"children":542},{"class":276,"line":541},31,[543],{"type":43,"tag":274,"props":544,"children":545},{"emptyLinePlaceholder":308},[546],{"type":48,"value":311},{"type":43,"tag":274,"props":548,"children":550},{"class":276,"line":549},32,[551],{"type":43,"tag":274,"props":552,"children":553},{},[554],{"type":48,"value":555},"# main.tf\n",{"type":43,"tag":274,"props":557,"children":559},{"class":276,"line":558},33,[560],{"type":43,"tag":274,"props":561,"children":562},{},[563],{"type":48,"value":564},"resource \"aws_vpc\" \"main\" {\n",{"type":43,"tag":274,"props":566,"children":568},{"class":276,"line":567},34,[569],{"type":43,"tag":274,"props":570,"children":571},{},[572],{"type":48,"value":573},"  cidr_block           = var.vpc_cidr\n",{"type":43,"tag":274,"props":575,"children":577},{"class":276,"line":576},35,[578],{"type":43,"tag":274,"props":579,"children":580},{},[581],{"type":48,"value":582},"  enable_dns_hostnames = true\n",{"type":43,"tag":274,"props":584,"children":586},{"class":276,"line":585},36,[587],{"type":43,"tag":274,"props":588,"children":589},{"emptyLinePlaceholder":308},[590],{"type":48,"value":311},{"type":43,"tag":274,"props":592,"children":594},{"class":276,"line":593},37,[595],{"type":43,"tag":274,"props":596,"children":597},{},[598],{"type":48,"value":599},"  tags = merge(local.common_tags, {\n",{"type":43,"tag":274,"props":601,"children":603},{"class":276,"line":602},38,[604],{"type":43,"tag":274,"props":605,"children":606},{},[607],{"type":48,"value":608},"    Name = \"${var.project_name}-${var.environment}-vpc\"\n",{"type":43,"tag":274,"props":610,"children":612},{"class":276,"line":611},39,[613],{"type":43,"tag":274,"props":614,"children":615},{},[616],{"type":48,"value":617},"  })\n",{"type":43,"tag":274,"props":619,"children":621},{"class":276,"line":620},40,[622],{"type":43,"tag":274,"props":623,"children":624},{},[625],{"type":48,"value":374},{"type":43,"tag":274,"props":627,"children":629},{"class":276,"line":628},41,[630],{"type":43,"tag":274,"props":631,"children":632},{"emptyLinePlaceholder":308},[633],{"type":48,"value":311},{"type":43,"tag":274,"props":635,"children":637},{"class":276,"line":636},42,[638],{"type":43,"tag":274,"props":639,"children":640},{},[641],{"type":48,"value":642},"# outputs.tf\n",{"type":43,"tag":274,"props":644,"children":646},{"class":276,"line":645},43,[647],{"type":43,"tag":274,"props":648,"children":649},{},[650],{"type":48,"value":651},"output \"vpc_id\" {\n",{"type":43,"tag":274,"props":653,"children":655},{"class":276,"line":654},44,[656],{"type":43,"tag":274,"props":657,"children":658},{},[659],{"type":48,"value":660},"  description = \"ID of the created VPC\"\n",{"type":43,"tag":274,"props":662,"children":664},{"class":276,"line":663},45,[665],{"type":43,"tag":274,"props":666,"children":667},{},[668],{"type":48,"value":669},"  value       = aws_vpc.main.id\n",{"type":43,"tag":274,"props":671,"children":673},{"class":276,"line":672},46,[674],{"type":43,"tag":274,"props":675,"children":676},{},[677],{"type":48,"value":374},{"type":43,"tag":77,"props":679,"children":681},{"id":680},"code-formatting",[682],{"type":48,"value":683},"Code Formatting",{"type":43,"tag":256,"props":685,"children":687},{"id":686},"indentation-and-alignment",[688],{"type":48,"value":689},"Indentation and Alignment",{"type":43,"tag":691,"props":692,"children":693},"ul",{},[694,706],{"type":43,"tag":93,"props":695,"children":696},{},[697,699,704],{"type":48,"value":698},"Use ",{"type":43,"tag":60,"props":700,"children":701},{},[702],{"type":48,"value":703},"two spaces",{"type":48,"value":705}," per nesting level (no tabs)",{"type":43,"tag":93,"props":707,"children":708},{},[709],{"type":48,"value":710},"Align equals signs for consecutive arguments",{"type":43,"tag":263,"props":712,"children":714},{"className":265,"code":713,"language":267,"meta":268,"style":268},"resource \"aws_instance\" \"web\" {\n  ami           = \"ami-0c55b159cbfafe1f0\"\n  instance_type = \"t2.micro\"\n  subnet_id     = \"subnet-12345678\"\n\n  tags = {\n    Name        = \"web-server\"\n    Environment = \"production\"\n  }\n}\n",[715],{"type":43,"tag":159,"props":716,"children":717},{"__ignoreMap":268},[718,726,734,742,750,757,765,773,781,788],{"type":43,"tag":274,"props":719,"children":720},{"class":276,"line":277},[721],{"type":43,"tag":274,"props":722,"children":723},{},[724],{"type":48,"value":725},"resource \"aws_instance\" \"web\" {\n",{"type":43,"tag":274,"props":727,"children":728},{"class":276,"line":286},[729],{"type":43,"tag":274,"props":730,"children":731},{},[732],{"type":48,"value":733},"  ami           = \"ami-0c55b159cbfafe1f0\"\n",{"type":43,"tag":274,"props":735,"children":736},{"class":276,"line":295},[737],{"type":43,"tag":274,"props":738,"children":739},{},[740],{"type":48,"value":741},"  instance_type = \"t2.micro\"\n",{"type":43,"tag":274,"props":743,"children":744},{"class":276,"line":304},[745],{"type":43,"tag":274,"props":746,"children":747},{},[748],{"type":48,"value":749},"  subnet_id     = \"subnet-12345678\"\n",{"type":43,"tag":274,"props":751,"children":752},{"class":276,"line":314},[753],{"type":43,"tag":274,"props":754,"children":755},{"emptyLinePlaceholder":308},[756],{"type":48,"value":311},{"type":43,"tag":274,"props":758,"children":759},{"class":276,"line":323},[760],{"type":43,"tag":274,"props":761,"children":762},{},[763],{"type":48,"value":764},"  tags = {\n",{"type":43,"tag":274,"props":766,"children":767},{"class":276,"line":332},[768],{"type":43,"tag":274,"props":769,"children":770},{},[771],{"type":48,"value":772},"    Name        = \"web-server\"\n",{"type":43,"tag":274,"props":774,"children":775},{"class":276,"line":341},[776],{"type":43,"tag":274,"props":777,"children":778},{},[779],{"type":48,"value":780},"    Environment = \"production\"\n",{"type":43,"tag":274,"props":782,"children":783},{"class":276,"line":350},[784],{"type":43,"tag":274,"props":785,"children":786},{},[787],{"type":48,"value":365},{"type":43,"tag":274,"props":789,"children":790},{"class":276,"line":359},[791],{"type":43,"tag":274,"props":792,"children":793},{},[794],{"type":48,"value":374},{"type":43,"tag":256,"props":796,"children":798},{"id":797},"block-organization",[799],{"type":48,"value":800},"Block Organization",{"type":43,"tag":51,"props":802,"children":803},{},[804],{"type":48,"value":805},"Arguments precede blocks, with meta-arguments first:",{"type":43,"tag":263,"props":807,"children":809},{"className":265,"code":808,"language":267,"meta":268,"style":268},"resource \"aws_instance\" \"example\" {\n  # Meta-arguments\n  count = 3\n\n  # Arguments\n  ami           = \"ami-0c55b159cbfafe1f0\"\n  instance_type = \"t2.micro\"\n\n  # Blocks\n  root_block_device {\n    volume_size = 20\n  }\n\n  # Lifecycle last\n  lifecycle {\n    create_before_destroy = true\n  }\n}\n",[810],{"type":43,"tag":159,"props":811,"children":812},{"__ignoreMap":268},[813,821,829,837,844,852,859,866,873,881,889,897,904,911,919,927,935,942],{"type":43,"tag":274,"props":814,"children":815},{"class":276,"line":277},[816],{"type":43,"tag":274,"props":817,"children":818},{},[819],{"type":48,"value":820},"resource \"aws_instance\" \"example\" {\n",{"type":43,"tag":274,"props":822,"children":823},{"class":276,"line":286},[824],{"type":43,"tag":274,"props":825,"children":826},{},[827],{"type":48,"value":828},"  # Meta-arguments\n",{"type":43,"tag":274,"props":830,"children":831},{"class":276,"line":295},[832],{"type":43,"tag":274,"props":833,"children":834},{},[835],{"type":48,"value":836},"  count = 3\n",{"type":43,"tag":274,"props":838,"children":839},{"class":276,"line":304},[840],{"type":43,"tag":274,"props":841,"children":842},{"emptyLinePlaceholder":308},[843],{"type":48,"value":311},{"type":43,"tag":274,"props":845,"children":846},{"class":276,"line":314},[847],{"type":43,"tag":274,"props":848,"children":849},{},[850],{"type":48,"value":851},"  # Arguments\n",{"type":43,"tag":274,"props":853,"children":854},{"class":276,"line":323},[855],{"type":43,"tag":274,"props":856,"children":857},{},[858],{"type":48,"value":733},{"type":43,"tag":274,"props":860,"children":861},{"class":276,"line":332},[862],{"type":43,"tag":274,"props":863,"children":864},{},[865],{"type":48,"value":741},{"type":43,"tag":274,"props":867,"children":868},{"class":276,"line":341},[869],{"type":43,"tag":274,"props":870,"children":871},{"emptyLinePlaceholder":308},[872],{"type":48,"value":311},{"type":43,"tag":274,"props":874,"children":875},{"class":276,"line":350},[876],{"type":43,"tag":274,"props":877,"children":878},{},[879],{"type":48,"value":880},"  # Blocks\n",{"type":43,"tag":274,"props":882,"children":883},{"class":276,"line":359},[884],{"type":43,"tag":274,"props":885,"children":886},{},[887],{"type":48,"value":888},"  root_block_device {\n",{"type":43,"tag":274,"props":890,"children":891},{"class":276,"line":368},[892],{"type":43,"tag":274,"props":893,"children":894},{},[895],{"type":48,"value":896},"    volume_size = 20\n",{"type":43,"tag":274,"props":898,"children":899},{"class":276,"line":377},[900],{"type":43,"tag":274,"props":901,"children":902},{},[903],{"type":48,"value":365},{"type":43,"tag":274,"props":905,"children":906},{"class":276,"line":385},[907],{"type":43,"tag":274,"props":908,"children":909},{"emptyLinePlaceholder":308},[910],{"type":48,"value":311},{"type":43,"tag":274,"props":912,"children":913},{"class":276,"line":394},[914],{"type":43,"tag":274,"props":915,"children":916},{},[917],{"type":48,"value":918},"  # Lifecycle last\n",{"type":43,"tag":274,"props":920,"children":921},{"class":276,"line":403},[922],{"type":43,"tag":274,"props":923,"children":924},{},[925],{"type":48,"value":926},"  lifecycle {\n",{"type":43,"tag":274,"props":928,"children":929},{"class":276,"line":412},[930],{"type":43,"tag":274,"props":931,"children":932},{},[933],{"type":48,"value":934},"    create_before_destroy = true\n",{"type":43,"tag":274,"props":936,"children":937},{"class":276,"line":421},[938],{"type":43,"tag":274,"props":939,"children":940},{},[941],{"type":48,"value":365},{"type":43,"tag":274,"props":943,"children":944},{"class":276,"line":429},[945],{"type":43,"tag":274,"props":946,"children":947},{},[948],{"type":48,"value":374},{"type":43,"tag":77,"props":950,"children":952},{"id":951},"naming-conventions",[953],{"type":48,"value":954},"Naming Conventions",{"type":43,"tag":691,"props":956,"children":957},{},[958,969,980,985,990],{"type":43,"tag":93,"props":959,"children":960},{},[961,962,967],{"type":48,"value":698},{"type":43,"tag":60,"props":963,"children":964},{},[965],{"type":48,"value":966},"lowercase with underscores",{"type":48,"value":968}," for all names",{"type":43,"tag":93,"props":970,"children":971},{},[972,973,978],{"type":48,"value":698},{"type":43,"tag":60,"props":974,"children":975},{},[976],{"type":48,"value":977},"descriptive nouns",{"type":48,"value":979}," excluding the resource type",{"type":43,"tag":93,"props":981,"children":982},{},[983],{"type":48,"value":984},"Be specific and meaningful",{"type":43,"tag":93,"props":986,"children":987},{},[988],{"type":48,"value":989},"Resource names must be singular, not plural",{"type":43,"tag":93,"props":991,"children":992},{},[993,995,1001],{"type":48,"value":994},"Default to ",{"type":43,"tag":159,"props":996,"children":998},{"className":997},[],[999],{"type":48,"value":1000},"main",{"type":48,"value":1002}," for resources where a specific descriptive name is redundant or unavailable, provided only one instance exists",{"type":43,"tag":263,"props":1004,"children":1006},{"className":265,"code":1005,"language":267,"meta":268,"style":268},"# Bad\nresource \"aws_instance\" \"webAPI-aws-instance\" {}\nresource \"aws_instance\" \"web_apis\" {}\nvariable \"name\" {}\n\n# Good\nresource \"aws_instance\" \"web_api\" {}\nresource \"aws_vpc\" \"main\" {}\nvariable \"application_name\" {}\n",[1007],{"type":43,"tag":159,"props":1008,"children":1009},{"__ignoreMap":268},[1010,1018,1026,1034,1042,1049,1057,1065,1073],{"type":43,"tag":274,"props":1011,"children":1012},{"class":276,"line":277},[1013],{"type":43,"tag":274,"props":1014,"children":1015},{},[1016],{"type":48,"value":1017},"# Bad\n",{"type":43,"tag":274,"props":1019,"children":1020},{"class":276,"line":286},[1021],{"type":43,"tag":274,"props":1022,"children":1023},{},[1024],{"type":48,"value":1025},"resource \"aws_instance\" \"webAPI-aws-instance\" {}\n",{"type":43,"tag":274,"props":1027,"children":1028},{"class":276,"line":295},[1029],{"type":43,"tag":274,"props":1030,"children":1031},{},[1032],{"type":48,"value":1033},"resource \"aws_instance\" \"web_apis\" {}\n",{"type":43,"tag":274,"props":1035,"children":1036},{"class":276,"line":304},[1037],{"type":43,"tag":274,"props":1038,"children":1039},{},[1040],{"type":48,"value":1041},"variable \"name\" {}\n",{"type":43,"tag":274,"props":1043,"children":1044},{"class":276,"line":314},[1045],{"type":43,"tag":274,"props":1046,"children":1047},{"emptyLinePlaceholder":308},[1048],{"type":48,"value":311},{"type":43,"tag":274,"props":1050,"children":1051},{"class":276,"line":323},[1052],{"type":43,"tag":274,"props":1053,"children":1054},{},[1055],{"type":48,"value":1056},"# Good\n",{"type":43,"tag":274,"props":1058,"children":1059},{"class":276,"line":332},[1060],{"type":43,"tag":274,"props":1061,"children":1062},{},[1063],{"type":48,"value":1064},"resource \"aws_instance\" \"web_api\" {}\n",{"type":43,"tag":274,"props":1066,"children":1067},{"class":276,"line":341},[1068],{"type":43,"tag":274,"props":1069,"children":1070},{},[1071],{"type":48,"value":1072},"resource \"aws_vpc\" \"main\" {}\n",{"type":43,"tag":274,"props":1074,"children":1075},{"class":276,"line":350},[1076],{"type":43,"tag":274,"props":1077,"children":1078},{},[1079],{"type":48,"value":1080},"variable \"application_name\" {}\n",{"type":43,"tag":77,"props":1082,"children":1084},{"id":1083},"variables",[1085],{"type":48,"value":1086},"Variables",{"type":43,"tag":51,"props":1088,"children":1089},{},[1090,1092,1098,1100,1106],{"type":48,"value":1091},"Every variable must include ",{"type":43,"tag":159,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":48,"value":1097},"type",{"type":48,"value":1099}," and ",{"type":43,"tag":159,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":48,"value":1105},"description",{"type":48,"value":1107},":",{"type":43,"tag":263,"props":1109,"children":1111},{"className":265,"code":1110,"language":267,"meta":268,"style":268},"variable \"instance_type\" {\n  description = \"EC2 instance type for the web server\"\n  type        = string\n  default     = \"t2.micro\"\n\n  validation {\n    condition     = contains([\"t2.micro\", \"t2.small\", \"t2.medium\"], var.instance_type)\n    error_message = \"Instance type must be t2.micro, t2.small, or t2.medium.\"\n  }\n}\n\nvariable \"database_password\" {\n  description = \"Password for the database admin user\"\n  type        = string\n  sensitive   = true\n}\n",[1112],{"type":43,"tag":159,"props":1113,"children":1114},{"__ignoreMap":268},[1115,1123,1131,1138,1146,1153,1160,1168,1176,1183,1190,1197,1205,1213,1220,1228],{"type":43,"tag":274,"props":1116,"children":1117},{"class":276,"line":277},[1118],{"type":43,"tag":274,"props":1119,"children":1120},{},[1121],{"type":48,"value":1122},"variable \"instance_type\" {\n",{"type":43,"tag":274,"props":1124,"children":1125},{"class":276,"line":286},[1126],{"type":43,"tag":274,"props":1127,"children":1128},{},[1129],{"type":48,"value":1130},"  description = \"EC2 instance type for the web server\"\n",{"type":43,"tag":274,"props":1132,"children":1133},{"class":276,"line":295},[1134],{"type":43,"tag":274,"props":1135,"children":1136},{},[1137],{"type":48,"value":418},{"type":43,"tag":274,"props":1139,"children":1140},{"class":276,"line":304},[1141],{"type":43,"tag":274,"props":1142,"children":1143},{},[1144],{"type":48,"value":1145},"  default     = \"t2.micro\"\n",{"type":43,"tag":274,"props":1147,"children":1148},{"class":276,"line":314},[1149],{"type":43,"tag":274,"props":1150,"children":1151},{"emptyLinePlaceholder":308},[1152],{"type":48,"value":311},{"type":43,"tag":274,"props":1154,"children":1155},{"class":276,"line":323},[1156],{"type":43,"tag":274,"props":1157,"children":1158},{},[1159],{"type":48,"value":435},{"type":43,"tag":274,"props":1161,"children":1162},{"class":276,"line":332},[1163],{"type":43,"tag":274,"props":1164,"children":1165},{},[1166],{"type":48,"value":1167},"    condition     = contains([\"t2.micro\", \"t2.small\", \"t2.medium\"], var.instance_type)\n",{"type":43,"tag":274,"props":1169,"children":1170},{"class":276,"line":341},[1171],{"type":43,"tag":274,"props":1172,"children":1173},{},[1174],{"type":48,"value":1175},"    error_message = \"Instance type must be t2.micro, t2.small, or t2.medium.\"\n",{"type":43,"tag":274,"props":1177,"children":1178},{"class":276,"line":350},[1179],{"type":43,"tag":274,"props":1180,"children":1181},{},[1182],{"type":48,"value":365},{"type":43,"tag":274,"props":1184,"children":1185},{"class":276,"line":359},[1186],{"type":43,"tag":274,"props":1187,"children":1188},{},[1189],{"type":48,"value":374},{"type":43,"tag":274,"props":1191,"children":1192},{"class":276,"line":368},[1193],{"type":43,"tag":274,"props":1194,"children":1195},{"emptyLinePlaceholder":308},[1196],{"type":48,"value":311},{"type":43,"tag":274,"props":1198,"children":1199},{"class":276,"line":377},[1200],{"type":43,"tag":274,"props":1201,"children":1202},{},[1203],{"type":48,"value":1204},"variable \"database_password\" {\n",{"type":43,"tag":274,"props":1206,"children":1207},{"class":276,"line":385},[1208],{"type":43,"tag":274,"props":1209,"children":1210},{},[1211],{"type":48,"value":1212},"  description = \"Password for the database admin user\"\n",{"type":43,"tag":274,"props":1214,"children":1215},{"class":276,"line":394},[1216],{"type":43,"tag":274,"props":1217,"children":1218},{},[1219],{"type":48,"value":418},{"type":43,"tag":274,"props":1221,"children":1222},{"class":276,"line":403},[1223],{"type":43,"tag":274,"props":1224,"children":1225},{},[1226],{"type":48,"value":1227},"  sensitive   = true\n",{"type":43,"tag":274,"props":1229,"children":1230},{"class":276,"line":412},[1231],{"type":43,"tag":274,"props":1232,"children":1233},{},[1234],{"type":48,"value":374},{"type":43,"tag":77,"props":1236,"children":1238},{"id":1237},"outputs",[1239],{"type":48,"value":1240},"Outputs",{"type":43,"tag":51,"props":1242,"children":1243},{},[1244,1246,1251],{"type":48,"value":1245},"Every output must include ",{"type":43,"tag":159,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":48,"value":1105},{"type":48,"value":1107},{"type":43,"tag":263,"props":1253,"children":1255},{"className":265,"code":1254,"language":267,"meta":268,"style":268},"output \"instance_id\" {\n  description = \"ID of the EC2 instance\"\n  value       = aws_instance.web.id\n}\n\noutput \"database_password\" {\n  description = \"Database administrator password\"\n  value       = aws_db_instance.main.password\n  sensitive   = true\n}\n",[1256],{"type":43,"tag":159,"props":1257,"children":1258},{"__ignoreMap":268},[1259,1267,1275,1283,1290,1297,1305,1313,1321,1328],{"type":43,"tag":274,"props":1260,"children":1261},{"class":276,"line":277},[1262],{"type":43,"tag":274,"props":1263,"children":1264},{},[1265],{"type":48,"value":1266},"output \"instance_id\" {\n",{"type":43,"tag":274,"props":1268,"children":1269},{"class":276,"line":286},[1270],{"type":43,"tag":274,"props":1271,"children":1272},{},[1273],{"type":48,"value":1274},"  description = \"ID of the EC2 instance\"\n",{"type":43,"tag":274,"props":1276,"children":1277},{"class":276,"line":295},[1278],{"type":43,"tag":274,"props":1279,"children":1280},{},[1281],{"type":48,"value":1282},"  value       = aws_instance.web.id\n",{"type":43,"tag":274,"props":1284,"children":1285},{"class":276,"line":304},[1286],{"type":43,"tag":274,"props":1287,"children":1288},{},[1289],{"type":48,"value":374},{"type":43,"tag":274,"props":1291,"children":1292},{"class":276,"line":314},[1293],{"type":43,"tag":274,"props":1294,"children":1295},{"emptyLinePlaceholder":308},[1296],{"type":48,"value":311},{"type":43,"tag":274,"props":1298,"children":1299},{"class":276,"line":323},[1300],{"type":43,"tag":274,"props":1301,"children":1302},{},[1303],{"type":48,"value":1304},"output \"database_password\" {\n",{"type":43,"tag":274,"props":1306,"children":1307},{"class":276,"line":332},[1308],{"type":43,"tag":274,"props":1309,"children":1310},{},[1311],{"type":48,"value":1312},"  description = \"Database administrator password\"\n",{"type":43,"tag":274,"props":1314,"children":1315},{"class":276,"line":341},[1316],{"type":43,"tag":274,"props":1317,"children":1318},{},[1319],{"type":48,"value":1320},"  value       = aws_db_instance.main.password\n",{"type":43,"tag":274,"props":1322,"children":1323},{"class":276,"line":350},[1324],{"type":43,"tag":274,"props":1325,"children":1326},{},[1327],{"type":48,"value":1227},{"type":43,"tag":274,"props":1329,"children":1330},{"class":276,"line":359},[1331],{"type":43,"tag":274,"props":1332,"children":1333},{},[1334],{"type":48,"value":374},{"type":43,"tag":77,"props":1336,"children":1338},{"id":1337},"dynamic-resource-creation",[1339],{"type":48,"value":1340},"Dynamic Resource Creation",{"type":43,"tag":256,"props":1342,"children":1344},{"id":1343},"prefer-for_each-over-count",[1345],{"type":48,"value":1346},"Prefer for_each over count",{"type":43,"tag":263,"props":1348,"children":1350},{"className":265,"code":1349,"language":267,"meta":268,"style":268},"# Bad - count for multiple resources\nresource \"aws_instance\" \"web\" {\n  count = var.instance_count\n  tags  = { Name = \"web-${count.index}\" }\n}\n\n# Good - for_each with named instances\nvariable \"instance_names\" {\n  type    = set(string)\n  default = [\"web-1\", \"web-2\", \"web-3\"]\n}\n\nresource \"aws_instance\" \"web\" {\n  for_each = var.instance_names\n  tags     = { Name = each.key }\n}\n",[1351],{"type":43,"tag":159,"props":1352,"children":1353},{"__ignoreMap":268},[1354,1362,1369,1377,1385,1392,1399,1407,1415,1423,1431,1438,1445,1452,1460,1468],{"type":43,"tag":274,"props":1355,"children":1356},{"class":276,"line":277},[1357],{"type":43,"tag":274,"props":1358,"children":1359},{},[1360],{"type":48,"value":1361},"# Bad - count for multiple resources\n",{"type":43,"tag":274,"props":1363,"children":1364},{"class":276,"line":286},[1365],{"type":43,"tag":274,"props":1366,"children":1367},{},[1368],{"type":48,"value":725},{"type":43,"tag":274,"props":1370,"children":1371},{"class":276,"line":295},[1372],{"type":43,"tag":274,"props":1373,"children":1374},{},[1375],{"type":48,"value":1376},"  count = var.instance_count\n",{"type":43,"tag":274,"props":1378,"children":1379},{"class":276,"line":304},[1380],{"type":43,"tag":274,"props":1381,"children":1382},{},[1383],{"type":48,"value":1384},"  tags  = { Name = \"web-${count.index}\" }\n",{"type":43,"tag":274,"props":1386,"children":1387},{"class":276,"line":314},[1388],{"type":43,"tag":274,"props":1389,"children":1390},{},[1391],{"type":48,"value":374},{"type":43,"tag":274,"props":1393,"children":1394},{"class":276,"line":323},[1395],{"type":43,"tag":274,"props":1396,"children":1397},{"emptyLinePlaceholder":308},[1398],{"type":48,"value":311},{"type":43,"tag":274,"props":1400,"children":1401},{"class":276,"line":332},[1402],{"type":43,"tag":274,"props":1403,"children":1404},{},[1405],{"type":48,"value":1406},"# Good - for_each with named instances\n",{"type":43,"tag":274,"props":1408,"children":1409},{"class":276,"line":341},[1410],{"type":43,"tag":274,"props":1411,"children":1412},{},[1413],{"type":48,"value":1414},"variable \"instance_names\" {\n",{"type":43,"tag":274,"props":1416,"children":1417},{"class":276,"line":350},[1418],{"type":43,"tag":274,"props":1419,"children":1420},{},[1421],{"type":48,"value":1422},"  type    = set(string)\n",{"type":43,"tag":274,"props":1424,"children":1425},{"class":276,"line":359},[1426],{"type":43,"tag":274,"props":1427,"children":1428},{},[1429],{"type":48,"value":1430},"  default = [\"web-1\", \"web-2\", \"web-3\"]\n",{"type":43,"tag":274,"props":1432,"children":1433},{"class":276,"line":368},[1434],{"type":43,"tag":274,"props":1435,"children":1436},{},[1437],{"type":48,"value":374},{"type":43,"tag":274,"props":1439,"children":1440},{"class":276,"line":377},[1441],{"type":43,"tag":274,"props":1442,"children":1443},{"emptyLinePlaceholder":308},[1444],{"type":48,"value":311},{"type":43,"tag":274,"props":1446,"children":1447},{"class":276,"line":385},[1448],{"type":43,"tag":274,"props":1449,"children":1450},{},[1451],{"type":48,"value":725},{"type":43,"tag":274,"props":1453,"children":1454},{"class":276,"line":394},[1455],{"type":43,"tag":274,"props":1456,"children":1457},{},[1458],{"type":48,"value":1459},"  for_each = var.instance_names\n",{"type":43,"tag":274,"props":1461,"children":1462},{"class":276,"line":403},[1463],{"type":43,"tag":274,"props":1464,"children":1465},{},[1466],{"type":48,"value":1467},"  tags     = { Name = each.key }\n",{"type":43,"tag":274,"props":1469,"children":1470},{"class":276,"line":412},[1471],{"type":43,"tag":274,"props":1472,"children":1473},{},[1474],{"type":48,"value":374},{"type":43,"tag":256,"props":1476,"children":1478},{"id":1477},"count-for-conditional-creation",[1479],{"type":48,"value":1480},"count for Conditional Creation",{"type":43,"tag":263,"props":1482,"children":1484},{"className":265,"code":1483,"language":267,"meta":268,"style":268},"resource \"aws_cloudwatch_metric_alarm\" \"cpu\" {\n  count = var.enable_monitoring ? 1 : 0\n\n  alarm_name = \"high-cpu-usage\"\n  threshold  = 80\n}\n",[1485],{"type":43,"tag":159,"props":1486,"children":1487},{"__ignoreMap":268},[1488,1496,1504,1511,1519,1527],{"type":43,"tag":274,"props":1489,"children":1490},{"class":276,"line":277},[1491],{"type":43,"tag":274,"props":1492,"children":1493},{},[1494],{"type":48,"value":1495},"resource \"aws_cloudwatch_metric_alarm\" \"cpu\" {\n",{"type":43,"tag":274,"props":1497,"children":1498},{"class":276,"line":286},[1499],{"type":43,"tag":274,"props":1500,"children":1501},{},[1502],{"type":48,"value":1503},"  count = var.enable_monitoring ? 1 : 0\n",{"type":43,"tag":274,"props":1505,"children":1506},{"class":276,"line":295},[1507],{"type":43,"tag":274,"props":1508,"children":1509},{"emptyLinePlaceholder":308},[1510],{"type":48,"value":311},{"type":43,"tag":274,"props":1512,"children":1513},{"class":276,"line":304},[1514],{"type":43,"tag":274,"props":1515,"children":1516},{},[1517],{"type":48,"value":1518},"  alarm_name = \"high-cpu-usage\"\n",{"type":43,"tag":274,"props":1520,"children":1521},{"class":276,"line":314},[1522],{"type":43,"tag":274,"props":1523,"children":1524},{},[1525],{"type":48,"value":1526},"  threshold  = 80\n",{"type":43,"tag":274,"props":1528,"children":1529},{"class":276,"line":323},[1530],{"type":43,"tag":274,"props":1531,"children":1532},{},[1533],{"type":48,"value":374},{"type":43,"tag":77,"props":1535,"children":1537},{"id":1536},"security-best-practices",[1538],{"type":48,"value":1539},"Security Best Practices",{"type":43,"tag":51,"props":1541,"children":1542},{},[1543],{"type":48,"value":1544},"Refer to SECURITY.md. It includes guidance on encrypting resources,\npreventing sensitive data in state, and secure configurations.",{"type":43,"tag":77,"props":1546,"children":1548},{"id":1547},"version-pinning",[1549],{"type":48,"value":1550},"Version Pinning",{"type":43,"tag":263,"props":1552,"children":1554},{"className":265,"code":1553,"language":267,"meta":268,"style":268},"terraform {\n  required_version = \">= 1.14\"\n\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 6.0\"\n    }\n  }\n}\n",[1555],{"type":43,"tag":159,"props":1556,"children":1557},{"__ignoreMap":268},[1558,1565,1572,1579,1586,1593,1600,1607,1614,1621],{"type":43,"tag":274,"props":1559,"children":1560},{"class":276,"line":277},[1561],{"type":43,"tag":274,"props":1562,"children":1563},{},[1564],{"type":48,"value":292},{"type":43,"tag":274,"props":1566,"children":1567},{"class":276,"line":286},[1568],{"type":43,"tag":274,"props":1569,"children":1570},{},[1571],{"type":48,"value":301},{"type":43,"tag":274,"props":1573,"children":1574},{"class":276,"line":295},[1575],{"type":43,"tag":274,"props":1576,"children":1577},{"emptyLinePlaceholder":308},[1578],{"type":48,"value":311},{"type":43,"tag":274,"props":1580,"children":1581},{"class":276,"line":304},[1582],{"type":43,"tag":274,"props":1583,"children":1584},{},[1585],{"type":48,"value":320},{"type":43,"tag":274,"props":1587,"children":1588},{"class":276,"line":314},[1589],{"type":43,"tag":274,"props":1590,"children":1591},{},[1592],{"type":48,"value":329},{"type":43,"tag":274,"props":1594,"children":1595},{"class":276,"line":323},[1596],{"type":43,"tag":274,"props":1597,"children":1598},{},[1599],{"type":48,"value":338},{"type":43,"tag":274,"props":1601,"children":1602},{"class":276,"line":332},[1603],{"type":43,"tag":274,"props":1604,"children":1605},{},[1606],{"type":48,"value":347},{"type":43,"tag":274,"props":1608,"children":1609},{"class":276,"line":341},[1610],{"type":43,"tag":274,"props":1611,"children":1612},{},[1613],{"type":48,"value":356},{"type":43,"tag":274,"props":1615,"children":1616},{"class":276,"line":350},[1617],{"type":43,"tag":274,"props":1618,"children":1619},{},[1620],{"type":48,"value":365},{"type":43,"tag":274,"props":1622,"children":1623},{"class":276,"line":359},[1624],{"type":43,"tag":274,"props":1625,"children":1626},{},[1627],{"type":48,"value":374},{"type":43,"tag":51,"props":1629,"children":1630},{},[1631],{"type":48,"value":1632},"Use the latest major version of each provider and the latest minor version of\nTerraform, unless otherwise constrained by a dependency lock file or by other\nmodules used by the configuration.",{"type":43,"tag":51,"props":1634,"children":1635},{},[1636],{"type":43,"tag":60,"props":1637,"children":1638},{},[1639],{"type":48,"value":1640},"Version constraint operators:",{"type":43,"tag":691,"props":1642,"children":1643},{},[1644,1655,1666,1677],{"type":43,"tag":93,"props":1645,"children":1646},{},[1647,1653],{"type":43,"tag":159,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":48,"value":1652},"= 1.0.0",{"type":48,"value":1654}," - Exact version",{"type":43,"tag":93,"props":1656,"children":1657},{},[1658,1664],{"type":43,"tag":159,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":48,"value":1663},">= 1.0.0",{"type":48,"value":1665}," - Greater than or equal",{"type":43,"tag":93,"props":1667,"children":1668},{},[1669,1675],{"type":43,"tag":159,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":48,"value":1674},"~> 1.0",{"type":48,"value":1676}," - Allow rightmost component to increment",{"type":43,"tag":93,"props":1678,"children":1679},{},[1680,1686],{"type":43,"tag":159,"props":1681,"children":1683},{"className":1682},[],[1684],{"type":48,"value":1685},">= 1.0, \u003C 2.0",{"type":48,"value":1687}," - Version range",{"type":43,"tag":77,"props":1689,"children":1691},{"id":1690},"provider-configuration",[1692],{"type":48,"value":1693},"Provider Configuration",{"type":43,"tag":263,"props":1695,"children":1697},{"className":265,"code":1696,"language":267,"meta":268,"style":268},"provider \"aws\" {\n  region = \"us-west-2\"\n\n  default_tags {\n    tags = {\n      ManagedBy = \"Terraform\"\n      Project   = var.project_name\n    }\n  }\n}\n\n# Aliased provider for multi-region\nprovider \"aws\" {\n  alias  = \"east\"\n  region = \"us-east-1\"\n}\n",[1698],{"type":43,"tag":159,"props":1699,"children":1700},{"__ignoreMap":268},[1701,1709,1717,1724,1732,1740,1748,1756,1763,1770,1777,1784,1792,1799,1807,1815],{"type":43,"tag":274,"props":1702,"children":1703},{"class":276,"line":277},[1704],{"type":43,"tag":274,"props":1705,"children":1706},{},[1707],{"type":48,"value":1708},"provider \"aws\" {\n",{"type":43,"tag":274,"props":1710,"children":1711},{"class":276,"line":286},[1712],{"type":43,"tag":274,"props":1713,"children":1714},{},[1715],{"type":48,"value":1716},"  region = \"us-west-2\"\n",{"type":43,"tag":274,"props":1718,"children":1719},{"class":276,"line":295},[1720],{"type":43,"tag":274,"props":1721,"children":1722},{"emptyLinePlaceholder":308},[1723],{"type":48,"value":311},{"type":43,"tag":274,"props":1725,"children":1726},{"class":276,"line":304},[1727],{"type":43,"tag":274,"props":1728,"children":1729},{},[1730],{"type":48,"value":1731},"  default_tags {\n",{"type":43,"tag":274,"props":1733,"children":1734},{"class":276,"line":314},[1735],{"type":43,"tag":274,"props":1736,"children":1737},{},[1738],{"type":48,"value":1739},"    tags = {\n",{"type":43,"tag":274,"props":1741,"children":1742},{"class":276,"line":323},[1743],{"type":43,"tag":274,"props":1744,"children":1745},{},[1746],{"type":48,"value":1747},"      ManagedBy = \"Terraform\"\n",{"type":43,"tag":274,"props":1749,"children":1750},{"class":276,"line":332},[1751],{"type":43,"tag":274,"props":1752,"children":1753},{},[1754],{"type":48,"value":1755},"      Project   = var.project_name\n",{"type":43,"tag":274,"props":1757,"children":1758},{"class":276,"line":341},[1759],{"type":43,"tag":274,"props":1760,"children":1761},{},[1762],{"type":48,"value":356},{"type":43,"tag":274,"props":1764,"children":1765},{"class":276,"line":350},[1766],{"type":43,"tag":274,"props":1767,"children":1768},{},[1769],{"type":48,"value":365},{"type":43,"tag":274,"props":1771,"children":1772},{"class":276,"line":359},[1773],{"type":43,"tag":274,"props":1774,"children":1775},{},[1776],{"type":48,"value":374},{"type":43,"tag":274,"props":1778,"children":1779},{"class":276,"line":368},[1780],{"type":43,"tag":274,"props":1781,"children":1782},{"emptyLinePlaceholder":308},[1783],{"type":48,"value":311},{"type":43,"tag":274,"props":1785,"children":1786},{"class":276,"line":377},[1787],{"type":43,"tag":274,"props":1788,"children":1789},{},[1790],{"type":48,"value":1791},"# Aliased provider for multi-region\n",{"type":43,"tag":274,"props":1793,"children":1794},{"class":276,"line":385},[1795],{"type":43,"tag":274,"props":1796,"children":1797},{},[1798],{"type":48,"value":1708},{"type":43,"tag":274,"props":1800,"children":1801},{"class":276,"line":394},[1802],{"type":43,"tag":274,"props":1803,"children":1804},{},[1805],{"type":48,"value":1806},"  alias  = \"east\"\n",{"type":43,"tag":274,"props":1808,"children":1809},{"class":276,"line":403},[1810],{"type":43,"tag":274,"props":1811,"children":1812},{},[1813],{"type":48,"value":1814},"  region = \"us-east-1\"\n",{"type":43,"tag":274,"props":1816,"children":1817},{"class":276,"line":412},[1818],{"type":43,"tag":274,"props":1819,"children":1820},{},[1821],{"type":48,"value":374},{"type":43,"tag":77,"props":1823,"children":1825},{"id":1824},"version-control",[1826],{"type":48,"value":1827},"Version Control",{"type":43,"tag":51,"props":1829,"children":1830},{},[1831],{"type":43,"tag":60,"props":1832,"children":1833},{},[1834],{"type":48,"value":1835},"Never commit:",{"type":43,"tag":691,"props":1837,"children":1838},{},[1839,1856,1867,1876],{"type":43,"tag":93,"props":1840,"children":1841},{},[1842,1848,1850],{"type":43,"tag":159,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":48,"value":1847},"terraform.tfstate",{"type":48,"value":1849},", ",{"type":43,"tag":159,"props":1851,"children":1853},{"className":1852},[],[1854],{"type":48,"value":1855},"terraform.tfstate.backup",{"type":43,"tag":93,"props":1857,"children":1858},{},[1859,1865],{"type":43,"tag":159,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":48,"value":1864},".terraform\u002F",{"type":48,"value":1866}," directory",{"type":43,"tag":93,"props":1868,"children":1869},{},[1870],{"type":43,"tag":159,"props":1871,"children":1873},{"className":1872},[],[1874],{"type":48,"value":1875},"*.tfplan",{"type":43,"tag":93,"props":1877,"children":1878},{},[1879,1885],{"type":43,"tag":159,"props":1880,"children":1882},{"className":1881},[],[1883],{"type":48,"value":1884},".tfvars",{"type":48,"value":1886}," files with sensitive data",{"type":43,"tag":51,"props":1888,"children":1889},{},[1890],{"type":43,"tag":60,"props":1891,"children":1892},{},[1893],{"type":48,"value":1894},"Always commit:",{"type":43,"tag":691,"props":1896,"children":1897},{},[1898,1911],{"type":43,"tag":93,"props":1899,"children":1900},{},[1901,1903,1909],{"type":48,"value":1902},"All ",{"type":43,"tag":159,"props":1904,"children":1906},{"className":1905},[],[1907],{"type":48,"value":1908},".tf",{"type":48,"value":1910}," configuration files",{"type":43,"tag":93,"props":1912,"children":1913},{},[1914,1920],{"type":43,"tag":159,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":48,"value":1919},".terraform.lock.hcl",{"type":48,"value":1921}," (dependency lock file)",{"type":43,"tag":77,"props":1923,"children":1925},{"id":1924},"validation-tools",[1926],{"type":48,"value":1927},"Validation Tools",{"type":43,"tag":51,"props":1929,"children":1930},{},[1931],{"type":48,"value":1932},"Run before committing:",{"type":43,"tag":263,"props":1934,"children":1938},{"className":1935,"code":1936,"language":1937,"meta":268,"style":268},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","terraform fmt -recursive\nterraform validate\n","bash",[1939],{"type":43,"tag":159,"props":1940,"children":1941},{"__ignoreMap":268},[1942,1961],{"type":43,"tag":274,"props":1943,"children":1944},{"class":276,"line":277},[1945,1950,1956],{"type":43,"tag":274,"props":1946,"children":1948},{"style":1947},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1949],{"type":48,"value":18},{"type":43,"tag":274,"props":1951,"children":1953},{"style":1952},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1954],{"type":48,"value":1955}," fmt",{"type":43,"tag":274,"props":1957,"children":1958},{"style":1952},[1959],{"type":48,"value":1960}," -recursive\n",{"type":43,"tag":274,"props":1962,"children":1963},{"class":276,"line":286},[1964,1968],{"type":43,"tag":274,"props":1965,"children":1966},{"style":1947},[1967],{"type":48,"value":18},{"type":43,"tag":274,"props":1969,"children":1970},{"style":1952},[1971],{"type":48,"value":1972}," validate\n",{"type":43,"tag":51,"props":1974,"children":1975},{},[1976],{"type":48,"value":1977},"Additional tools:",{"type":43,"tag":691,"props":1979,"children":1980},{},[1981,1992],{"type":43,"tag":93,"props":1982,"children":1983},{},[1984,1990],{"type":43,"tag":159,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":48,"value":1989},"tflint",{"type":48,"value":1991}," - Linting and best practices",{"type":43,"tag":93,"props":1993,"children":1994},{},[1995,2001,2003,2009],{"type":43,"tag":159,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":48,"value":2000},"checkov",{"type":48,"value":2002}," \u002F ",{"type":43,"tag":159,"props":2004,"children":2006},{"className":2005},[],[2007],{"type":48,"value":2008},"tfsec",{"type":48,"value":2010}," - Security scanning",{"type":43,"tag":77,"props":2012,"children":2014},{"id":2013},"code-review-checklist",[2015],{"type":48,"value":2016},"Code Review Checklist",{"type":43,"tag":691,"props":2018,"children":2021},{"className":2019},[2020],"contains-task-list",[2022,2040,2055,2064,2073,2082,2091,2100,2115,2124],{"type":43,"tag":93,"props":2023,"children":2026},{"className":2024},[2025],"task-list-item",[2027,2032,2034],{"type":43,"tag":2028,"props":2029,"children":2031},"input",{"disabled":308,"type":2030},"checkbox",[],{"type":48,"value":2033}," Code formatted with ",{"type":43,"tag":159,"props":2035,"children":2037},{"className":2036},[],[2038],{"type":48,"value":2039},"terraform fmt",{"type":43,"tag":93,"props":2041,"children":2043},{"className":2042},[2025],[2044,2047,2049],{"type":43,"tag":2028,"props":2045,"children":2046},{"disabled":308,"type":2030},[],{"type":48,"value":2048}," Configuration validated with ",{"type":43,"tag":159,"props":2050,"children":2052},{"className":2051},[],[2053],{"type":48,"value":2054},"terraform validate",{"type":43,"tag":93,"props":2056,"children":2058},{"className":2057},[2025],[2059,2062],{"type":43,"tag":2028,"props":2060,"children":2061},{"disabled":308,"type":2030},[],{"type":48,"value":2063}," Files organized according to standard structure",{"type":43,"tag":93,"props":2065,"children":2067},{"className":2066},[2025],[2068,2071],{"type":43,"tag":2028,"props":2069,"children":2070},{"disabled":308,"type":2030},[],{"type":48,"value":2072}," All variables have type and description",{"type":43,"tag":93,"props":2074,"children":2076},{"className":2075},[2025],[2077,2080],{"type":43,"tag":2028,"props":2078,"children":2079},{"disabled":308,"type":2030},[],{"type":48,"value":2081}," All outputs have descriptions",{"type":43,"tag":93,"props":2083,"children":2085},{"className":2084},[2025],[2086,2089],{"type":43,"tag":2028,"props":2087,"children":2088},{"disabled":308,"type":2030},[],{"type":48,"value":2090}," Resource names use descriptive nouns with underscores",{"type":43,"tag":93,"props":2092,"children":2094},{"className":2093},[2025],[2095,2098],{"type":43,"tag":2028,"props":2096,"children":2097},{"disabled":308,"type":2030},[],{"type":48,"value":2099}," Version constraints pinned explicitly",{"type":43,"tag":93,"props":2101,"children":2103},{"className":2102},[2025],[2104,2107,2109],{"type":43,"tag":2028,"props":2105,"children":2106},{"disabled":308,"type":2030},[],{"type":48,"value":2108}," Sensitive values marked with ",{"type":43,"tag":159,"props":2110,"children":2112},{"className":2111},[],[2113],{"type":48,"value":2114},"sensitive = true",{"type":43,"tag":93,"props":2116,"children":2118},{"className":2117},[2025],[2119,2122],{"type":43,"tag":2028,"props":2120,"children":2121},{"disabled":308,"type":2030},[],{"type":48,"value":2123}," No hardcoded credentials or secrets",{"type":43,"tag":93,"props":2125,"children":2127},{"className":2126},[2025],[2128,2131],{"type":43,"tag":2028,"props":2129,"children":2130},{"disabled":308,"type":2030},[],{"type":48,"value":2132}," Security best practices applied",{"type":43,"tag":2134,"props":2135,"children":2136},"hr",{},[],{"type":43,"tag":51,"props":2138,"children":2139},{},[2140],{"type":43,"tag":2141,"props":2142,"children":2143},"em",{},[2144,2146],{"type":48,"value":2145},"Based on: ",{"type":43,"tag":68,"props":2147,"children":2149},{"href":70,"rel":2148},[72],[2150],{"type":48,"value":75},{"type":43,"tag":2152,"props":2153,"children":2154},"style",{},[2155],{"type":48,"value":2156},"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":2158,"total":429},[2159,2176,2188,2201,2215,2227,2239,2249,2264,2279,2291,2302],{"slug":2160,"name":2160,"fn":2161,"description":2162,"org":2163,"tags":2164,"stars":25,"repoUrl":26,"updatedAt":2175},"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},[2165,2168,2171,2172],{"name":2166,"slug":2167,"type":15},"AWS","aws",{"name":2169,"slug":2170,"type":15},"Deployment","deployment",{"name":23,"slug":24,"type":15},{"name":2173,"slug":2174,"type":15},"Packer","packer","2026-04-06T18:25:04.01571",{"slug":2177,"name":2177,"fn":2178,"description":2179,"org":2180,"tags":2181,"stars":25,"repoUrl":26,"updatedAt":2187},"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},[2182,2185,2186],{"name":2183,"slug":2184,"type":15},"Azure","azure",{"name":2169,"slug":2170,"type":15},{"name":2173,"slug":2174,"type":15},"2026-04-06T18:25:06.590174",{"slug":2189,"name":2189,"fn":2190,"description":2191,"org":2192,"tags":2193,"stars":25,"repoUrl":26,"updatedAt":2200},"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},[2194,2195,2198,2199],{"name":2183,"slug":2184,"type":15},{"name":2196,"slug":2197,"type":15},"Compliance","compliance",{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-04-06T18:25:16.88768",{"slug":2202,"name":2202,"fn":2203,"description":2204,"org":2205,"tags":2206,"stars":25,"repoUrl":26,"updatedAt":2214},"new-terraform-provider","scaffold new Terraform providers","Use this when scaffolding a new Terraform provider.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2207,2210,2213],{"name":2208,"slug":2209,"type":15},"Plugin Development","plugin-development",{"name":2211,"slug":2212,"type":15},"Templates","templates",{"name":17,"slug":18,"type":15},"2026-04-06T18:25:11.814973",{"slug":2216,"name":2216,"fn":2217,"description":2218,"org":2219,"tags":2220,"stars":25,"repoUrl":26,"updatedAt":2226},"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},[2221,2224,2225],{"name":2222,"slug":2223,"type":15},"API Development","api-development",{"name":2208,"slug":2209,"type":15},{"name":17,"slug":18,"type":15},"2026-04-06T18:25:07.880533",{"slug":2228,"name":2228,"fn":2229,"description":2230,"org":2231,"tags":2232,"stars":25,"repoUrl":26,"updatedAt":2238},"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},[2233,2234,2237],{"name":13,"slug":14,"type":15},{"name":2235,"slug":2236,"type":15},"Technical Writing","technical-writing",{"name":17,"slug":18,"type":15},"2026-04-06T18:25:09.261559",{"slug":2240,"name":2240,"fn":2241,"description":2242,"org":2243,"tags":2244,"stars":25,"repoUrl":26,"updatedAt":2248},"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},[2245,2246,2247],{"name":2222,"slug":2223,"type":15},{"name":2208,"slug":2209,"type":15},{"name":17,"slug":18,"type":15},"2026-04-06T18:25:10.56237",{"slug":2250,"name":2250,"fn":2251,"description":2252,"org":2253,"tags":2254,"stars":25,"repoUrl":26,"updatedAt":2263},"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},[2255,2256,2259,2260],{"name":2208,"slug":2209,"type":15},{"name":2257,"slug":2258,"type":15},"QA","qa",{"name":17,"slug":18,"type":15},{"name":2261,"slug":2262,"type":15},"Testing","testing","2026-04-06T18:25:14.352781",{"slug":2265,"name":2265,"fn":2266,"description":2267,"org":2268,"tags":2269,"stars":25,"repoUrl":26,"updatedAt":2278},"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},[2270,2271,2274,2277],{"name":2169,"slug":2170,"type":15},{"name":2272,"slug":2273,"type":15},"Governance","governance",{"name":2275,"slug":2276,"type":15},"HCP","hcp",{"name":2173,"slug":2174,"type":15},"2026-04-06T18:25:02.749563",{"slug":2280,"name":2280,"fn":2281,"description":2282,"org":2283,"tags":2284,"stars":25,"repoUrl":26,"updatedAt":2290},"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},[2285,2288,2289],{"name":2286,"slug":2287,"type":15},"Architecture","architecture",{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-04-06T18:25:20.953737",{"slug":2292,"name":2292,"fn":2293,"description":2294,"org":2295,"tags":2296,"stars":25,"repoUrl":26,"updatedAt":2301},"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},[2297,2298,2299,2300],{"name":2208,"slug":2209,"type":15},{"name":2257,"slug":2258,"type":15},{"name":17,"slug":18,"type":15},{"name":2261,"slug":2262,"type":15},"2026-04-06T18:25:13.098191",{"slug":2303,"name":2303,"fn":2304,"description":2305,"org":2306,"tags":2307,"stars":25,"repoUrl":26,"updatedAt":2314},"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},[2308,2309,2310,2313],{"name":2196,"slug":2197,"type":15},{"name":23,"slug":24,"type":15},{"name":2311,"slug":2312,"type":15},"Security","security",{"name":17,"slug":18,"type":15},"2026-07-18T05:48:20.299442",{"items":2316,"total":421},[2317,2324,2330,2337,2343,2349,2355],{"slug":2160,"name":2160,"fn":2161,"description":2162,"org":2318,"tags":2319,"stars":25,"repoUrl":26,"updatedAt":2175},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2320,2321,2322,2323],{"name":2166,"slug":2167,"type":15},{"name":2169,"slug":2170,"type":15},{"name":23,"slug":24,"type":15},{"name":2173,"slug":2174,"type":15},{"slug":2177,"name":2177,"fn":2178,"description":2179,"org":2325,"tags":2326,"stars":25,"repoUrl":26,"updatedAt":2187},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2327,2328,2329],{"name":2183,"slug":2184,"type":15},{"name":2169,"slug":2170,"type":15},{"name":2173,"slug":2174,"type":15},{"slug":2189,"name":2189,"fn":2190,"description":2191,"org":2331,"tags":2332,"stars":25,"repoUrl":26,"updatedAt":2200},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2333,2334,2335,2336],{"name":2183,"slug":2184,"type":15},{"name":2196,"slug":2197,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"slug":2202,"name":2202,"fn":2203,"description":2204,"org":2338,"tags":2339,"stars":25,"repoUrl":26,"updatedAt":2214},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2340,2341,2342],{"name":2208,"slug":2209,"type":15},{"name":2211,"slug":2212,"type":15},{"name":17,"slug":18,"type":15},{"slug":2216,"name":2216,"fn":2217,"description":2218,"org":2344,"tags":2345,"stars":25,"repoUrl":26,"updatedAt":2226},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2346,2347,2348],{"name":2222,"slug":2223,"type":15},{"name":2208,"slug":2209,"type":15},{"name":17,"slug":18,"type":15},{"slug":2228,"name":2228,"fn":2229,"description":2230,"org":2350,"tags":2351,"stars":25,"repoUrl":26,"updatedAt":2238},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2352,2353,2354],{"name":13,"slug":14,"type":15},{"name":2235,"slug":2236,"type":15},{"name":17,"slug":18,"type":15},{"slug":2240,"name":2240,"fn":2241,"description":2242,"org":2356,"tags":2357,"stars":25,"repoUrl":26,"updatedAt":2248},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2358,2359,2360],{"name":2222,"slug":2223,"type":15},{"name":2208,"slug":2209,"type":15},{"name":17,"slug":18,"type":15}]