Zarządzanie infrastrukturą sieciową i DNS za pomocą podejścia Infrastructure as Code (IaC) przynosi ogromne korzyści. Wykorzystanie Terraform do konfiguracji Cloudflare pozwala na:

  • Wersjonowanie zmian: Każda modyfikacja rekordu DNS lub reguły bezpieczeństwa przechodzi przez system kontroli wersji (Git).
  • Szybkość wprowadzania zmian i łatwiejsze maintainability: Szybko wdrażaj spójne standardy bezpieczeństwa oraz optymalizacji w dziesiątkach stref (domen).
  • Audytowalność: Łatwe śledzenie, kto, kiedy i dlaczego wprowadził daną zmianę w infrastrukturze sieciowej.

Dodawanie nowej strefy (Zone)

W Terraform nową domenę w Cloudflare rejestrujemy za pomocą zasobu cloudflare_zone. Wymaga to podania identyfikatora konta Cloudflare (account_id) oraz nazwy domeny (zone).

Przykład kodu:

resource "cloudflare_zone" "nowa_domena" {
  account_id = "09dd5ff9f189eb15e69faa14bed61ed3"
  zone       = "przyklad.pl"
}

Po dodaniu strefy, Cloudflare wygeneruje dla niej dedykowane serwery nazw (Nameservers), które należy wskazać u rejestratora domeny (np. OVH).

Usprawnienie Bezpieczeństwa (Security): Ukrywanie rekordów A

Jedną z kluczowych zalet Cloudflare jest funkcja proxy. W kodzie Terraform konfiguruje się ją parametrem proxied = true na rekordach DNS typu A, AAAA lub CNAME.

resource "cloudflare_record" "root_a" {
  zone_id = cloudflare_zone.nowa_domena.id
  name    = "@"
  content = "185.56.209.219"
  type    = "A"
  proxied = true # Aktywacja Cloudflare Proxy
}

Korzyści z ukrycia rekordu A (Proxying):

  1. Maskowanie adresu IP serwera źródłowego (Origin): Narzędzia typu ping lub dig zwrócą adresy IP należące do Anycastowej sieci Cloudflare, a nie rzeczywisty adres Twojego serwera. Chroni to infrastrukturę przed bezpośrednimi atakami (np. DDoS na poziomie IP).
  2. Ochrona przed DDoS: Ruch jest filtrowany przez globalną sieć Cloudflare zanim dotrze do serwera.
  3. Web Application Firewall (WAF) & SSL: Cloudflare automatycznie obsługuje certyfikaty SSL/TLS na brzegu sieci (Edge) i chroni aplikację przed popularnymi podatnościami (SQL Injection, XSS) bez obciążania serwera.

Usprawnienie Wydajności (Performance): Cache Rules

Aby zoptymalizować czas ładowania strony i odciążyć serwer, możemy zaimplementować reguły buforowania (Cache Rules) za pomocą zasobu cloudflare_ruleset z fazą http_request_cache_settings.

Przykład zaawansowanej konfiguracji Cache w Terraform:

resource "cloudflare_ruleset" "cache_rules" {
  zone_id = cloudflare_zone.nowa_domena.id
  name    = "Reguly Cache"
  kind    = "zone"
  phase   = "http_request_cache_settings"

  # 1. Buforowanie zasobów statycznych na 30 dni
  rules {
    description = "Cache static assets"
    expression  = "(http.host eq \"przyklad.pl\") and (http.request.uri.path wildcard \"*.css\" or http.request.uri.path wildcard \"*.js\" or http.request.uri.path wildcard \"*.webp\" or http.request.uri.path wildcard \"*.woff2\")"
    action      = "set_cache_settings"
    enabled     = true

    action_parameters {
      cache = true
      edge_ttl {
        mode    = "override_origin"
        default = 2592000 # 30 dni w pamięci podręcznej Cloudflare
      }
      browser_ttl {
        mode    = "override_origin"
        default = 86400   # 1 dzień w przeglądarce użytkownika
      }
    }
  }

  # 2. Ominięcie Cache dla paneli administratora (np. WordPress / Ghost)
  rules {
    description = "Bypass cache for admin panel"
    expression  = "(http.host eq \"przyklad.pl\") and (http.request.uri.path contains \"/wp-admin\" or http.request.uri.path contains \"wp-login.php\")"
    action      = "set_cache_settings"
    enabled     = true

    action_parameters {
      cache = false
    }
  }
}

Dzięki temu statyczne zasoby są serwowane bezpośrednio z najbliższego geograficznie serwera Cloudflare (Edge), drastycznie zmniejszając opóźnienia (Latency), podczas gdy dynamiczne panele administracyjne zawsze pobierają świeże dane z serwera.

Usprawnienie Zarządzalności (Maintainability)

Zamiast powtarzać klocki kodu dla każdej domeny, w Terraform warto wykorzystać konstrukcję for_each w połączeniu z lokalnymi mapami (locals). Pozwala to zarządzać dziesiątkami domen w jednym, czytelnym pliku konfiguracyjnym.

Przykład czystej architektury DRY (Don’t Repeat Yourself):

locals {
  zones = {
    domena_a = { id = cloudflare_zone.domena_a.id, domain = "domena-a.pl" }
    domena_b = { id = cloudflare_zone.domena_b.id, domain = "domena-b.pl" }
  }
}

# Jeden blok kodu tworzy rekordy dla WSZYSTKICH domen zdefiniowanych w locals
resource "cloudflare_record" "root_a" {
  for_each = local.zones
  zone_id  = each.value.id
  name     = "@"
  content  = "185.56.209.219"
  type     = "A"
  proxied  = true
}