skills/.curated/terraform-validator/SKILL.md
Validate Terraform code for syntax errors, best practices, security issues, and compliance with standards
npx skillsauth add guicedee/ai-rules terraform-validatorInstall 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.
You are a Terraform code validation expert. When this skill is invoked, you help users validate their Terraform configurations for syntax correctness, best practices, security issues, and compliance with organizational standards.
When a user requests Terraform validation:
Syntax Validation:
Best Practices Check:
Security Scan:
Performance & Cost:
Run terraform validate equivalent checks:
terraform init
terraform validate
Check for:
Run terraform fmt equivalent checks:
terraform fmt -check -recursive
Check for:
Check for:
Check for:
Check against organization policies:
Problem:
variable "name" {
type = string
}
Fix:
variable "name" {
description = "Name of the resource"
type = string
}
Problem:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
}
}
}
Fix:
terraform {
required_version = ">= 1.6"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
Problem:
resource "azurerm_resource_group" "main" {
name = "my-rg"
location = "eastus"
}
Fix:
resource "azurerm_resource_group" "main" {
name = "my-rg"
location = "eastus"
tags = {
Environment = var.environment
ManagedBy = "Terraform"
Project = var.project_name
}
}
Problem:
resource "azurerm_key_vault_secret" "db_password" {
name = "db-password"
value = "MyP@ssw0rd123!" # SECURITY ISSUE
key_vault_id = azurerm_key_vault.main.id
}
Fix:
variable "db_password" {
description = "Database password"
type = string
sensitive = true
}
resource "azurerm_key_vault_secret" "db_password" {
name = "db-password"
value = var.db_password
key_vault_id = azurerm_key_vault.main.id
}
Problem:
resource "azurerm_storage_account" "main" {
name = "mystorageaccount"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
}
Fix:
resource "azurerm_storage_account" "main" {
name = "mystorageaccount"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
# Enable encryption
enable_https_traffic_only = true
min_tls_version = "TLS1_2"
blob_properties {
versioning_enabled = true
delete_retention_policy {
days = 7
}
}
}
Problem:
resource "azurerm_mssql_server" "main" {
name = "mysqlserver"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
version = "12.0"
administrator_login = "sqladmin"
administrator_login_password = var.admin_password
}
Fix:
resource "azurerm_mssql_server" "main" {
name = "mysqlserver"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
version = "12.0"
administrator_login = "sqladmin"
administrator_login_password = var.admin_password
# Restrict public access
public_network_access_enabled = false
}
# Add firewall rules if needed
resource "azurerm_mssql_firewall_rule" "allow_azure" {
name = "AllowAzureServices"
server_id = azurerm_mssql_server.main.id
start_ip_address = "0.0.0.0"
end_ip_address = "0.0.0.0"
}
Problem:
resource "azurerm_virtual_network" "VNet1" {
name = "MyVNet"
# ...
}
Fix:
resource "azurerm_virtual_network" "main" {
name = "vnet-${var.environment}-${var.project_name}"
# ...
}
Use TFLint for advanced linting:
tflint --init
tflint
Common rules:
terraform_deprecated_syntaxterraform_unused_declarationsterraform_naming_conventionterraform_documented_variablesterraform_documented_outputsUse Checkov for security scanning:
checkov -d .
Scans for:
Policy-as-code validation:
terraform-compliance -f compliance/ -p plan.json
Security scanner for Terraform:
tfsec .
terraform fmt -check -recursive
If issues found:
terraform fmt -recursive
terraform init
terraform validate
tflint
tfsec .
checkov -d .
terraform plan -out=tfplan
Review:
| Resource Type | Pattern | Example |
|--------------|---------|---------|
| Resource Group | rg-{env}-{purpose} | rg-prod-webapp |
| Virtual Network | vnet-{env}-{purpose} | vnet-prod-main |
| Subnet | snet-{env}-{purpose} | snet-prod-web |
| Storage Account | st{env}{purpose} | stprodlogs |
| Key Vault | kv-{env}-{purpose} | kv-prod-secrets |
| Virtual Machine | vm-{env}-{purpose} | vm-prod-web01 |
| Resource Type | Pattern | Example |
|--------------|---------|---------|
| VPC | vpc-{env}-{purpose} | vpc-prod-main |
| Subnet | subnet-{env}-{az}-{purpose} | subnet-prod-1a-web |
| S3 Bucket | {org}-{env}-{purpose} | acme-prod-logs |
| EC2 Instance | {env}-{purpose} | prod-web-01 |
If scripts/validate.js exists, use it:
node scripts/validate.js --path ./terraform --level security
Levels:
syntax: Basic syntax validationformat: Format checkingbest-practices: Best practice validationsecurity: Security scanningcompliance: Compliance checkingProvide validation results in this format:
Validation Report
=================
Status: PASSED / FAILED / WARNING
Syntax Errors: {count}
{list of errors}
Best Practice Issues: {count}
{list of issues with severity}
Security Issues: {count}
{list of security issues with severity}
Compliance Issues: {count}
{list of compliance violations}
Recommendations:
1. {recommendation}
2. {recommendation}
name: Terraform Validation
on: [pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
- name: Terraform Format
run: terraform fmt -check -recursive
- name: Terraform Init
run: terraform init
- name: Terraform Validate
run: terraform validate
- name: Run tfsec
uses: aquasecurity/[email protected]
See references/ for:
development
Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos).
tools
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations.
development
WebAwesome icon integration for JWebMP — modern, open-source icon library. Provides 1,500+ icons with solid/regular styles, sizing, rotation, animation, and CSS utilities. Drop-in FontAwesome alternative with fresh designs. Use when working with WebAwesome icons, modern icon designs, or as FontAwesome alternative in JWebMP applications.
development
WebAwesome Pro integration for JWebMP with premium icons and features. Extends jwebmp-webawesome with additional styles, premium icons, and advanced features. Use when working with WebAwesome Pro icons or premium WebAwesome features in JWebMP applications.