IA
iamask/cloudflare_terraform
Cloudflare Terraform multi account
Cloudflare Terraform Configuration
Enterprise zone and account-level configuration using Terraform Provider v5. State managed by Terraform Cloud with GitHub Actions integration.
๐ Project Structure
cloudflare_terraform/
โโโ main.tf # Root configuration
โโโ terraform.tfvars.example # Example variables
โโโ accounts/
โ โโโ account_a/
โ โ โโโ custom_rulesets/ # Account-level custom WAF rules
โ โ โโโ waf_managed_rulesets/ # Cloudflare & OWASP managed rulesets
โ โ โโโ ratelimit_rulesets/ # Account-level rate limiting
โ โ โโโ zone_tf_zxc_co_in/ # Zone-specific configuration
โ โ โโโ dns/ # DNS records
โ โ โโโ security/ # WAF, custom rules, rate limiting
โ โ โโโ rules/ # Transform, redirect, cache rules
โ โ โโโ tls/ # SSL/TLS settings
โ โ โโโ zone_settings/ # Zone-level settings
โ โโโ account_b/ # Additional account configuration
โ โโโ main.tf # Account B configuration (to be defined)
Note: Additional accounts can be configured similarly under the
accounts/directory to manage multi-account deployments.
๐ Features
Account-Level:
- Custom WAF rulesets
- Managed WAF (Cloudflare & OWASP Core Ruleset)
- Rate limiting rules
Zone-Level:
- DNS management
- Security (WAF, custom rules, rate limiting)
- Rules (transform, redirect, cache, origin)
- TLS/SSL configuration
- Zone settings
๐ Requirements
- Terraform >= 1.5.0
- Cloudflare Provider ~> 5.0
- Cloudflare API Token (Create Token)
- Account ID & Zone ID (Find IDs)
๐ง Quick Start
# Clone repository
git clone <repository-url>
# Initialize Terraform
terraform init
# Review changes
terraform plan
# Apply configuration
terraform applyโ ๏ธ Important Note
Ruleset Modification Behavior:
โ In-place updates (no downtime):
- Modifying rule expressions (e.g., changing hostnames)
- Updating descriptions or enabled status
- Simple property changes within existing rules
โ Full replacement (brief disruption):
- Adding or removing rules from the array
- Changing fundamental properties (kind, phase)
- Major structural changes to the ruleset
# Example: Expression changes = UPDATE
expression = "host eq \"api.example.com\"" โ "host eq \"api2.example.com\"" # โ
In-place update
# Example: Adding/removing rules = REPLACE
rules = [
{ action = "block", ... }, # Existing
{ action = "log", ... } # โ Adding new rule causes replacement
]๐ก Mitigation Strategies
1. Use Multiple Smaller Rulesets
# Instead of one large ruleset, split by purpose
resource "cloudflare_ruleset" "security_rules" { ... } # Security-focused rules
resource "cloudflare_ruleset" "api_rules" { ... } # API protection rules
resource "cloudflare_ruleset" "geo_rules" { ... } # Geo-blocking rules
# Changes to one ruleset won't affect others2. Use Lifecycle Meta-Argument
resource "cloudflare_ruleset" "account_custom_ruleset" {
# ... ruleset configuration ...
lifecycle {
create_before_destroy = true # Creates new ruleset before destroying old one
}
}
# Minimizes downtime during replacement๐ References
On this page
Languages
HCL100.0%
Contributors
Latest Release
account_levelAugust 31, 2025Created February 23, 2025
Updated August 31, 2025