Use when writing Terraform.
52
57%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./terraform/SKILL.mdtry() for fail-safe defaults; prefer over element(concat()) for robust error handling.nullable = false in variables to prevent null assignments and reduce misconfiguration.moved blocks to refactor resources/modules efficiently, avoiding destroy/recreate cycles.optional() with defaults for flexible object field handling.# Use descriptive, contextual names:
resource "aws_instance" "web_server" {}
resource "aws_s3_bucket" "application_logs" {}
# Avoid generic names:
resource "aws_instance" "main" {}
resource "aws_s3_bucket" "bucket" {}
# Use "this" only for primary resources inside reusable modules (singletons):
resource "aws_vpc" "this" {}
resource "aws_security_group" "this" {}# Prefer context-rich, specific names:
var.vpc_cidr_block
var.database_instance_classmain.tf: Core resources.variables.tf: Input variables.outputs.tf: Output values.versions.tf: Provider versions.data.tf: (Optional) Data sources.examples/ for usage docs and test fixtures.envs/ # Environment configs
├── prod/
├── staging/
└── dev/
modules/ # Reusable modules
├── networking/
├── compute/
└── data/
examples/ # Usage/test examples
├── complete/
└── minimal/Resource → Resource Module → Infrastructure Module → Composition
| Type | Use Case | Scope |
|---|---|---|
| Resource Module | Group related resources | VPC + subnets, SG + rules |
| Infra Module | Combine resource modules for a goal | Multiple modules, one region/account |
| Composition | Full infrastructure deployment | Across regions/accounts |
Follow these for conditionals and stable resource addressing:
Boolean condition:
# Boolean condition using for_each (stable addressing, no [0] index):
resource "aws_nat_gateway" "this" {
for_each = var.create_nat_gateway ? { this = true } : {}
# example fields:
allocation_id = aws_eip.nat[each.key].id
subnet_id = aws_subnet.public[each.key].id
}Stable referencing with for_each:
# Safer when removing AZs:
resource "aws_subnet" "private" {
for_each = toset(var.availability_zones)
availability_zone = each.key
}
# count risks larger changes (don't do this):
resource "aws_subnet" "private" {
count = length(var.availability_zones)
availability_zone = var.availability_zones[count.index]
}.tf or .tfvars; avoid committing secrets to version control.sensitive = true for UI redaction.0.0.0.0/0).202a75a
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.