π Managing Cloudflare DNS with Terraform
ZONE_ID="" API_TOKEN=""
tf vars file for token
cloudflare_api_token = "" cloudflare_zone_id = ""
Using Azure Blob Storage for State Backend
terraform init -migrate-state export ARM_ACCESS_KEY=""
This repository automates the management of Cloudflare DNS records using Terraform.
It includes scripts to import existing DNS records, generate Terraform configurations, and apply changes efficiently.
π Directory Structure
.
βββ account-personal/ # Contains different accounts/domains
β βββ ahmadraza.in/ # Terraform configs for ahmadraza.in
β βββ kubecloud.in.net/ # Terraform configs for kubecloud.in.net
β βββ users/ # Other Cloudflare-related user settings
βββ cf-terraforming/ # Terraforming scripts for Cloudflare
βββ import.sh # Script to import existing DNS records into Terraform state
βββ import.tf # Terraform resource blocks generated from Cloudflare records
βββ main.tf # Main Terraform configuration
βββ output.tf # Terraform outputs
βββ provider.tf # Cloudflare provider configuration
βββ README.md # Documentation (You're reading it!)
βββ secret.md # Stores API keys and sensitive information (DO NOT SHARE!)
βββ terraform.tfstate # Terraform state file (tracks deployed resources)
βββ terraform.tfstate.backup # Backup of Terraform state
βββ terraform.tfvars # Terraform variables
βββ tf-gen.sh # Script to generate Terraform resource blocks
βββ variables.tf # Variable definitions for Terraform
π οΈ Setup Requirements
To use this Terraform setup for managing Cloudflare DNS, you need:
1οΈβ£ Cloudflare API Token
Generate an API token with the following permissions:
- Zone.Zone Read
- Zone.DNS Read & Write
π‘ How to generate API Token:
- Go to Cloudflare Dashboard (opens in a new tab)
- Navigate to My Profile > API Tokens
- Create a custom token with the above permissions
- Copy and save the token securely (you'll need it for Terraform)
2οΈβ£ Cloudflare Zone ID
Each Cloudflare domain (zone) has a unique Zone ID.
π‘ How to find your Zone ID:
- Go to Cloudflare Dashboard (opens in a new tab)
- Select your domain
- Under Overview, find the Zone ID at the bottom of the page.
π Step-by-Step Usage
1οΈβ£ Configure Terraform Provider
Edit the provider.tf
file with your API token:
provider "cloudflare" {
api_token = "your-cloudflare-api-token"
}
Alternatively, set it as an environment variable:
export CLOUDFLARE_API_TOKEN="your-cloudflare-api-token"
2οΈβ£ Generate Terraform Resource Blocks
Use the tf-gen.sh
script to fetch existing Cloudflare DNS records and create Terraform configuration:
bash tf-gen.sh
This will generate import.tf
containing Terraform resource blocks for each DNS record.
3οΈβ£ Import Existing Cloudflare DNS Records
Run the import.sh
script to import existing records into Terraform state:
bash import.sh
This prevents Terraform from trying to recreate records that already exist.
4οΈβ£ Apply Terraform Configuration
After importing, run Terraform to verify and apply changes:
terraform init
terraform plan
terraform apply
π Handling DNS Record Changes
- To add new records: Modify
main.tf
and runterraform apply
. - To update existing records: Change
main.tf
and runterraform plan
to preview changes. - To remove records: Delete the record from
main.tf
and runterraform apply
.
π₯ Troubleshooting
π Terraform is trying to recreate existing records
If terraform plan
shows it will recreate existing records, it's likely because:
- The import was not done correctly
- The imported state differs from the generated Terraform code
β
Solution: Ensure you run import.sh
before terraform plan
.
π Example Terraform Configuration
A typical DNS record managed with Terraform looks like this:
resource "cloudflare_dns_record" "example" {
zone_id = "947884535b3bc67c60b37af84c91a744"
name = "example"
type = "A"
content = "198.51.100.4"
proxied = true
ttl = 1
}
π― Next Steps
- Automate DNS updates using CI/CD
- Manage multiple Cloudflare accounts using workspaces
- Enhance security by using environment variables for sensitive data
π€ Author
Ahmad Raza - ahmadraza.in (opens in a new tab)
For more guides, visit: docs.ahmadraza.in (opens in a new tab) π
π What This README Covers
βοΈ Terraform setup for Cloudflare DNS
βοΈ Generating Terraform configuration from existing records
βοΈ Importing existing DNS records into Terraform state
βοΈ Managing DNS records efficiently
βοΈ Troubleshooting common issues