Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/terraform/configuration.md
1# Terraform Configuration Reference23Complete resource configurations for Cloudflare infrastructure.45## Zone & DNS67```hcl8# Zone + settings9resource "cloudflare_zone" "example" { account = { id = var.account_id }; name = "example.com"; type = "full" }10resource "cloudflare_zone_settings_override" "example" {11zone_id = cloudflare_zone.example.id12settings { ssl = "strict"; always_use_https = "on"; min_tls_version = "1.2"; tls_1_3 = "on"; http3 = "on" }13}1415# DNS records (A, CNAME, MX, TXT)16resource "cloudflare_dns_record" "www" {17zone_id = cloudflare_zone.example.id; name = "www"; content = "192.0.2.1"; type = "A"; proxied = true18}19resource "cloudflare_dns_record" "mx" {20for_each = { "10" = "mail1.example.com", "20" = "mail2.example.com" }21zone_id = cloudflare_zone.example.id; name = "@"; content = each.value; type = "MX"; priority = each.key22}23```2425## Workers2627### Simple Pattern (Legacy - Still Works)2829```hcl30resource "cloudflare_workers_script" "api" {31account_id = var.account_id; name = "api-worker"; content = file("worker.js")32module = true; compatibility_date = "2025-01-01"33kv_namespace_binding { name = "KV"; namespace_id = cloudflare_workers_kv_namespace.cache.id }34r2_bucket_binding { name = "BUCKET"; bucket_name = cloudflare_r2_bucket.assets.name }35d1_database_binding { name = "DB"; database_id = cloudflare_d1_database.app.id }36secret_text_binding { name = "SECRET"; text = var.secret }37}38```3940### Gradual Rollouts (Recommended for Production)4142```hcl43resource "cloudflare_worker" "api" { account_id = var.account_id; name = "api-worker" }44resource "cloudflare_worker_version" "api_v1" {45account_id = var.account_id; worker_name = cloudflare_worker.api.name46content = file("worker.js"); content_sha256 = filesha256("worker.js")47compatibility_date = "2025-01-01"48bindings {49kv_namespace { name = "KV"; namespace_id = cloudflare_workers_kv_namespace.cache.id }50r2_bucket { name = "BUCKET"; bucket_name = cloudflare_r2_bucket.assets.name }51}52}53resource "cloudflare_workers_deployment" "api" {54account_id = var.account_id; worker_name = cloudflare_worker.api.name55versions { version_id = cloudflare_worker_version.api_v1.id; percentage = 100 }56}57```5859### Worker Binding Types (v5)6061| Binding | Attribute | Example |62|---------|-----------|---------|63| KV | `kv_namespace_binding` | `{ name = "KV", namespace_id = "..." }` |64| R2 | `r2_bucket_binding` | `{ name = "BUCKET", bucket_name = "..." }` |65| D1 | `d1_database_binding` | `{ name = "DB", database_id = "..." }` |66| Service | `service_binding` | `{ name = "AUTH", service = "auth-worker" }` |67| Secret | `secret_text_binding` | `{ name = "API_KEY", text = "..." }` |68| Queue | `queue_binding` | `{ name = "QUEUE", queue_name = "..." }` |69| Vectorize | `vectorize_binding` | `{ name = "INDEX", index_name = "..." }` |70| Hyperdrive | `hyperdrive_binding` | `{ name = "DB", id = "..." }` |71| AI | `ai_binding` | `{ name = "AI" }` |72| Browser | `browser_binding` | `{ name = "BROWSER" }` |73| Analytics | `analytics_engine_binding` | `{ name = "ANALYTICS", dataset = "..." }` |74| mTLS | `mtls_certificate_binding` | `{ name = "CERT", certificate_id = "..." }` |7576### Routes & Triggers7778```hcl79resource "cloudflare_worker_route" "api" {80zone_id = cloudflare_zone.example.id; pattern = "api.example.com/*"81script_name = cloudflare_workers_script.api.name82}83resource "cloudflare_worker_cron_trigger" "task" {84account_id = var.account_id; script_name = cloudflare_workers_script.api.name85schedules = ["*/5 * * * *"]86}87```8889## Storage (KV, R2, D1)9091```hcl92# KV93resource "cloudflare_workers_kv_namespace" "cache" { account_id = var.account_id; title = "cache" }94resource "cloudflare_workers_kv" "config" {95account_id = var.account_id; namespace_id = cloudflare_workers_kv_namespace.cache.id96key_name = "config"; value = jsonencode({ version = "1.0" })97}9899# R2100resource "cloudflare_r2_bucket" "assets" { account_id = var.account_id; name = "assets"; location = "WNAM" }101102# D1 (migrations via wrangler) & Queues103resource "cloudflare_d1_database" "app" { account_id = var.account_id; name = "app-db" }104resource "cloudflare_queue" "events" { account_id = var.account_id; name = "events-queue" }105```106107## Pages108109```hcl110resource "cloudflare_pages_project" "site" {111account_id = var.account_id; name = "site"; production_branch = "main"112deployment_configs {113production {114compatibility_date = "2025-01-01"115environment_variables = { NODE_ENV = "production" }116kv_namespaces = { KV = cloudflare_workers_kv_namespace.cache.id }117d1_databases = { DB = cloudflare_d1_database.app.id }118}119}120build_config { build_command = "npm run build"; destination_dir = "dist" }121source { type = "github"; config { owner = "org"; repo_name = "site"; production_branch = "main" }}122}123124resource "cloudflare_pages_domain" "custom" {125account_id = var.account_id; project_name = cloudflare_pages_project.site.name; domain = "site.example.com"126}127```128129## Rulesets (WAF, Redirects, Cache)130131```hcl132# WAF133resource "cloudflare_ruleset" "waf" {134zone_id = cloudflare_zone.example.id; name = "WAF"; kind = "zone"; phase = "http_request_firewall_custom"135rules { action = "block"; enabled = true; expression = "(cf.client.bot) and not (cf.verified_bot)" }136}137138# Redirects139resource "cloudflare_ruleset" "redirects" {140zone_id = cloudflare_zone.example.id; name = "Redirects"; kind = "zone"; phase = "http_request_dynamic_redirect"141rules {142action = "redirect"; enabled = true; expression = "(http.request.uri.path eq \"/old\")"143action_parameters { from_value { status_code = 301; target_url { value = "https://example.com/new" }}}144}145}146147# Cache rules148resource "cloudflare_ruleset" "cache" {149zone_id = cloudflare_zone.example.id; name = "Cache"; kind = "zone"; phase = "http_request_cache_settings"150rules {151action = "set_cache_settings"; enabled = true; expression = "(http.request.uri.path matches \"\\.(jpg|png|css|js)$\")"152action_parameters { cache = true; edge_ttl { mode = "override_origin"; default = 86400 }}153}154}155```156157## Load Balancers158159```hcl160resource "cloudflare_load_balancer_monitor" "http" {161account_id = var.account_id; type = "http"; path = "/health"; interval = 60; timeout = 5162}163resource "cloudflare_load_balancer_pool" "api" {164account_id = var.account_id; name = "api-pool"; monitor = cloudflare_load_balancer_monitor.http.id165origins { name = "api-1"; address = "192.0.2.1" }166origins { name = "api-2"; address = "192.0.2.2" }167}168resource "cloudflare_load_balancer" "api" {169zone_id = cloudflare_zone.example.id; name = "api.example.com"170default_pool_ids = [cloudflare_load_balancer_pool.api.id]; steering_policy = "geo"171}172```173174## Access (Zero Trust)175176```hcl177resource "cloudflare_access_application" "admin" {178account_id = var.account_id; name = "Admin"; domain = "admin.example.com"; type = "self_hosted"179session_duration = "24h"; allowed_idps = [cloudflare_access_identity_provider.github.id]180}181resource "cloudflare_access_policy" "allow" {182account_id = var.account_id; application_id = cloudflare_access_application.admin.id183name = "Allow"; decision = "allow"; precedence = 1184include { email = ["[email protected]"] }185}186resource "cloudflare_access_identity_provider" "github" {187account_id = var.account_id; name = "GitHub"; type = "github"188config { client_id = var.github_id; client_secret = var.github_secret }189}190```191192## See Also193194- [README](./README.md) - Provider setup195- [API](./api.md) - Data sources196- [Patterns](./patterns.md) - Use cases197- [Troubleshooting](./gotchas.md) - Issues198