DevOps & Tooling · Claude Code (via permissions.deny)
Terraform & OpenTofu IaC .claudeignore
A .claudeignore for Terraform & OpenTofu IaC: the paths Claude Code should stay out of, with matching permissions.deny rules.
- Path
- .claudeignore
- Loads
- Pattern list
- Format
- gitignore syntax
- Used by
- Claude Code (via permissions.deny)
What this file tells the agent
Claude Code reads files while it works. This .claudeignore keeps the list of Terraform & OpenTofu IaC paths it should stay out of (build output, large binaries, logs and secrets). Copy the sensitive ones into permissions.deny in .claude/settings.json, which Claude Code enforces.
- Pin explicit version constraints for all providers and required Terraform/OpenTofu core versions (required_providers).
- Store state securely in remote backends (S3 with DynamoDB state locking or GCS/Terraform Cloud); ban local terraform.tfstate.
- Enforce mandatory resource tagging (Environment, Project, Owner, ManagedBy) on all provisioned cloud assets.
- Never hardcode secrets, API keys, or master database passwords; inject via secure variables with sensitive = true or secret managers.
- Declare explicit lifecycle { prevent_destroy = true } blocks on critical production databases and storage buckets.
Code to avoid, and what to write instead
The rule steers the agent away from the left and toward the right.
# Dangerous: Hardcoded secret, no version lock, unmanaged state
resource "aws_db_instance" "bad_db" {
engine = "postgres"
password = "plaintextpassword123" # Leaked credentials in git!
}terraform {
required_version = ">= 1.7.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.40"
}
}
backend "s3" {
bucket = "corp-tf-state-prod"
key = "vpc/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
resource "aws_db_instance" "primary" {
identifier = "app-db-prod"
allocated_storage = 50
engine = "postgres"
instance_class = "db.r6g.large"
password = var.db_password
skip_final_snapshot = false
lifecycle {
prevent_destroy = true
}
}Install it in one command
- 01
Go to your project root
The file goes at .claudeignore, relative to the root.
- 02
Download the file
Run the command on the right. It downloads this preset and writes the file.
- 03
Make sure it gets used
Claude Code does not enforce .claudeignore by itself. Copy the sensitive paths into permissions.deny in .claude/settings.json, which it does enforce.
$ curl -fsSL "https://www.devscratchpad.tech/api/raw/claudeignore/terraform-iac" -o ".claudeignore"
writes .claudeignore
.claudeignore
To write the file from your own code instead, use Read your code or Convert Legacy Rules in the editor above.
More for Terraform & OpenTofu IaC
Questions
- Does Claude Code honor .claudeignore?
- Not by itself. Claude Code enforces permission rules, so copy the sensitive paths into permissions.deny in .claude/settings.json, for example Read(./.env). Keep .claudeignore in the repository root as the reviewable list.
- What should I put in .claudeignore?
- Exclude large build caches, minified bundles, lockfiles, and environment files containing sensitive credentials.