# Terraform state'i S3 + DynamoDB locking ile nasıl güvenli yönetirim?

> Versiyonlu, şifreli bir S3 backend'e geçip DynamoDB lock tablosu ekleyin (deprecated ama çalışır), state'i ortam başına ayırın, apply'ı CI'dan koşturun.

- Soruldu: 2026-06-12
- Yanıtlandı: 2026-06-12
- Soran: Nadir
- Etiketler: ci-cd, altyapi
- Kaynak: https://www.muhammetsafak.com.tr/sor-bakalim/terraform-state-yonetimi-s3-ve-dynamodb-ile-locking/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
**Soru:** AWS'teki tüm altyapımızı (VPC, EC2, RDS, S3) Terraform ile yönetiyoruz. Ekipte 3 DevOps var; aynı anda değişiklik yapınca `terraform.tfstate` çakışıp bozulabiliyor.

State'i güvenli şekilde uzakta (S3) saklamak ve eşzamanlı değişiklikleri önlemek için DynamoDB ile state locking'i nasıl kurarım?


Kısa cevap: Local `terraform.tfstate` + 3 kişi = bozulma ve race condition. State'i remote backend'e taşı: dosya için S3, locking için DynamoDB — bu kombinasyon uzun süredir sektörün standardıydı, ama Terraform 1.11'den beri DynamoDB locking deprecated durumda.

Sorunun kökü tek bir paylaşılan dosyanın, kilit olmadan, üç kişi tarafından aynı anda yazılması.

1. **State dosyasını S3'e al — versiyonlu, şifreli, IAM ile kısıtlı.** Bucket'ta **versioning** açık olsun ki bozuk bir state'ten kolayca geri dönebilesin; encryption açık, erişim sadece gereken role'lerde. Artık state laptop'ta değil, merkezi ve yedekli bir yerde.
2. **DynamoDB ile state locking kur.** Terraform, herhangi bir apply'dan önce bir lock satırı yazar. İkinci kişi apply çalıştırınca kilit dolu olduğu için ya bekler ya da hızlıca hata verir — state'i üst üste yazıp bozmaz. Race condition tam burada biter.
3. **Ortam başına ayrı state tut.** Prod, staging ve dev'i tek bir state'te paylaşma; her ortamın kendi state'i olsun. Aksi halde staging'de bir hata prod state'ini riske atar; blast radius'u ayrı tutmanın en ucuz yolu budur.
4. **Mümkünse apply'ları sadece CI'dan çalıştır ve state'i elle düzenleme.** Tek serileştirilmiş yol (CI), üç laptop'tan gelen paralel apply'lardan çok daha güvenli. State'e elle dokunma; düzeltmen gerekirse `terraform state` komutlarını kullan.

**Sonuç:** Ben olsam S3 (versiyonlu + şifreli) backend + DynamoDB lock tablosu + ortam başına state + CI'dan apply derdim. Not: yeni Terraform/OpenTofu sürümleri S3-native locking de yapabiliyor; DynamoDB lock tablosu hâlâ yaygın olsa da HashiCorp tarafından deprecated ilan edildi ve kaldırılması planlanıyor — yine de ekibin bugün tereddütsüz oturtabileceği şey budur. IaC'ye gerçekten geçmeye değer mi, yoksa script mi yeter sorusunu sade.dev'de ayrıca tartıştım.

## İlgili Yazılar

- [CI/CD'de OIDC ve IAM Role ile şifresiz (secretless) AWS erişimini nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/ci-cd-de-secret-yonetimi-ve-oidc-ile-sifresiz-erisim/) — Sor Bakalım
- [Docker imaj boyutunu multi-stage build ve distroless ile nasıl küçültürüm?](https://www.muhammetsafak.com.tr/sor-bakalim/docker-imaj-boyutunu-multi-stage-ve-distroless-ile-kucultmek/) — Sor Bakalım
- [CDN'de asset sürümleme: hash'leme ve cache stratejisini nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/cdn-asset-surumleme-hashleme-ve-cache-stratejisi/) — Sor Bakalım
