Günümüzün hızla değişen IT dünyasında, altyapı yönetimi karmaşıklığı her geçen gün artmaktadır. Bu karmaşıklığı yönetmek ve süreçleri otomatize etmek için Infrastructure as Code (IaC) yaklaşımları büyük önem taşımaktadır. IaC, altyapı kaynaklarını kod kullanarak tanımlama, sağlama ve yönetme pratiğidir.
Ancak IaC kullanırken bile, “drift” adı verilen beklenmedik altyapı farklılıkları ortaya çıkabilir. IaC drift yönetimi, kodunuzda tanımlanan ideal durum ile gerçek altyapı durumu arasındaki bu sapmaları tespit etme, düzeltme ve önleme süreçlerini kapsar. Bu yazıda, IaC drift’in ne olduğunu, nedenlerini, risklerini ve etkili yönetim stratejilerini detaylı bir şekilde inceleyeceğiz.
IaC Drift Nedir ve Neden Önemlidir?
Infrastructure as Code (IaC), altyapınızın versiyon kontrollü kod dosyaları aracılığıyla tanımlanmasını ve yönetilmesini sağlar. Bu sayede, altyapı değişiklikleri tutarlı ve tekrarlanabilir bir şekilde uygulanabilir. Ancak bu ideal durum her zaman korunamaz.
IaC drift yönetimi, altyapınızın beklenen durumdan sapmasını ifade eder. Bu durum, altyapının bir kısmının IaC kodu dışında, manuel olarak veya başka bir otomatik süreç tarafından değiştirilmesiyle ortaya çıkar. Bu sapmalar, sistemlerinizin kararlılığını, güvenliğini ve uyumluluğunu ciddi şekilde tehdit edebilir.
IaC Drift Tanımı
IaC drift, altyapı kaynaklarınızın (örneğin, sanal makineler, veritabanları, ağ yapılandırmaları) IaC kodunuzda tanımlanan yapılandırmadan farklılaşmasıdır. Kısacası, kodunuzun söylediği ile gerçekte var olan altyapı arasında bir uyumsuzluk olması durumudur. Bu uyumsuzluklar, küçük bir ayar değişikliğinden tüm bir kaynağın silinmesine kadar çeşitlilik gösterebilir.
Drift, altyapınızın “tek doğruluk kaynağı” (single source of truth) olan IaC kodunuzun geçerliliğini ortadan kaldırır. Bu durum, gelecekteki dağıtımların başarısız olmasına, beklenmedik davranışlara ve sorun giderme süreçlerinin uzamasına yol açabilir. IaC drift yönetimi, bu farklılıkları minimize etmeyi hedefler.
Drift’in Nedenleri
IaC drift’in birden fazla nedeni olabilir ve genellikle insan faktörü veya süreç eksikliklerinden kaynaklanır. Bu nedenleri anlamak, drift’i önleme stratejileri geliştirmek için kritik öneme sahiptir. Aşağıda drift’e yol açan yaygın nedenleri bulabilirsiniz:
- Manuel Konfigürasyon Değişiklikleri (Manual Configuration Changes): En yaygın drift nedenidir. Bir geliştirici veya operasyon uzmanı, hızlı bir düzeltme yapmak veya test amaçlı olarak altyapı üzerinde doğrudan değişiklik yapabilir. Bu değişiklikler genellikle IaC koduna yansıtılmaz ve zamanla unutulur.
- Acil Durum Düzeltmeleri (Emergency Fixes): Üretim ortamında kritik bir sorun yaşandığında, hızlı çözümler için doğrudan müdahaleler yapılabilir. Bu acil durum müdahaleleri, genellikle IaC süreçlerinin atlanmasına neden olur ve drift’e yol açar.
- Başarısız IaC Dağıtımları (Unsuccessful IaC Deployments): Bir IaC dağıtımı kısmen başarısız olduğunda, bazı kaynaklar oluşturulmuş veya değiştirilmiş ancak diğerleri kalmış olabilir. Bu durum, IaC kodunun beklediği durumdan farklı bir kısmi yapılandırma bırakabilir.
- Üçüncü Parti Entegrasyonlar (Third-Party Integrations): Güvenlik araçları, izleme sistemleri veya diğer otomasyon çözümleri, altyapı kaynaklarında kendi başlarına değişiklikler yapabilir. Bu tür sistemlerin yaptığı değişiklikler, IaC kodunuzda belirtilmeyebilir.
- İnsan Hatası (Human Error): Bazen yanlış komutların çalıştırılması veya yanlış kaynakların hedef alınması, altyapıda istenmeyen değişikliklere yol açabilir. Bu hatalar, IaC kodunuzdaki tanımlamaları geçersiz kılabilir.
Drift’in Potansiyel Riskleri
IaC drift, bir organizasyon için bir dizi ciddi riski beraberinde getirir. Bu riskler, operasyonel verimlilikten güvenlik ve uyumluluğa kadar geniş bir yelpazeyi kapsar. IaC drift yönetimi, bu riskleri minimize etmek için hayati öneme sahiptir.
- Konfigürasyon Tutarsızlığı (Configuration Inconsistency): Drift, farklı ortamlar (geliştirme, test, üretim) arasında tutarsız yapılandırmalara yol açar. Bu durum, “Benim makinemde çalışıyordu!” sendromuna neden olabilir ve test ortamında çalışan bir uygulamanın üretimde sorun çıkarmasına yol açabilir.
- Güvenlik Açıkları (Security Vulnerabilities): Elle yapılan değişiklikler veya güncellenmeyen IaC kodları, güvenlik yamalarının eksik kalmasına veya yanlış yapılandırılmış güvenlik gruplarına neden olabilir. Bu durum, kötü niyetli saldırganlar için potansiyel giriş noktaları yaratır.
- Uyumluluk Sorunları (Compliance Issues): GDPR, HIPAA gibi regülasyonlara uymak için belirli güvenlik ve konfigürasyon standartlarının korunması gerekir. Drift, bu standartlardan sapmalara yol açarak denetimlerde sorunlara ve yasal cezalara neden olabilir.
- Sorun Giderme Zorlukları (Troubleshooting Difficulties): Bir sorun ortaya çıktığında, altyapının hangi bölümünün IaC tarafından yönetildiğini ve hangi bölümünün manuel olarak değiştirildiğini anlamak karmaşık olabilir. Bu durum, sorun giderme süresini uzatır ve sistem arıza süresini artırır.
- Azalan Çeviklik (Reduced Agility): Drift olan bir ortamda, yeni özelliklerin veya yamaların dağıtımı riskli hale gelir çünkü mevcut altyapının tam durumu bilinmez. Bu durum, dağıtım hızını yavaşlatır ve organizasyonun çevikliğini azaltır.
- Yüksek Operasyonel Maliyetler: Drift’i tespit etmek, analiz etmek ve düzeltmek için harcanan zaman ve çaba, operasyonel maliyetleri artırır. Ayrıca, drift nedeniyle ortaya çıkan kesintiler veya güvenlik ihlalleri de ek maliyetler yaratır.
IaC Drift Yönetimi Stratejileri
IaC drift yönetimi, drift’i tespit etmek, düzeltmek ve en önemlisi önlemek için çeşitli stratejilerin bir kombinasyonunu gerektirir. Bu stratejiler, altyapınızın tutarlılığını ve güvenliğini sağlamak için kapsamlı bir yaklaşım sunar. Etkili bir yönetim planı, otomasyon, süreç iyileştirmeleri ve kültürel değişimden beslenir.
Drift Tespiti (Drift Detection)
Drift tespiti, gerçek altyapı durumunu IaC kodunuzda tanımlanan beklenen durumla karşılaştırma sürecidir. Bu, IaC drift yönetiminin ilk ve en temel adımıdır. Drift’i düzenli olarak tespit etmek, sorunlar büyümeden önce müdahale etmenizi sağlar.
Drift tespiti için çeşitli araçlar ve yöntemler mevcuttur. Çoğu IaC aracı, bu tür karşılaştırmaları yapabilen yerleşik özelliklere sahiptir. Örneğin, Terraform’da terraform plan komutu, mevcut altyapı ile kodunuz arasındaki farkları gösterir. Benzer şekilde, AWS Config, Azure Policy ve özel betikler de drift tespiti için kullanılabilir.
Aşağıda bir Terraform plan çıktısı örneği, bir kaynakta drift olduğunu nasıl gösterebileceğini simüle etmektedir:
Terraform will perform the following actions:
# aws_instance.web_server will be updated in-place
~ resource "aws_instance" "web_server" {
id = "i-0abcdef1234567890"
tags = {
"Environment" = "production"
"Name" = "MyWebServer"
"Owner" = "DevOpsTeam"
}
- tags_all = {
- "Environment" = "production"
- "Name" = "MyWebServer"
- "Owner" = "DevOpsTeam"
- "DriftTag" = "ManualChange" -> null # Drift detected: Manual tag removed
}
# (lifecycle, ami, instance_type, etc. remain unchanged)
}
Plan: 0 to add, 1 to change, 0 to destroy.
Bu örnekte, tags_all bloğundaki “DriftTag” etiketinin IaC kodunda olmadığını ancak gerçek altyapıda bulunduğunu ve kaldırılacağını belirtmektedir. Bu, birisinin AWS konsolu üzerinden manuel olarak bu etiketi eklediği ve IaC kodunun bunu bilmediği anlamına gelir.
Drift Düzeltme (Drift Remediation)
Drift tespit edildikten sonra, bir sonraki adım bu farklılıkları düzeltmektir. Drift düzeltme, altyapıyı IaC kodunuzda tanımlanan beklenen duruma geri getirme veya IaC kodunu gerçek altyapı durumunu yansıtacak şekilde güncelleme sürecidir. Bu karar, drift’in niteliğine ve nedenine bağlıdır.
İki temel yaklaşım vardır:
- Revert to IaC (IaC’ye Geri Alma): Bu, IaC kodunuzun “tek doğruluk kaynağı” olduğunu varsayar. Drift tespit edildiğinde, IaC kodu uygulanarak altyapı beklenen duruma geri döndürülür. Bu, manuel yapılan değişikliklerin üzerine yazılması veya silinmesi anlamına gelir. Bu yaklaşım, altyapının tutarlılığını ve tekrarlanabilirliğini sağlar ancak manuel yapılan değerli değişikliklerin kaybolma riskini taşır.
- Update IaC (IaC’yi Güncelleme): Eğer drift, önemli ve kalıcı olması gereken bir değişiklikten kaynaklanıyorsa (örneğin, bir acil durum düzeltmesi işe yaradı ve kalıcı olmalı), o zaman IaC kodunuzu gerçek altyapı durumunu yansıtacak şekilde güncellemeniz gerekir. Bu, kodu revize etmeyi, test etmeyi ve ardından dağıtmayı içerir. Bu yaklaşım, IaC kodunuzun güncel kalmasını sağlar ancak manuel değişikliklerin doğruluğunu ve uygunluğunu dikkatlice değerlendirmeyi gerektirir.
Otomatik düzeltme, genellikle “revert to IaC” yaklaşımını izler ve sürekli olarak IaC kodunun gerçek altyapı durumunu dayatır. Bu, özellikle geliştirme ve test ortamlarında tutarlılık sağlamak için çok etkilidir. Üretim ortamlarında otomatik düzeltme, dikkatli bir şekilde uygulanmalı ve potansiyel kesintiler göz önünde bulundurulmalıdır.
# Drift tespiti sonrasında, düzeltme için `terraform apply` kullanılır.
# Bu komut, IaC kodunuzda tanımlanan durumu altyapıya uygular.
# Drift olan bir kaynağı eski haline getirecek veya güncelleyecektir.
terraform apply --auto-approve
terraform apply komutu, plan komutunun gösterdiği değişiklikleri gerçek altyapıya uygular. --auto-approve bayrağı, onay istemeden doğrudan uygulamayı sağlar, bu da otomasyon pipeline’larında kullanışlıdır ancak dikkatli kullanılmalıdır.
Drift Önleme (Drift Prevention)
Drift tespiti ve düzeltmesi önemli olsa da, en iyi strateji drift’in ortaya çıkmasını baştan engellemektir. Drift önleme, altyapı değişikliklerinin her zaman IaC süreci aracılığıyla yapılmasını sağlayan mekanizmaları ve süreçleri içerir.
- Politika Uygulama (Policy Enforcement): Bulut sağlayıcıların (AWS SCPs, Azure Policies, Google Cloud Organization Policies) yerel politika motorlarını veya üçüncü taraf araçları (Open Policy Agent - OPA) kullanarak belirli kaynaklara manuel değişiklik yapılmasını engelleyebilirsiniz. Bu politikalar, örneğin, belirli etiketlerin zorunlu olmasını veya belirli portların açılmasını yasaklayabilir.
- Erişim Kontrolü (Access Control): Altyapı kaynaklarına doğrudan erişimi mümkün olduğunca kısıtlayın. Rol Tabanlı Erişim Kontrolü (RBAC) kullanarak, yalnızca belirli IaC dağıtım hesaplarının veya CI/CD pipeline’larının altyapı değişiklikleri yapmasına izin verin. Geliştiricilerin ve operasyon ekiplerinin üretim ortamına doğrudan erişimini sınırlamak, manuel değişiklik riskini önemli ölçüde azaltır.
- CI/CD Pipeline Entegrasyonu: Tüm altyapı değişikliklerinin bir CI/CD pipeline’ı aracılığıyla yapılmasını zorunlu kılın. Bu pipeline, kod incelemesi, otomatik testler ve IaC dağıtımını içerir. Her değişiklik, kod tabanına commit edilmeli ve otomatik bir süreçle dağıtılmalıdır.
- Değişmez Altyapı (Immutable Infrastructure): Sunucuları veya diğer altyapı bileşenlerini değiştirmek yerine, bir değişiklik gerektiğinde yeni bir sürümünü oluşturup eskisini yok edin. Bu yaklaşım, yapılandırma drift’ini büyük ölçüde azaltır çünkü her dağıtım temiz bir başlangıç yapar. Docker konteynerleri ve AMI’ler (Amazon Machine Images) bu prensibin iyi örnekleridir.
- Düzenli Denetimler ve İncelemeler: IaC kodunu ve altyapı yapılandırmalarını düzenli olarak gözden geçirin. Kod incelemeleri, potansiyel sorunları erkenden yakalamanın ve IaC standartlarına uyumu sağlamanın etkili bir yoludur. Güvenlik denetimleri de manuel olarak yapılan değişiklikleri ortaya çıkarabilir.
Popüler IaC Araçları ve Drift Yönetimi Özellikleri
Farklı IaC araçları, drift yönetimi için çeşitli özellikler sunar. Bu araçların yeteneklerini anlamak, ortamınız için en uygun stratejiyi belirlemenize yardımcı olur. Her araç, altyapıyı kod olarak tanımlama ve yönetme konusunda kendi felsefesine ve güçlü yönlerine sahiptir.
Terraform
HashiCorp Terraform, çeşitli bulut sağlayıcıları ve diğer servisler üzerinde altyapı sağlamak ve yönetmek için en popüler IaC araçlarından biridir. Terraform, deklaratif bir yaklaşımla çalışır ve drift yönetimi için güçlü özellikler sunar.
Terraform’un ana drift tespit mekanizması terraform plan komutudur. Bu komut, IaC kodunuzda tanımlanan istenen durumu mevcut altyapı durumuyla karşılaştırır ve aralarındaki farkları gösterir. Potansiyel değişiklikler, eklemeler, güncellemeler veya silmeler açıkça belirtilir. Drift’i düzeltmek için ise terraform apply komutu kullanılır; bu komut, altyapıyı IaC kodunuzda tanımlanan duruma getirir.
Terraform Cloud ve Terraform Enterprise gibi platformlar, daha gelişmiş drift tespiti ve uyarı özellikleri sunar. Bu platformlar, çalışma alanlarınızdaki kaynakları sürekli olarak izleyebilir ve kodunuzdan bir sapma tespit edildiğinde sizi bilgilendirebilir. Bu sayede, manuel müdahaleye gerek kalmadan drift’i proaktif olarak yönetebilirsiniz.
# Mevcut altyapı durumu ile kodunuz arasındaki farkları gösterir
terraform plan
# Drift tespit edildiğinde, kodunuzdaki durumu altyapıya uygular
# Bu, manuel değişiklikleri geri alabilir veya IaC kodunuzu güncelleyebilir
terraform apply
AWS CloudFormation
AWS CloudFormation, AWS kaynaklarını deklaratif bir şekilde tanımlamanıza olanak tanıyan bir IaC hizmetidir. CloudFormation, stack’ler (yığınlar) aracılığıyla kaynakların yönetilmesini sağlar. Drift yönetimi için yerleşik özelliklere sahiptir.
CloudFormation’ın Drift Detection özelliği, bir stack’teki kaynakların gerçek yapılandırmasını, stack şablonunda beklenen yapılandırmayla karşılaştırır. Bu özellik, AWS konsolu, CLI veya SDK aracılığıyla başlatılabilir ve drift olan kaynakları ve değişiklikleri raporlar. Drift tespit edildiğinde, CloudFormation doğrudan otomatik bir düzeltme sağlamaz, ancak drift’i incelemenize ve manuel olarak veya yeni bir şablon dağıtarak düzeltmenize olanak tanır. Ayrıca, CloudFormation’ın Change Sets özelliği, bir stack’e uygulanacak değişiklikleri önceden gözden geçirmenizi sağlayarak beklenmedik durumların önüne geçilmesine yardımcı olur.
Ansible
Ansible, IT otomasyonu için kullanılan açık kaynaklı bir araçtır. Konfigürasyon yönetimi, uygulama dağıtımı ve orkestrasyon gibi görevleri yerine getirir. Ansible, “idempotency” prensibine büyük önem verir; yani, bir playbook’u birden çok kez çalıştırmak her zaman aynı sonuca yol açar.
Ansible doğrudan bir “drift tespiti” özelliği sunmazken, idempotency sayesinde drift’i dolaylı olarak yönetir. Bir playbook her çalıştığında, hedef sistemin durumunu kontrol eder ve yalnızca gerekli değişiklikleri yapar. --check veya --diff bayrakları ile bir playbook’u çalıştırmak, sistemde yapılacak olası değişiklikleri (yani drift’i) önceden görmenizi sağlar. Bu modlar, gerçek bir değişiklik yapmadan niyetinize göre neyin farklı olduğunu gösterir.
Pulumi
Pulumi, Go, Python, TypeScript, C# gibi gerçek programlama dilleri kullanarak bulut altyapısı tanımlamanıza olanak tanıyan modern bir IaC platformudur. Programlama dillerinin gücü sayesinde, daha karmaşık ve dinamik altyapılar oluşturulabilir.
Pulumi, pulumi preview ve pulumi up komutlarıyla planlanan değişiklikleri sergiler ve uygulanmasını sağlar. Drift tespiti için pulumi refresh ile cloud kaynakların gerçek durumunu state’e yansıtır, ardından pulumi preview ile state ile kod arasındaki farkı raporlar.
Sonuç
IaC drift, görünmez bir borç olarak birikir ve fark edilene kadar incident anında ortaya çıkar. Disiplinli refresh + preview döngüsü, CI’da otomatik drift kontrolü ve manuel cloud console değişikliklerini bloklayan IAM politikaları üçlüsü, drift’i kaynaktan engelleyen en etkili stratejidir.