Skip to main content
DevOps

Infrastructure as Code: Terraform ve Pulumi ile Altyapı Yönetimi

Mart 14, 2026 9 dk okuma 15 views Raw
Infrastructure as Code ile sunucu ve altyapı yönetimi
İçindekiler

Infrastructure as Code (IaC) Nedir?

Infrastructure as Code (IaC), sunucular, ağlar, veritabanları ve diğer altyapı bileşenlerinin manuel yapılandırma yerine kod dosyaları aracılığıyla tanımlanması, dağıtılması ve yönetilmesi yaklaşımıdır. Tıpkı uygulama kodunun versiyon kontrol sistemlerinde saklanması gibi, altyapı tanımları da Git gibi sistemlerde saklanır ve tüm yazılım geliştirme pratiklerinden yararlanır.

Geleneksel altyapı yönetiminde, bir sistem yöneticisi sunucuları manuel olarak yapılandırır, yazılımları kurar ve ağ ayarlarını yapar. Bu süreç hem zaman alıcıdır hem de insan hatasına açıktır. Aynı ortamı ikinci kez oluşturmak, tüm adımların doğru sırayla tekrarlanmasını gerektirir ve bu süreçte farklılıklar oluşabilir.

IaC yaklaşımı, tüm bu süreçleri otomatize eder ve tekrarlanabilir hale getirir. Altyapınızı bir dosyada tanımlar, bu dosyayı çalıştırır ve istediğiniz ortam dakikalar içinde hazır olur. Aynı dosyayı tekrar çalıştırdığınızda, birebir aynı ortamı elde edersiniz.

IaC'nin Temel Faydaları

Infrastructure as Code yaklaşımının organizasyonlara sağladığı faydalar oldukça kapsamlıdır:

Tekrarlanabilirlik ve Tutarlılık

IaC ile tanımlanan altyapı, her çalıştırıldığında aynı sonucu üretir. Development, staging ve production ortamları arasındaki farklar ortadan kalkar. "Bende çalışıyordu" sorunu büyük ölçüde çözülür çünkü tüm ortamlar aynı kod tabanından oluşturulur.

Versiyon Kontrolü

Altyapı değişiklikleri Git'te takip edildiğinde, kimin ne zaman hangi değişikliği yaptığı net olarak görülür. Bir sorun oluştuğunda önceki bir versiyona dönmek, sadece bir git revert komutu kadar kolaydır. Code review süreçleri, altyapı değişikliklerinin de denetlenmesini sağlar.

Hız ve Otomasyon

Manuel olarak saatler süren altyapı kurulumları, IaC ile dakikalar içinde tamamlanır. Yeni bir ortam oluşturmak, tek bir komut çalıştırmak kadar basittir. CI/CD pipeline'larına entegre edildiğinde, altyapı değişiklikleri otomatik olarak uygulanır.

Dokümantasyon

IaC dosyaları, altyapının canlı dokümantasyonudur. Mevcut altyapının ne olduğunu anlamak için sunuculara bağlanıp kontrol etmeye gerek yoktur; kod dosyalarına bakmak yeterlidir. Bu, özellikle yeni ekip üyelerinin sistemi anlamasını kolaylaştırır.

Maliyet Optimizasyonu

IaC ile kullanılmayan kaynakları tespit etmek ve temizlemek kolaylaşır. Geçici ortamlar ihtiyaç duyulduğunda oluşturulup işi bittiğinde otomatik olarak silinebilir. Bu yaklaşım, bulut maliyetlerini önemli ölçüde azaltır.

Deklaratif vs. İmperatif Yaklaşım

IaC araçları iki temel yaklaşımdan birini benimser: deklaratif ve imperatif.

Deklaratif Yaklaşım

Deklaratif yaklaşımda, altyapının son durumunu (desired state) tanımlarsınız. Araç, mevcut durum ile istenen durum arasındaki farkı hesaplar ve gerekli değişiklikleri otomatik olarak uygular. Terraform bu yaklaşımın en bilinen temsilcisidir.

Örneğin, "3 adet web sunucusu, 1 adet veritabanı ve 1 adet yük dengeleyici olsun" dersiniz. Araç, bu kaynakların hangilerinin zaten var olduğunu kontrol eder ve sadece eksik olanları oluşturur.

İmperatif Yaklaşım

İmperatif yaklaşımda, altyapıyı oluşturmak için izlenmesi gereken adımları sırasıyla tanımlarsınız. Geleneksel betik (script) tabanlı otomasyon araçları bu kategoriye girer. Ansible'ın bazı kullanım senaryoları imperatif yaklaşıma örnektir.

Örneğin, "Önce sunucuyu oluştur, sonra yazılımı kur, ardından güvenlik duvarı kuralını ekle" şeklinde adımları tek tek belirtirsiniz.

Karşılaştırma

ÖzellikDeklaratifİmperatif
TanımlananSon durum (ne?)Adımlar (nasıl?)
İdempotentlikDoğal olarak sağlanırManuel sağlanmalı
Drift DetectionDahiliGenellikle yok
Öğrenme EğrisiDSL öğrenimi gerekirBilinen diller kullanılabilir
EsneklikSınırlı (araç kapsamında)Yüksek

Terraform ile Altyapı Yönetimi

Terraform, HashiCorp tarafından geliştirilen ve en yaygın kullanılan IaC aracıdır. Deklaratif yaklaşımı benimser ve HashiCorp Configuration Language (HCL) adlı kendi yapılandırma dilini kullanır.

HCL (HashiCorp Configuration Language)

HCL, insan tarafından okunabilir bir yapılandırma dilidir. JSON ve YAML'ın avantajlarını birleştiren bu dil, hem basit hem de karmaşık altyapı tanımlarını ifade edebilir. Temel yapı taşları şunlardır:

  • Resource: Oluşturulacak altyapı bileşenini tanımlar (sunucu, veritabanı, ağ)
  • Data Source: Mevcut altyapı bileşenlerinden bilgi okur
  • Variable: Parametrik yapılandırma sağlar
  • Output: Oluşturulan kaynakların bilgilerini dışa aktarır
  • Local: Tekrarlanan ifadeleri basitleştirir

Basit bir Terraform yapılandırması şu şekilde görünür:

resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.medium"

  tags = {
    Name        = "Web Server"
    Environment = "production"
  }
}

resource "aws_db_instance" "database" {
  engine         = "postgresql"
  engine_version = "15.4"
  instance_class = "db.t3.medium"
  allocated_storage = 100

  db_name  = "myapp"
  username = var.db_username
  password = var.db_password
}

Terraform Provider'lar

Terraform'un gücü, provider ekosisteminden gelir. Provider'lar, Terraform'un farklı platformlarla iletişim kurmasını sağlayan eklentilerdir. AWS, Azure, Google Cloud, Kubernetes, GitHub, Cloudflare gibi yüzlerce provider mevcuttur.

Her provider, ilgili platformun API'lerini sarmalayarak Terraform'un o platformdaki kaynakları yönetmesini sağlar. Birden fazla provider'ı aynı projede kullanarak multi-cloud altyapılar oluşturabilirsiniz.

State Yönetimi

Terraform, yönettiği altyapının mevcut durumunu bir state dosyasında saklar. Bu dosya, Terraform'un hangi kaynakları oluşturduğunu, bu kaynakların gerçek dünyadaki karşılıklarını ve kaynaklar arasındaki bağımlılıkları bilmesini sağlar.

State yönetimi, Terraform'un en kritik ve en dikkat gerektiren konusudur. State dosyası hassas bilgiler içerebilir ve birden fazla kişinin aynı anda çalışması durumunda çakışmalar oluşabilir. Bu nedenle, üretim ortamlarında remote state backend kullanılması zorunludur:

  • AWS S3 + DynamoDB: State dosyası S3'te saklanır, DynamoDB ile kilitleme sağlanır
  • Azure Blob Storage: Azure ortamları için tercih edilen backend
  • Google Cloud Storage: GCP ortamları için uygun backend
  • Terraform Cloud: HashiCorp'un yönetilen state backend hizmeti

Modüller

Terraform modülleri, tekrar kullanılabilir altyapı bileşenleri oluşturmanızı sağlar. Bir modül, belirli bir amaca hizmet eden Terraform yapılandırmalarının paketlenmiş halidir. Örneğin bir VPC modülü, ağ yapılandırmasını standart hale getirir ve her yeni projede sıfırdan yazılmasına gerek kalmaz.

Terraform Registry, topluluk tarafından geliştirilen binlerce modülü barındırır. AWS VPC, EKS cluster, Azure Kubernetes Service gibi yaygın kullanım senaryoları için hazır modüller mevcuttur.

Pulumi ile Altyapı Yönetimi

Pulumi, genel amaçlı programlama dilleri kullanarak altyapı yönetimi yapmanızı sağlayan modern bir IaC aracıdır. TypeScript, Python, Go, C# ve Java gibi dillerle altyapı tanımlayabilirsiniz.

Pulumi'nin Yaklaşımı

Pulumi'nin temel felsefesi, geliştiricilerin zaten bildikleri programlama dillerini kullanarak altyapı yönetmesidir. Bu yaklaşımın avantajları şunlardır:

  • Yeni bir DSL öğrenme gerekliliğini ortadan kaldırır
  • Programlama dillerinin tüm yeteneklerinden yararlanır (döngüler, koşullar, fonksiyonlar, sınıflar)
  • IDE desteği, otomatik tamamlama ve tip güvenliği sağlar
  • Mevcut kütüphaneler ve paket yöneticileri kullanılabilir
  • Birim testleri yazılabilir

Pulumi ile aynı altyapıyı TypeScript ile şöyle tanımlarsınız:

import * as aws from "@pulumi/aws";

const webServer = new aws.ec2.Instance("webServer", {
    ami: "ami-0c55b159cbfafe1f0",
    instanceType: "t3.medium",
    tags: {
        Name: "Web Server",
        Environment: "production",
    },
});

const database = new aws.rds.Instance("database", {
    engine: "postgres",
    engineVersion: "15.4",
    instanceClass: "db.t3.medium",
    allocatedStorage: 100,
    dbName: "myapp",
    username: dbUsername,
    password: dbPassword,
});

Pulumi ile Gelişmiş Senaryolar

Programlama dillerinin gücü sayesinde Pulumi, karmaşık senaryoları kolayca ifade edebilir. Örneğin, dinamik sayıda sunucu oluşturmak, koşullu kaynaklar tanımlamak veya harici API'lerden bilgi çekip altyapı yapılandırmasında kullanmak mümkündür.

Terraform vs. Pulumi Karşılaştırması

Her iki araç da güçlü IaC çözümleri sunar ancak farklı senaryolarda öne çıkarlar:

ÖzellikTerraformPulumi
DilHCL (DSL)TypeScript, Python, Go, C#, Java
Öğrenme EğrisiHCL öğrenilmeliBilinen diller kullanılır
ToplulukÇok büyükBüyüyen
Provider Desteği4000+ providerTerraform provider'larını destekler
TestSınırlı (Terratest)Native birim testleri
StateRemote backendPulumi Cloud veya self-managed
LisansBSL (Business Source License)Apache 2.0
IDE DesteğiSınırlıTam (tip güvenliği, otomatik tamamlama)

Hangi Aracı Seçmeli?

Araç seçiminde dikkate alınması gereken faktörler şunlardır:

  • Terraform'u seçin: Ekibiniz HCL'e aşinaysa, geniş topluluk desteği istiyorsanız, basit altyapı tanımları yeterliyse
  • Pulumi'yi seçin: Ekibiniz güçlü programlama deneyimine sahipse, karmaşık mantık gerektiren senaryolarınız varsa, tip güvenliği ve IDE desteği önemliyse

GitOps ile IaC Entegrasyonu

GitOps, Git repository'sini tek gerçek kaynak (single source of truth) olarak kabul eden ve tüm altyapı değişikliklerinin Git üzerinden yönetildiği bir yaklaşımdır. IaC araçlarını GitOps ile entegre etmek, altyapı yönetiminin güvenliğini ve izlenebilirliğini önemli ölçüde artırır.

GitOps İş Akışı

  1. Geliştirici, altyapı değişikliğini bir feature branch'te yapar
  2. Pull request açılır ve değişiklik plan çıktısı otomatik olarak PR yorumuna eklenir
  3. Ekip üyeleri değişikliği inceler ve onaylar
  4. PR merge edildiğinde, CI/CD pipeline otomatik olarak değişikliği uygular
  5. Uygulama sonuçları ilgili PR'a bildirilir

GitOps Araçları

IaC ile GitOps entegrasyonu için kullanılan popüler araçlar:

  • Atlantis: Terraform için GitOps workflow otomasyonu
  • Spacelift: Multi-IaC GitOps platformu
  • env0: Terraform ve Pulumi için GitOps çözümü
  • Terraform Cloud: HashiCorp'un kendi GitOps entegrasyonu

IaC Testleri

Altyapı kodunun da uygulama kodu gibi test edilmesi gerekir. IaC testleri üç seviyede gerçekleştirilir:

Statik Analiz

Kod çalıştırılmadan önce yapılan kontroller:

  • terraform validate: Söz dizimi ve yapısal doğruluk kontrolü
  • tflint: Terraform için linting aracı
  • checkov: Güvenlik ve uyumluluk kuralları kontrolü

Birim Testleri

Modüllerin doğru yapılandırıldığını kontrol eden testler. Pulumi'de native test framework'ü kullanılabilirken, Terraform'da Terratest veya terraform test komutu tercih edilir.

Entegrasyon Testleri

Gerçek altyapı kaynakları oluşturularak yapılan uçtan uca testler. Bu testlerde geçici bir ortam oluşturulur, kaynakların doğru yapılandırıldığı kontrol edilir ve ardından ortam temizlenir.

Güvenlik Taraması

IaC kodundaki güvenlik açıklarını deployment öncesinde tespit etmek kritik önem taşır. Kullanılan güvenlik tarama araçları:

  • Checkov: 1000+ dahili güvenlik kuralı ile IaC taraması
  • tfsec: Terraform'a özel güvenlik tarayıcısı
  • Trivy: IaC dahil çok amaçlı güvenlik tarayıcısı
  • Snyk IaC: Ticari güvenlik tarama çözümü

Bu araçlar CI/CD pipeline'larına entegre edilerek her kod değişikliğinde otomatik güvenlik taraması yapılması sağlanır. Güvenlik ihlali tespit edildiğinde pipeline durdurulur ve değişiklik üretime ulaşmadan düzeltme yapılır.

IaC Best Practice'leri

Başarılı bir IaC uygulaması için aşağıdaki en iyi uygulamalar takip edilmelidir:

Kod Organizasyonu

  • Ortam başına ayrı state dosyaları kullanın (dev, staging, prod)
  • Tekrar kullanılabilir modüller oluşturun
  • Modülleri versiyonlayın ve changelog tutun
  • Değişkenleri ortam bazında ayırın

Güvenlik

  • Hassas bilgileri asla kod içinde saklamayın
  • Secret manager entegrasyonu kullanın (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault)
  • State dosyasını şifreleyin ve erişimi kısıtlayın
  • En az yetki (least privilege) prensibini uygulayın

Operasyonel

  • Küçük ve odaklı değişiklikler yapın
  • Her değişikliği plan çıktısı ile doğrulayın
  • Drift detection mekanizması kurun
  • Rollback stratejisi belirleyin

Multi-Cloud IaC Stratejisi

Birçok organizasyon, vendor lock-in riskini azaltmak veya farklı bulut sağlayıcılarının güçlü yönlerinden faydalanmak için multi-cloud strateji benimser. Hem Terraform hem de Pulumi, birden fazla bulut sağlayıcısını aynı projede destekler.

Multi-Cloud Yaklaşımının Zorlukları

  • Her bulut sağlayıcısının farklı kavramları ve API'leri vardır
  • Sağlayıcılar arası ağ bağlantısı karmaşıktır
  • Ekibin birden fazla platformda uzmanlaşması gerekir
  • Maliyet takibi zorlaşır

Başarılı Multi-Cloud IaC İçin Öneriler

  • Soyutlama katmanları oluşturarak provider'a özgü detayları gizleyin
  • Ortak modüller ile standart arayüzler tanımlayın
  • Her bulut sağlayıcısı için uzman kişiler atayın
  • Merkezi bir cost management çözümü kullanın

Sonuç

Infrastructure as Code, modern altyapı yönetiminin temel taşıdır. Manuel yapılandırmaların yerini alan bu yaklaşım, tutarlılık, tekrarlanabilirlik ve otomasyon sağlayarak operasyonel mükemmelliğe ulaşmanızı mümkün kılar. Terraform ile geniş ekosistem ve topluluk desteğinden faydalanabilir, Pulumi ile bildiğiniz programlama dillerinin gücünü altyapı yönetimine taşıyabilirsiniz.

Hangi aracı seçerseniz seçin, GitOps entegrasyonu, otomatik testler ve güvenlik taramaları ile IaC süreçlerinizi olgunlaştırmanız kritik öneme sahiptir. Küçük başlayın, modüler yapılar oluşturun ve ekibinizin IaC becerilerini sürekli geliştirin. Altyapınızı kod olarak yönetmek, yazılım geliştirme süreçlerinizin hızını ve güvenilirliğini dramatik şekilde artıracaktır.

Bu yazıyı paylaş