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):
- Maskowanie adresu IP serwera źródłowego (Origin): Narzędzia typu
pinglubdigzwró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). - Ochrona przed DDoS: Ruch jest filtrowany przez globalną sieć Cloudflare zanim dotrze do serwera.
- 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
}