Lekcja 2 · Dzień 3

Terraform, jak u dorosłych

Nie „umiem terraform apply”. Oni chcą: moduły, versioning, kontrakt interfejsu, remote state, lock, drift, migracja state, czytanie planu, orchestrację przez Spacelift.

Moduły, wersjonowanie, kontrakt

Moduł, z którego korzysta 20 zespołów, to produkt. Ma:

Jedna implementacja pod ECS i EKS? Dwa moduły z tym samym interfejsem (service) albo jeden z runtime = ecs|eks na czas migracji. Drugie jest wygodniejsze dla 20 callerów, pierwsze czystsze. Na rozmowie powiedz trade-off i że przez migrację trzymasz fasadę.

Remote state, lock, drift

Shared module + drift Najgorszy wariant: 20 stacków woła moduł v2.4, ktoś hotfixem zmienia SG w jednym koncie w konsoli, następny apply modułu na innym koncie jest czysty, a ten jeden ma 40 linii planu „które nie powinny istnieć”. Historia z raportu: zepsuty state / drift w shared module. Przygotuj swoją.

Migracja state

Rozbijanie monolitu, przenoszenie zasobu między modułami, zmiana nazwy. Narzędzia:

Plan po migracji musi pokazać 0 to destroy, 0 to replace dla tych zasobów. Jeśli widzisz replace na RDS albo na KMS — stop.

Czytanie planu

JD: „You're comfortable reading a plan output.” Kolory, które mają Cię obudzić:

W planieCo robisz
createOK, jeśli się spodziewasz. Sprawdź nazwę i konto.
update in-placeZwykle OK. Uważaj na SG ingress, IAM policy (może chwilowo otworzyć), parameter group RDS.
replace (force new)Czytaj forces replacement. Replace ALB = DNS blip. Replace RDS = dane. Replace KMS = wszystko, co tym kluczem zaszyfowane, staje się problemem.
destroyWymaga uzasadnienia w PR. W Spacelift: policy „destroy w prod wymaga approval + 2 reviewers”.
zmiana w aws_iam_role_policy na *Blokuj policy-as-code, nie okiem.

Spacelift / Atlantis / Terraform Cloud

JD wymaga Spacelift albo analoga. Rzetelne różnice (dokumentacja vendorów, nie marketingowe hasła):

SpaceliftAtlantisHCP Terraform
ModelSaaS + opcjonalnie private workers w Twoim VPCSelf-host, GitOps komentarze w PRSaaS HashiCorp, workspaces
PolicyOPA/Rego na wielu decision points (login, plan, apply…)Conftest/OPA doklejaneSentinel + OPA policy sets
DriftNatywny, private workers, opcjonalne reconcileNie natywnieHealth assessments (wyższe plany)
ConcurrencyStack lock, kolejkaJedna maszyna łatwo się zapychaPer workspace
PCIPrivate workers w PCI VPC, state nie wychodzi na public runnerSam hostujesz — pełna kontrola, pełna operacjaAgents; pytanie o data residency

Jeśli nie robiłeś Spacelift: „Robiłem X. Tu bym zaczął: jeden stack = jedno konto + jeden komponent, policy na destroy i na brak tagu pci, private workers dla PCI i prod, apply z merge PR po zielonym planie.”

Historia, którą masz mieć

Twoja: migracja Auth0 Terraform (DEVOPS-4975) — pełny STAR na Doświadczenie. Raport chciał: zepsuty state / drift w shared module. To jest 1:1.

Szkielet, gdybyś musiał opowiedzieć inną:

  1. Objaw: plan pokazuje replace SG / ubytek z locka / state is locked po zabitym runnerze.
  2. Twój call: stop apply na wszystkich callerach, kopia state, state pull, diff.
  3. Naprawa: moved albo import, nie ręczne edytowanie JSON „bo wiem”.
  4. Guardrail: drift schedule, policy blokująca untagged replace, lock timeout + alerting, wersjonowanie modułu, changelog.

Ćwiczenie

Na kartce narysuj interfejs modułu service (input/output) dla ECS i EKS. Dopisz trzy policy Spacelift, które byś włączył pierwszego dnia. Opowiedz swoją state-horror-story w 90 sekund.