Terraform¶
Zen Principles¶
7 principles across 5 categories, drawn from Terraform language and module best-practice documentation.
Configuration · 3 principles Documentation · 1 principle Naming · 1 principle Robustness · 1 principle Security · 1 principle
| Rule ID | Principle | Category | Severity | Dogma |
|---|---|---|---|---|
tf-001 |
Pin provider versions | Configuration | 8 | ZEN-EXPLICIT-INTENT |
tf-002 |
Pin module versions | Configuration | 8 | ZEN-EXPLICIT-INTENT |
tf-003 |
Describe variables and outputs | Documentation | 5 | ZEN-UNAMBIGUOUS-NAME |
tf-004 |
Avoid hardcoded resource IDs | Configuration | 7 | ZEN-EXPLICIT-INTENT, ZEN-UNAMBIGUOUS-NAME |
tf-005 |
Avoid hardcoded secrets | Security | 9 | ZEN-STRICT-FENCES |
tf-006 |
Configure remote state backend | Robustness | 7 | ZEN-FAIL-FAST, ZEN-EXPLICIT-INTENT, ZEN-VISIBLE-STATE |
tf-007 |
Use consistent snake_case naming | Naming | 5 | ZEN-UNAMBIGUOUS-NAME |
tf-001 — Pin provider versions
Providers should use explicit version constraints.
Universal Dogmas: ZEN-EXPLICIT-INTENT
Common Violations:
- Provider block missing explicit version pinning
tf-002 — Pin module versions
External module sources should be pinned to versions or commit refs.
Universal Dogmas: ZEN-EXPLICIT-INTENT
Common Violations:
- Module source without version pinning
tf-003 — Describe variables and outputs
Variable and output blocks should include descriptions.
Universal Dogmas: ZEN-UNAMBIGUOUS-NAME
Common Violations:
- Variable or output missing description
tf-004 — Avoid hardcoded resource IDs
Hardcoded ARNs/IDs reduce portability across environments.
Universal Dogmas: ZEN-EXPLICIT-INTENT, ZEN-UNAMBIGUOUS-NAME
Common Violations:
- Hardcoded ARN or cloud resource identifier
tf-005 — Avoid hardcoded secrets
Credentials and secrets should not be embedded in Terraform source.
Universal Dogmas: ZEN-STRICT-FENCES
Common Violations:
- Potential hardcoded secret in Terraform block
tf-006 — Configure remote state backend
Shared environments should configure an explicit remote backend.
Universal Dogmas: ZEN-FAIL-FAST, ZEN-EXPLICIT-INTENT, ZEN-VISIBLE-STATE
Common Violations:
- Terraform backend block missing
tf-007 — Use consistent snake_case naming
Resource and variable names should follow snake_case convention.
Universal Dogmas: ZEN-UNAMBIGUOUS-NAME
Common Violations:
- Resource or variable name not in snake_case
Detector Catalog¶
Configuration¶
| Detector | What It Catches | Rule IDs |
|---|---|---|
| TerraformProviderVersionPinningDetector | Flag provider blocks that omit explicit version constraints | tf-001 |
| TerraformModuleVersionPinningDetector | Flag module blocks that are not pinned to versions or refs | tf-002 |
| TerraformHardcodedIdDetector | Detect hardcoded cloud resource IDs and ARNs in assignments | tf-004 |
Documentation¶
| Detector | What It Catches | Rule IDs |
|---|---|---|
| TerraformVariableOutputDescriptionDetector | Require description fields on variable and output blocks | tf-003 |
Naming¶
| Detector | What It Catches | Rule IDs |
|---|---|---|
| TerraformNamingConventionDetector | Enforce snake_case naming for Terraform variables and resources | tf-007 |
Robustness¶
| Detector | What It Catches | Rule IDs |
|---|---|---|
| TerraformBackendConfigDetector | Ensure terraform blocks declare an explicit backend configuration | tf-006 |
Security¶
| Detector | What It Catches | Rule IDs |
|---|---|---|
| TerraformNoHardcodedSecretsDetector | Detect likely hardcoded secret values in Terraform assignments | tf-005 |
Principle → Detector Wiring
%%{init: {"theme": "base", "flowchart": {"useMaxWidth": false, "htmlLabels": true, "nodeSpacing": 40, "rankSpacing": 60}}}%%
graph TD
tf_001["tf-001<br/>Pin provider versions"]
tf_002["tf-002<br/>Pin module versions"]
tf_003["tf-003<br/>Describe variables and ou..."]
tf_004["tf-004<br/>Avoid hardcoded resource ..."]
tf_005["tf-005<br/>Avoid hardcoded secrets"]
tf_006["tf-006<br/>Configure remote state ba..."]
tf_007["tf-007<br/>Use consistent snake_case..."]
det_TerraformBackendConfigDetector["Terraform Backend<br/>Config"]
tf_006 --> det_TerraformBackendConfigDetector
det_TerraformHardcodedIdDetector["Terraform Hardcoded<br/>Id"]
tf_004 --> det_TerraformHardcodedIdDetector
det_TerraformModuleVersionPinningDetector["Terraform Module<br/>Version Pinning"]
tf_002 --> det_TerraformModuleVersionPinningDetector
det_TerraformNamingConventionDetector["Terraform Naming<br/>Convention"]
tf_007 --> det_TerraformNamingConventionDetector
det_TerraformNoHardcodedSecretsDetector["Terraform No<br/>Hardcoded Secrets"]
tf_005 --> det_TerraformNoHardcodedSecretsDetector
det_TerraformProviderVersionPinningDetector["Terraform Provider<br/>Version Pinning"]
tf_001 --> det_TerraformProviderVersionPinningDetector
det_TerraformVariableOutputDescriptionDetector["Terraform Variable<br/>Output Description"]
tf_003 --> det_TerraformVariableOutputDescriptionDetector
Detector Class Hierarchy
%%{init: {"theme": "base"}}%%
classDiagram
direction TB
class ViolationDetector {
<<abstract>>
+detect(context, config)
}
class det_01["Terraform Backend Config"]
ViolationDetector <|-- det_01
class det_02["Terraform Hardcoded Id"]
ViolationDetector <|-- det_02
class det_03["Terraform Module Version Pinning"]
ViolationDetector <|-- det_03
class det_04["Terraform Naming Convention"]
ViolationDetector <|-- det_04
class det_05["Terraform No Hardcoded Secrets"]
ViolationDetector <|-- det_05
class det_06["Terraform Provider Version Pinning"]
ViolationDetector <|-- det_06
class det_07["Terraform Variable Output Description"]
ViolationDetector <|-- det_07
Analysis Pipeline
%%{init: {"theme": "base", "flowchart": {"useMaxWidth": false, "htmlLabels": true, "nodeSpacing": 50, "rankSpacing": 70}}}%%
flowchart TD
Source(["Source Code"]) --> Parse["Parse & Tokenize"]
Parse --> Metrics["Compute Metrics"]
Metrics --> Pipeline{"7 Detectors"}
Pipeline --> Collect["Aggregate Violations"]
Collect --> Result(["AnalysisResult<br/>7 principles"])
Analysis States
%%{init: {"theme": "base"}}%%
stateDiagram-v2
[*] --> Ready
Ready --> Parsing : analyze(code)
Parsing --> Computing : AST ready
Computing --> Detecting : metrics ready
Detecting --> Reporting : 7 detectors run
Reporting --> [*] : AnalysisResult
Parsing --> Reporting : parse error (best-effort)
Configuration¶
See Also¶
- Configuration — Per-language pipeline overrides
- Understanding Violations — Severity scale reference
- Prompt Generation — Generate Terraform remediation prompts