← Poskytovatel Cloudflare Terraform / terraform / advanced-topics
Osvědčené postupy
Ačkoli je každé nasazení Terraformu jedinečné, řiďte se těmito osvědčenými postupy, abyste si zajistili úspěch.
Spravujte prostředky Terraformu v Terraformu
Terraform funguje nejlépe, když spravuje všechny změny a celý životní cyklus daného prostředku.
Po každé operaci s konfigurací se Terraform pokusí rozdíly sladit synchronizací vzdáleného stavu do stavu lokálního. Pokud se lokální a vzdálený stav liší, například kvůli správě prostředků mimo Terraform, může být nutné prostředek ve stavovém souboru smazat a znovu vytvořit (obvykle pomocí importu), protože ne všechny prostředky podporují aktualizaci na místě.
Struktura adresářů
Cloudflare doporučuje používat strukturu adresářů, která pro izolaci změn kombinuje účty, zóny a produkty. Toto nastavení umožňuje přesně definovat vlastníky a omezit operace Terraformu na konkrétní produkt v dané zóně. Zároveň lépe sladí vlastníky se strukturou Cloudflare výchozí role, a také další nástroje, jako je úložiště AWS nebo GCP, díky oprávněním pro samostatné stavové soubory.
U produktů, které pokrývají mnoho oblastí, jako jsou Rulesets, můžete jít ještě dál a rozdělit konfiguraci podle fází (WAF, přesměrování, origin rules).
example-tf/
├── demo_account_a # per account segregation of resources
│ ├── users # top level directory for account members as they are "zoneless"
│ │ ├── provider.tf # `provider.tf` is for configuring the providers
│ │ ├── users.tf # `<subject>.tf` (users.tf) is for managing the individual resources
│ │ └── vars.tf # manage all variables for this component
│ ├── zone_a # group all zone based features together
│ │ ├── dns # individual (or grouped, your choice) of products or features to manage together
│ │ │ ├── dns.tf # `<subject>.tf` (dns.tf) is for managing the individual resources
│ │ │ ├── provider.tf # `provider.tf` is for configuring the providers
│ │ │ └── vars.tf # manage all variables for this component
│ │ └── page_rules # ... same as above but for Page Rules
│ │ ├── page_rules.tf
│ │ ├── provider.tf
│ │ └── vars.tf
│ ├── zone_b
│ │ ├── dns
│ │ │ ├── dns.tf
│ │ │ ├── provider.tf
│ │ │ └── vars.tf
│ │ └── page_rules
│ │ ├── page_rules.tf
│ │ ├── provider.tf
│ │ └── vars.tf
│ └── zone_c
│ ├── dns
│ │ ├── dns.tf
│ │ ├── provider.tf
│ │ └── vars.tf
│ └── page_rules
│ ├── page_rules.tf
│ ├── provider.tf
│ └── vars.tf
└── demo_account_b
├── users
│ ├── provider.tf
│ ├── users.tf
│ └── vars.tf
├── zone_a
│ ├── dns
│ │ ├── dns.tf
│ │ ├── provider.tf
│ │ └── vars.tf
│ └── page_rules
│ ├── page_rules.tf
│ ├── provider.tf
│ └── vars.tf
├── zone_b
│ ├── dns
│ │ ├── dns.tf
│ │ ├── provider.tf
│ │ └── vars.tf
│ └── page_rules
│ ├── page_rules.tf
│ ├── provider.tf
│ └── vars.tf
└── zone_c
├── dns
│ ├── dns.tf
│ ├── provider.tf
│ └── vars.tf
└── page_rules
├── page_rules.tf
├── provider.tf
└── vars.tfVyhněte se modulům (nebo je používejte jen střídmě)
Moduly Terraformu slouží k zapouzdření více prostředků s logikou do jednoho abstrahovaného rozhraní. Uvažme příklad, kdy modul nastaví výchozí load balancer s poolem, několika záznamy DNS a případně page rule. Koncový uživatel jej pak může použít takto:
module "example" "an_example_site" {
domain = "example.com"
origin_ip = "192.168.0.1"
}Z hlediska prostředků Terraformu by však výše uvedený příklad odpovídal tomuto zápisu:
resource "cloudflare_record" "example_1" {
zone_id = var.cloudflare_zone_id
name = "terraform"
value = "198.51.100.11"
type = "A"
ttl = 3600
}
resource "cloudflare_record" "example_2" {
zone_id = var.cloudflare_zone_id
name = "terraform"
value = "198.51.100.12"
type = "A"
ttl = 3600
}
resource "cloudflare_record" "example_3" {
zone_id = var.cloudflare_zone_id
name = "terraform"
value = "198.51.100.13"
type = "A"
ttl = 3600
}
resource "cloudflare_load_balancer" "bar" {
zone_id = var.cloudflare_zone_id
name = "example-load-balancer.example.com"
fallback_pool_id = cloudflare_load_balancer_pool.foo.id
default_pool_ids = [cloudflare_load_balancer_pool.foo.id]
description = "example load balancer using geo-balancing"
proxied = true
steering_policy = "geo"
pop_pools {
pop = "LAX"
pool_ids = [cloudflare_load_balancer_pool.foo.id]
}
country_pools {
country = "US"
pool_ids = [cloudflare_load_balancer_pool.foo.id]
}
region_pools {
region = "WNAM"
pool_ids = [cloudflare_load_balancer_pool.foo.id]
}
rules {
name = "example rule"
condition = "http.request.uri.path contains \"testing\""
fixed_response {
message_body = "hello"
status_code = 200
content_type = "html"
location = "www.example.com"
}
}
}
resource "cloudflare_load_balancer_pool" "example_lb_pool" {
name = "example-lb-pool"
origins {
name = "example-1"
address = "198.51.100.1"
enabled = true
}
}
resource "cloudflare_page_rule" "example_page_rule" {
zone_id = var.cloudflare_zone_id
target = "sub.${var.cloudflare_zone}/page"
priority = 1
actions {
ssl = "flexible"
email_obfuscation = "on"
}
}Toto nastavení je sice pohodlné, ale může způsobit neočekávané problémy. Pokud je modul sdílený a následně se v něm provedou vnitřní změny, mohou se jeho prostředky dostat mimo synchronizaci nebo se znovu vytvořit.
Používání modulů navíc ztěžuje ladění a reprodukci problémů, protože musíte počítat i s možnými logickými chybami mimo jádro Terraformu a poskytovatele Cloudflare.
Migrace prostředků do Terraformu
Cloudflare doporučuje použít cf-terraforming a migrujte existující prostředky do Cloudflare.
Spravujte některé prostředky mimo Terraform
Je zcela v pořádku spravovat některé prostředky v Terraformu a jiné pomocí odlišného nástroje, dejte si však pozor, abyste provádění obojího pro stejný prostředek.
Používejte oddělená prostředí
Chcete-li bezpečně spravovat oddělená prostředí (staging, QA, UAT, produkce), použijte samostatné účty Cloudflare se samostatnými doménami (například example.com a example-staging.com).
Je to proto, že některé produkty definované na úrovni účtu jsou sdílené (například monitory a pooly Load Balanceru) a nemůžete v nich provést izolovanou změnu, pokud jsou ve stejném účtu. Použití samostatných účtů je výhodné i tehdy, chcete-li testovat například DNSSEC, protože jeho nesprávná konfigurace může ovlivnit celou vaši doménu.
Chcete-li minimalizovat rozdíly (drift), používejte Terraform a pipeline CI/CD, která běží napříč oběma doménami a podle potřeby je udržuje synchronizované.
Bezpečně ukládejte přihlašovací údaje
Nedoporučujeme ukládat přihlašovací údaje Cloudflare v prostém textu.
Lokálně můžete použít nástroj třetí strany, jako je cf-vault ↗ pro uložení přihlašovacích údajů Cloudflare.
Pro CI pipeline použijte interní nebo tajný úložný nástroj (například Vault ↗).