Skip to content

Commit 358c053

Browse files
authored
feat: preserve cluster tunnel lifecycle (#36)
## Summary - import the live `cluster-apps-k3s` tunnel into OpenTofu as a durable, locally configured resource - protect the tunnel from accidental Terraform destruction - retain Terraform ownership of only the `api` and `k3s` bootstrap CNAMEs - document the boundary with cloudflare-operator local routes and workload DNS ## Migration The import block adopts the existing tunnel ID; it must not create or replace the tunnel. Merge and allow the environment-gated OpenTofu apply to finish before merging the companion Kustomize PR. Companion: makeitworkcloud/kustomize-cluster#105 ## Validation - `tofu validate -no-color` - all local pre-commit hooks passed, including TFLint, Checkov, formatting, generated Terraform docs, and secret detection - live tunnel is healthy and configured with `config_src=local`
1 parent 3512501 commit 358c053

3 files changed

Lines changed: 17 additions & 10 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
OpenTofu root for Make IT Work Cloud Cloudflare infrastructure.
44

5-
This root owns bootstrap and non-tunnel Cloudflare resources. `kustomize-cluster` owns workload TunnelBinding routes, workload CNAMEs, and ownership TXT records. For tunnel DNS conflicts, identify the current owner; do not import or recreate an operator-owned record here.
5+
This root owns the durable `cluster-apps-k3s` tunnel identity, bootstrap DNS, and non-tunnel Cloudflare resources. `kustomize-cluster` references that tunnel with `existingTunnel` and owns local ingress configuration, workload CNAMEs, and ownership TXT records through `TunnelBinding`. Do not manage local cloudflared configuration or workload DNS here.
66

77
Use GitHub MCP and PR CI plans as validation authority. `main` is an environment-gated apply path; use scoped branches and PRs, never direct pushes. Shared workflow and runner ownership belongs to `shared-workflows` and `images/tfroot-runner`. Never expose API tokens, tunnel credentials, state, decrypted SOPS data, or sensitive plans.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ No modules.
4141
| [cloudflare_zero_trust_access_identity_provider.github](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_access_identity_provider) | resource |
4242
| [cloudflare_zero_trust_access_service_token.mcp_gateway](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_access_service_token) | resource |
4343
| [cloudflare_zero_trust_organization.main](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_organization) | resource |
44+
| [cloudflare_zero_trust_tunnel_cloudflared.cluster_apps](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_tunnel_cloudflared) | resource |
4445
| [cloudflare_zero_trust_tunnel_cloudflared.warp](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_tunnel_cloudflared) | resource |
4546
| [cloudflare_zero_trust_tunnel_cloudflared_route.private_network](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_tunnel_cloudflared_route) | resource |
4647
| [cloudflare_zone.xnoto_dev](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zone) | resource |
@@ -53,7 +54,6 @@ No modules.
5354
| [cloudflare_zone_setting.minify](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zone_setting) | resource |
5455
| [cloudflare_zone_setting.polish](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zone_setting) | resource |
5556
| [cloudflare_zone_setting.rocket_loader](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zone_setting) | resource |
56-
| [cloudflare_zero_trust_tunnel_cloudflared.cluster_apps](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/data-sources/zero_trust_tunnel_cloudflared) | data source |
5757
| [cloudflare_zone.makeitwork_cloud](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/data-sources/zone) | data source |
5858
| [sops_file.secret_vars](https://registry.terraform.io/providers/carlpett/sops/latest/docs/data-sources/file) | data source |
5959

cf-tunnels.tf

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1-
# The cluster-apps tunnel is created by cloudflare-operator. This root owns the
2-
# two bootstrap DNS records that provide access to the Kubernetes API before
3-
# cluster workloads can reconcile. Workload tunnel DNS is managed by the
4-
# corresponding TunnelBinding in kustomize-cluster.
5-
data "cloudflare_zero_trust_tunnel_cloudflared" "cluster_apps" {
1+
# The cluster-apps tunnel has a durable lifecycle outside Kubernetes so a
2+
# replacement cluster can reconnect to the same tunnel ID. cloudflare-operator
3+
# owns its local ingress configuration and workload DNS through TunnelBindings.
4+
resource "cloudflare_zero_trust_tunnel_cloudflared" "cluster_apps" {
65
account_id = local.account_id
7-
filter = {
8-
name = "cluster-apps-k3s"
6+
name = "cluster-apps-k3s"
7+
config_src = "local"
8+
9+
lifecycle {
10+
prevent_destroy = true
911
}
1012
}
1113

14+
import {
15+
to = cloudflare_zero_trust_tunnel_cloudflared.cluster_apps
16+
id = "03f750691b4ad4d59aa4b7205adaa108/d17bee03-8687-46a7-831b-df48aacdea1e"
17+
}
18+
1219
locals {
1320
cluster_bootstrap_hostnames = ["api", "k3s"]
1421
}
@@ -18,7 +25,7 @@ resource "cloudflare_dns_record" "cluster_bootstrap" {
1825
zone_id = local.zone_id
1926
type = "CNAME"
2027
name = each.value
21-
content = "${data.cloudflare_zero_trust_tunnel_cloudflared.cluster_apps.id}.cfargotunnel.com"
28+
content = "${cloudflare_zero_trust_tunnel_cloudflared.cluster_apps.id}.cfargotunnel.com"
2229
proxied = true
2330
ttl = 1
2431
}

0 commit comments

Comments
 (0)