Terraform state ve uzak backend: kurulum ve güvenli yönetim
Beceri rehberi

Terraform state ve uzak backend: kurulum ve güvenli yönetim

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Terraform state dosyasının rolü, uzak backend kurulumu, state kilitleme, şifreleme ve ekip çalışmasında güvenli state yönetimi adımları.

State dosyası ne işe yarar?

Terraform, yazdığınız yapılandırma ile gerçek altyapı arasındaki eşleşmeyi state adı verilen kayıtta tutar. HashiCorp belgelerinin ifadesiyle state, uzak sistemdeki nesneler ile yapılandırmadaki kaynak örnekleri arasındaki bağlantıları saklar. Bir sanal makine oluşturduğunuzda, Terraform onun sağlayıcıdaki kimliğini state'e yazar; sonraki çalıştırmada neyin zaten var olduğunu, neyin değiştirilmesi gerektiğini bu kayıttan anlar.

State olmadan Terraform yapılandırmadaki bir kaynağın gerçek karşılığını bulamaz; büyük altyapılarda performans için de bu kayıt kullanılır. Bu yüzden state'in kaybolması ya da bozulması, altyapıyı yönetememe riskine dönüşür. Varsayılan olarak state, çalışma dizinindeki yerel bir dosyada (terraform.tfstate) tutulur. Tek kişilik denemeler için yeterlidir ancak ekip çalışması ve üretim için güvenli değildir.

Yerel state neden ekip için sorun yaratır?

Yerel state dosyasıyla ekip çalışmanın sorunları şunlardır:

  • Paylaşım: Dosya bir kişinin bilgisayarındadır; diğer ekip üyesi son durumu göremez.
  • Çakışma: Birden fazla kişi aynı anda uygulama yaparsa state bozulabilir ya da biri diğerinin değişikliğini ezer.
  • Güvenlik: State, kaynakların bazı özniteliklerini düz metin olarak içerebilir. Veritabanı parolası gibi hassas değerler bu dosyada görünebilir. HashiCorp belgeleri, state'i sürüm kontrolü ya da kilitleme ve erişim denetimi sunmayan ortamlarda saklamanın veri kaybına ve gizli bilgilerin açığa çıkmasına yol açabileceği uyarısını yapar.
  • Yedek: Yerel dosya diske bağımlıdır; bilgisayar kaybolursa altyapının kaydı da kaybolur.

Bu nedenle ekip ve üretim ortamları için state uzak bir backend'de tutulur.

Uzak backend kurulumu: örnek S3 yapılandırması

Backend, state'in nerede saklanacağını belirleyen yapılandırmadır. En yaygın seçeneklerden biri AWS S3'tür. Örnek bir yapılandırma şöyledir:

terraform { backend "s3" { bucket = "acme-terraform-state" key = "uretim/ag/terraform.tfstate" region = "bolge-adi" encrypt = true use_lockfile = true } }

HashiCorp belgelerine göre bucket, key ve region zorunlu argümanlardır. encrypt, state ve kilit dosyalarını sunucu tarafında şifreler; use_lockfile S3 tabanlı kilitlemeyi etkinleştirir ve belgelerde güncel önerilen yöntem olarak geçer. Eski yöntem olan dynamodb_table ise kullanımdan kalkacak olarak işaretlenmiştir; geçişi kolaylaştırmak için ikisi birlikte tanımlanabilir. Belgeler ayrıca S3 bucket sürümlemesinin açılmasını önerir; bu, yanlışlıkla silinen ya da bozulan state'i geri almanızı sağlar.

Yapılandırmayı ekledikten sonra terraform init komutu backend'i kurar ve mevcut yerel state'i uzağa taşımayı önerir.

State kilitleme: iki kişi aynı anda çalışırsa ne olur?

Kilitleme, bir kişi state'i değiştirirken başka birinin aynı anda değiştirmesini engeller. Plan ya da apply başladığında Terraform kilidi alır, işlem bitince bırakır. Diğer kullanıcı çalıştırdığında kilit hatası görür ve bekler.

Örneğin iki mühendis aynı anda apply çalıştırdığında kilit olmazsa son yazan, diğerinin yaptığı değişikliği state'ten silebilir; altyapıda var olan bir kaynak Terraform'un görüşünde yok olur. Kilit, bu çakışmayı önler.

Bazen bir işlem yarıda kesilir (bağlantı kopması, CI görevinin iptali) ve kilit serbest kalmaz. Bu durumda önce kilidi tutan işlemin gerçekten bitmiş olduğunu doğrulayın, ancak sonra kilidi zorla kaldırın. Bu komut kullanılırken yanlış kilidin kaldırılması, çalışan bir işlemin state'ini bozabilir.

State içeriğini inceleme ve düzeltme komutları

State'e doğrudan elle dokunmak yerine Terraform'un komutları kullanılır. HashiCorp belgelerinde geçen başlıca komutlar şunlardır:

  • terraform state: State üzerinde temel işlemleri yapan komut grubudur; kaynakları listelemek ve ayrıntısını görmek için kullanılır.
  • terraform state rm: Bir nesneyi state'ten çıkarır, yani Terraform'un onu "unutmasını" sağlar. Gerçek kaynak silinmez; yalnız yönetim dışı kalır.
  • terraform import: Terraform dışında oluşturulmuş bir nesneyi state'e bağlar.
  • terraform show -json: En son state görüntüsünü ya da kaydedilmiş bir planı JSON olarak verir.
  • terraform output -json: Kök modülün çıktı değerlerini state'ten okur.

State dosyasını bir metin editörüyle açıp düzenlemek tehlikelidir; yapı bozulursa Terraform çalışmaz. Düzenleme gerektiğinde önce state'in yedeğini alın ve değişikliği komutlarla yapın.

Güvenlik ve organizasyon ilkeleri

Uzak backend kurulduktan sonra şu ilkeler uygulanır:

  • Erişimi kısıtlayın: State'i okuyabilen kişi, içindeki hassas değerleri de görebilir. Okuma ve yazma yetkisi gereken kişi ve hizmet hesaplarıyla sınırlı tutulmalı.
  • Şifreleyin: Depolama düzeyinde şifrelemeyi açın; mümkünse yönetilen anahtar kullanın.
  • Sürümleyin: Silinme ve bozulmaya karşı geri dönüş imkânı bırakın.
  • Bölün: Tek dev bir state yerine, birbiriyle ilgisiz bileşenleri (ağ, uygulama, veritabanı) ayrı state dosyalarına bölün. Bu hem çalışma süresini kısaltır hem de bir hatanın etkisini sınırlar.
  • Backend'i kendisi için bir kez oluşturun: State'i tutan bucket'ı Terraform ile mi oluşturacağınız tavuk-yumurta sorunudur; genellikle ilk kurulum elle ya da ayrı bir küçük yapılandırmayla yapılır.
  • Parola gibi sırları state'te tutmaktan kaçının; gizli bilgileri yönetilen bir sır deposundan okuyun.

Sık yapılan hatalar ve Mindset programlarında yeri

  • State dosyasını sürüm kontrol deposuna yüklemek: Hassas verinin deponun geçmişinde kalmasına yol açar.
  • Kilitlemeyi atlamak: Ekipte çakışma kaçınılmaz olur.
  • Tek büyük state kullanmak: Her plan çok uzun sürer, bir hata tüm altyapıyı etkiler.
  • State rm ile silinen kaynağı gerçekten silindi sanmak: Kaynak çalışmaya devam eder, sadece yönetim dışı kalır.
  • Kilidi bilmeden zorla kaldırmak: Çalışan işlemin sonucunu bozar.

Mindset'in Terraform ile Altyapı Otomasyonu programı durum yönetimi ve backend, Terraform temelleri ve HCL dili, modüler mimari ve CI/CD akışları gibi modülleri içerir. DevOps mühendisleri, bulut ve platform ekipleri için uygundur; altyapıyı ekip olarak kodla yöneten kurumsal ekipler, state ve backend standardını birlikte oluşturmak için bu programı kullanabilir.

İlgili Mindset programı

Terraform ile Altyapı Otomasyonu

Sık sorulanlar

Sık sorulan sorular

Terraform state dosyası git deposunda tutulmalı mı?

Hayır. State, hassas değerler içerebilir ve sürüm kontrolü kilitleme sağlamaz. HashiCorp belgeleri de kilitleme ve erişim denetimi sunmayan ortamlarda saklamayı uyarı olarak belirtir. Bunun yerine uzak backend kullanın; yapılandırmayı depoya, state'i uzak depolamaya koyun.

Backend'i sonradan değiştirmek mümkün mü?

Mümkündür. Yapılandırmadaki backend bloğunu değiştirip terraform init çalıştırdığınızda Terraform mevcut state'i yeni backend'e taşımayı önerir. Taşımadan önce state'in yedeğini almak ve taşıma sırasında kimsenin apply çalıştırmadığından emin olmak gerekir. Taşıma sonrası eski backend'i hemen silmeyin, yeni yapının çalıştığını doğrulayın.

S3 backend'inde DynamoDB zorunlu mu?

Hayır. Belgelere göre güncel önerilen kilitleme yöntemi use_lockfile ile S3 tabanlı kilittir. DynamoDB tabanlı yöntem kullanımdan kalkacak olarak işaretlenmiştir. Eski kurulumu bozmadan geçmek için iki yöntemi birlikte tanımlayabilirsiniz. Yeni kurulumlarda doğrudan use_lockfile ile başlamak yeterlidir.

State bozulursa ne yapılır?

Önce uzak depolamanın sürüm geçmişinden önceki sağlam sürümü geri yükleyin. Sürümleme yoksa terraform import ile mevcut kaynakları yeniden state'e bağlamak gerekebilir. Bu zaman alan bir işlemdir; bu yüzden sürümleme ve yedek önceden açılmalıdır.

Sırlar state dosyasında nasıl korunur?

State'i şifreli depolayıp erişimi sıkı kısıtlayın ve sırları mümkün olduğunca state'e yazmayan yollarla (yönetilen sır deposundan okuma) kullanın. Bir kaynağın hassas özniteliği state'e düz metin olarak yazılabileceği için state erişimi parola erişimi gibi korunmalıdır.

Terraform State ve Uzak Backend Nasıl Yönetilir