Terraform ile Bulut Altyapısını Kod Olarak Yönetmek

Terraform ile Bulut Altyapısını Kod Olarak Yönetmek

Sunucu ve ağ kaynaklarını web panelinden tıklayarak oluşturmak, tekrarlanabilirlik ve denetim açısından ciddi riskler taşır. Terraform, altyapınızı kod olarak tanımlamanızı sağlayan açık kaynaklı bir IaC aracıdır. Bu rehberde HCL söz dizimi, state yönetimi, modül yapısı ve production ortamı için en

C

Can Kaya

Güvenlik Uzmanı

21 Mart 202613 dk okuma0

Sunucu ve ağ kaynaklarını web panelinden tıklayarak oluşturmak, tekrarlanabilirlik ve denetim açısından ciddi riskler taşır. Terraform, altyapınızı kod olarak tanımlamanızı sağlayan açık kaynaklı bir IaC aracıdır. Bu rehberde HCL söz dizimi, state yönetimi, modül yapısı ve production ortamı için en iyi uygulamaları ele alıyoruz.

Infrastructure as Code Nedir?

Infrastructure as Code (IaC), sunucu, ağ, depolama ve diğer altyapı bileşenlerini manuel işlemler yerine kod dosyalarıyla tanımlama yaklaşımıdır. Bu sayede altyapı değişiklikleri versiyon kontrolünde takip edilir, code review sürecinden geçer ve otomatik olarak uygulanır.

Özellik Manuel Yönetim Terraform IaC
Tekrarlanabilirlik Her seferinde farklı sonuç riski Aynı kod = aynı altyapı
Denetim Kim ne değiştirdi belirsiz Git geçmişinde tam iz
Hız Panel tıklamaları, dakikalar terraform apply, saniyeler
Disaster Recovery Manuel yeniden kurulum Kod çalıştır, altyapı geri gelsin

HCL Söz Dizimi ve Temel Yapı

Terraform, HashiCorp Configuration Language (HCL) kullanır. Her kaynak bir resource bloğuyla tanımlanır. Provider'lar hangi bulut platformuyla çalışacağınızı belirler.

main.tf
terraform {
  required_providers {
    hcloud = {
      source  = "hetznercloud/hcloud"
      version = "~> 1.45"
    }
  }
}

provider "hcloud" {
  token = var.hcloud_token
}

resource "hcloud_server" "web" {
  name        = "web-server-01"
  server_type = "cx21"
  image       = "ubuntu-22.04"
  location    = "fsn1"
  ssh_keys    = [hcloud_ssh_key.deploy.id]
}

resource "hcloud_ssh_key" "deploy" {
  name       = "deploy-key"
  public_key = file("~/.ssh/id_rsa.pub")
}

State Yönetimi

Terraform, oluşturduğu kaynakların durumunu terraform.tfstate dosyasında saklar. Bu dosya gerçek altyapı ile kod arasındaki eşlemeyi tutar. Ekip çalışmasında state dosyasını uzak bir backend'de (S3, GCS, Terraform Cloud) saklamak zorunludur.

backend.tf
terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "production/terraform.tfstate"
    region         = "eu-central-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

⚠️ Dikkat: terraform.tfstate dosyasını asla Git'e commit etmeyin. İçinde hassas bilgiler (IP adresleri, credential'lar) bulunabilir. .gitignore dosyanıza *.tfstate ve *.tfstate.backup ekleyin.

Terraform Modülleri

Modüller, tekrar eden altyapı kalıplarını paketlemenizi sağlar. Bir VPS + firewall + DNS kaydı kombinasyonunu modül olarak tanımlayıp farklı ortamlarda yeniden kullanabilirsiniz.

modules/web-server/main.tf
variable "server_name" {
  type = string
}

variable "server_type" {
  type    = string
  default = "cx21"
}

resource "hcloud_server" "this" {
  name        = var.server_name
  server_type = var.server_type
  image       = "ubuntu-22.04"
  location    = "fsn1"
}

resource "hcloud_firewall" "this" {
  name = "${var.server_name}-fw"
  rule {
    direction = "in"
    protocol  = "tcp"
    port      = "443"
    source_ips = ["0.0.0.0/0"]
  }
}

output "server_ip" {
  value = hcloud_server.this.ipv4_address
}

Plan, Apply ve Destroy Akışı

Terraform'un temel iş akışı üç komuttan oluşur: plan değişiklikleri önizler, apply uygular, destroy kaynakları siler. Production ortamında her zaman önce plan çıktısını inceleyin.

terminal
# Provider'ları indir ve başlat
$ terraform init

# Değişiklikleri önizle (hiçbir şey uygulanmaz)
$ terraform plan -out=tfplan

# Plan dosyasını uygula
$ terraform apply tfplan

# Tüm kaynakları sil (dikkatli kullanın)
$ terraform destroy

💡 İpucu: CI/CD pipeline'ınızda terraform plan -out=tfplan ile plan dosyası oluşturup, onay sonrası terraform apply tfplan ile uygulayın. Bu sayede plan ve apply arasında altyapı değişikliği olmaz.

Altyapı otomasyonu için GitHub Actions CI/CD rehberimizi, konfigürasyon yönetimi için Ansible Playbook rehberimizi inceleyin. Felaket kurtarma planı için IaC ile Disaster Recovery rehberimize göz atın. Terraform resmi dokümantasyonu ve Terraform Registry ek kaynak olarak faydalıdır.

Sıkça Sorulan Sorular

Terraform ile Ansible arasındaki fark nedir?

Terraform altyapı oluşturma ve yönetme (provisioning) için tasarlanmıştır: sunucu, ağ, DNS. Ansible ise mevcut sunucuların konfigürasyonu (paket kurulumu, dosya düzenleme) için kullanılır. İkisi birlikte kullanıldığında en iyi sonucu verir.

Terraform state dosyası neden bu kadar önemli?

State dosyası, Terraform'un gerçek altyapıyı takip ettiği tek kaynaktır. Kaybolursa Terraform mevcut kaynakları tanıyamaz ve yeniden oluşturmaya çalışır. Bu nedenle uzak backend ve state locking kullanmak zorunludur.

Terraform ücretsiz mi?

Terraform CLI açık kaynaklı ve ücretsizdir (BSL lisansı). Terraform Cloud'un ücretsiz planı 500 kaynak yönetimi sunar. Büyük ekipler için Terraform Enterprise veya Cloud Plus planları mevcuttur.

Mevcut altyapıyı Terraform'a aktarabilir miyim?

Evet, terraform import komutuyla mevcut kaynakları state dosyasına ekleyebilirsiniz. Ancak HCL kodunu manuel yazmanız gerekir. Terraform 1.5+ sürümlerinde import bloğu ile bu süreç daha kolaydır.

Sonuç

Terraform ile altyapınızı kod olarak yöneterek tekrarlanabilirlik, denetlenebilirlik ve hız kazanırsınız. State dosyasını uzak backend'de saklayın, modüller ile tekrar eden kalıpları paketleyin ve CI/CD pipeline'ınıza plan-apply akışını entegre edin. Küçük bir sunucuyla başlayıp tüm altyapınızı koda dönüştürebilirsiniz.

Altyapınızı Kod ile Yönetin

Hosted Cloud bulut sunucuları ile Terraform altyapınızı hızla kurun ve yönetin.

Bulut Sunucu Planlarını İncele →
C

Can Kaya

Güvenlik Uzmanı

Siber güvenlik, DDoS koruması ve sunucu sertleştirme konularında içerikler üretmektedir. CISSP sertifikalı güvenlik uzmanı.

Yorumlar yakında