← Notlara dön

terraform destroy Bitti. Yine de Faturayı Kontrol Ettim.

Terraform sahip olduğu her şeyi kaldırdı. Bu, hâlâ para harcatabilecek her şeyi kaldırmakla aynı şey değildi.

Başarılı bir terraform destroy’u, bir ortamın tamamen gittiğine dair oldukça güçlü bir sinyal olarak okurdum.

CairnOps bu alışkanlığı değiştirdi.

Terraform tam olarak yapması gerekeni yaptı. Yine de sonrasında cloud hesabını doğrulamam gerekti.

Terraform sadece kendi state’ini bilir

Projedeki bazı Kubernetes kaynakları Terraform ile değil, kubectl apply ile deploy edilmişti.

Bu, onların hiçbir zaman Terraform state’inde var olmadığı anlamına geliyor.

Bu yüzden temizliğe Kubernetes katmanından başladım:

kubectl delete -f infra/k8s/
kubectl get all -n cairnops

Bir Kubernetes objesinin arkasında oluşturulan cloud kaynakları hâlâ kaldırılırken namespace hızla boşalabiliyordu.

Ingress bunun bariz örneğiydi. Kubernetes Ingress’i silmek, external load balancer’ın aynı milisaniyede ortadan kalktığı anlamına gelmiyor. Controller’ın cloud tarafında hâlâ yapması gereken temizlik işleri var.

Bu, bir katmandaki “kaynak silindi” durumunu, bağımlı her kaynağın da gittiğinin kanıtı olarak görmeyi bırakmamın sebeplerinden biri.

Ayrıca arkamda bir state lock da bıraktım

Bir destroy sırasında, ihtiyacım olan environment variable’ları yüklemediğimi fark edince Terraform’u kestim.

Bir sonraki çalıştırma bir state-lock hatasıyla başarısız oldu.

Benim durumumda lock’un kendi kestiğim process’ime ait olduğunu biliyordum, bu yüzden onu şununla kaldırdım:

terraform force-unlock <LOCK_ID>

Bu komutu gelişigüzel kullanmam. Eğer gerçekten başka bir Terraform process’i aynı state üzerinde çalışıyorsa, lock’u zorla açmak çok daha kötü bir gün yaratmanın iyi bir yolu.

prevent_destroy işini yaptı

Qdrant bilerek korunuyordu:

lifecycle {
  prevent_destroy = true
}

O kaynağı yeniden oluşturmak; embedding’leri yeniden build etmek, yeni bir endpoint ve credential almak ve ingestion’ı tekrar çalıştırmak anlamına gelirdi.

Bu yüzden Terraform onu kaldırmayı reddettiğinde bu bir hata değildi. İstediğim güvenlik mekanizmasıydı.

Önemli olan kısım, “tam temizlik”in “kelimenin tam anlamıyla her şeyi sil” anlamına gelmemesi gerektiğini hatırlamaktı.

Son kontrolüm Terraform’un dışında gerçekleşiyor

Kubernetes temizliği ve Terraform teardown’undan sonra, cloud hesabını doğrudan kontrol ediyorum.

GCP için bu, şu komutları içeriyordu:

gcloud compute forwarding-rules list
gcloud compute addresses list --global

Ana cluster gittikten sonra sessizce orada durup faturalandırmaya devam edebilecek her şeyi önemsiyorum.

Karar kıldığım temizlik sırası şuydu:

1. Kubernetes kaynaklarını kaldır
2. Kubernetes bootstrap state'ini destroy et
3. Altyapı state'ini destroy et
4. GCP'yi doğrudan doğrula

Bu sıra, bağımlılık yönünü tersine takip ediyor ve controller’lara oluşturdukları kaynakları temizleme şansı veriyor.

Başarılı bir destroy hâlâ faydalı.

Sadece artık onu bir faturalandırma garantisi olarak görmüyorum.

Terraform bana Terraform tarafından yönetilen kaynakların gittiğini söyleyebilir. Ortamın gerçekten bitip bitmediğini kontrol ettiğim yer ise cloud hesabı.