INTEGRITY Dokumentace

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.tf

Vyhně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 ↗).