npx skillsauth add bkircher/skills terraformInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
try() 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_class
main.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).testing
Use when writing or updating unit tests (in any language).
testing
Design and optimize a PostgreSQL-specific schema. Use for PostgreSQL best practices, data types, indexing, constraints, performance patterns, and advanced features.
tools
Automate browser interactions, test web pages and work with Playwright tests.
documentation
Use when asked to write a Jira ticket.