
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
Can Kaya
Güvenlik Uzmanı
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.
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.
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.
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.
# 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 →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