03 · Infrastructure as Code#
"Console'dan tıklayarak kurduğun bir kaynak, bir gün biri tarafından tıklayarak silinir — kim, ne zaman, niye? bilemezsin."
IaC her şeyi Git'te kod olarak tutar: provision, değişiklik, silme — hepsi PR review'dan geçer.
İçindekiler#
| Dosya | Konu |
|---|---|
Terraform-Best-Practices.md | Module layout, remote state, workspace, lifecycle hooks, drift handling |
Terraform-Module-Layout.md | Standart vpc/eks/rds modül iskeleti, terraform-docs |
OpenTofu-Migration.md | HashiCorp BSL → OpenTofu Apache geçişi, ne değişir/değişmez |
Pulumi-vs-Terraform.md | TypeScript/Python ile IaC: ne zaman tercih edilir |
Crossplane-Intro.md | Kubernetes-native cloud control plane: niçin, nasıl |
Drift-Detection.md | terraform plan'i CI'da otomatik koşturma; manuel değişiklikleri yakalama |
Karar ağacı: hangi IaC?#
Tek cloud + Terraform/HCL bilgisi var?
└─ EVET → Terraform / OpenTofu (en yaygın, en çok hiring havuzu)
└─ HAYIR
├─ Multi-cloud, Kubernetes-merkezli?
│ └─ Crossplane (her şey K8s API üzerinden)
├─ Programlama dilleri ile yazmak istiyorum?
│ └─ Pulumi (TS/Python/Go/.NET)
└─ AWS-only, JSII'a aşinayım?
└─ AWS CDK / CDK8s
Terraform modül hiyerarşisi (önerilen)#
infra/
├── modules/ ← reusable, versiyonlu
│ ├── vpc/
│ ├── eks/
│ ├── rds/
│ └── observability/
├── environments/ ← composition layer
│ ├── prod/
│ │ ├── main.tf ← module'leri çağırır
│ │ ├── variables.tf
│ │ └── backend.tf
│ ├── staging/
│ └── dev/
└── stacks/ ← cross-environment shared
├── networking/
└── identity/
Anti-pattern'ler#
- ❌ State'i Git'e commitlemek (
*.tfstate.gitignore'da olmalı) - ❌ Module versiyonlamak yerine
path = "../modules/x"(drift garantisi) - ❌
countkullanmak (resource silindi, indeksler kaydı, plan büyük diff verir) —for_eachkullan - ❌
terraform apply -auto-approvePR review olmadan - ❌ Bir devasa monolitik state (apply 1 saat sürer, blast radius büyük)
- ❌ Console'da değişiklik + sonra
terraform import(uzaklaşırsan drift)