İçeriğe geç
NetDevOps
16 dk okuma DevOps

Terraform İnceleme Rehberi

Modern sistem yönetiminde altyapıyı manuel olarak oluşturmak ve yönetmek, hem zaman kaybına hem de insan hatalarına neden olan bir yaklaşımdır. Sunucu, ağ, depolama ve diğer altyapı bileşenlerini elle yapılandırmak, özellikle büyük ölçekli ortamlarda sürdürülemez hale gelmektedir. Bu noktada Infrastructure as Code (IaC) kavramı, altyapı yönetiminde devrim niteliğinde bir değişim getirmiştir. Bu yazıda, HashiCorp tarafından geliştirilen ve sektörde en yaygın kullanılan IaC araçlarından biri olan Terraform'u detaylı olarak inceleyeceğiz.

Terraform, açık kaynaklı bir altyapı kodlama aracıdır ve "kod olarak altyapı" yaklaşımının en popüler örneklerinden biridir. Geleneksel altyapı yönetiminden farklı olarak, Terraform ile sunucuları, ağları, depolama birimlerini ve diğer altyapı bileşenlerini tanımlayabilir, versiyonlayabilir ve otomatik olarak oluşturabilirsiniz. Bu yaklaşım, altyapı provisioning süreçlerini hızlandırırken, hata oranlarını önemli ölçüde azaltmaktadır.

Bu rehberde, Terraform'un temel kavramlarından başlayarak, kurulum sürecine, dosya yapısına, provider'ların kullanımına, state yönetiminin inceliklerine ve en iyi uygulamalara kadar geniş bir yelpazede bilgi sunacağız. İster kendi fiziksel sunucularınızı ister bulut ortamlarınızı yönetiyor olun, Terraform size tutarlı, tekrarlanabilir ve güvenli bir altyapı yönetimi sağlayacaktır.

Terraform Nedir ve Neden Kullanmalıyız?

Terraform, HashiCorp tarafından geliştirilen ve declarative (bildirimsel) bir dil kullanarak altyapıyı kod olarak tanımlamanıza olanak tanıyan bir araçtır. Imperative (emredici) yaklaşımdan farklı olarak, Terraform'da "ne istediğinizi" tanımlarsınız, "nasıl yapılacağını" değil. Araç, mevcut durum ile istenen durum arasındaki farkı hesaplar ve gerekli değişiklikleri otomatik olarak uygular.

Terraform'un sunduğu temel avantajları detaylı olarak inceleyelim. Birincisi, tekrarlanabilirlik ve tutarlılıktır. Aynı konfigürasyon dosyasını kullanarak aynı altyapıyı birden fazla kez oluşturabilirsiniz. Bu özellik, özellikle test, staging ve production ortamları arasında tutarlılık sağlamak için kritik öneme sahiptir. İkincisi, versiyon kontrolü desteğidir. Terraform konfigürasyonları Git gibi versiyon kontrol sistemlerinde saklanabilir, böylece değişiklikler takip edilebilir ve gerektiğinde geri alınabilir. Üçüncüsü, planlama ve önizleme yeteneğidir. Terraform apply komutunu çalıştırmadan önce terraform plan ile yapılacak değişiklikleri önizleyebilir ve onaylayabilirsiniz.

Dördüncü avantaj, multi-cloud desteğidir. Tek bir araç ile AWS, Azure, Google Cloud, Proxmox veya kendi veri merkezinizdeki altyapıyı yönetebilirsiniz. Beşinci olarak, modülerlik ve yeniden kullanılabilirlik gelir. Terraform modülleri ile sık kullanılan altyapı bloklarını paketleyebilir ve farklı projelerde tekrar kullanabilirsiniz. Son olarak, otomasyon ve CI/CD entegrasyonu sayesinde altyapı değişiklikleri pipeline'lar aracılığıyla otomatik olarak uygulanabilir.

Terraform Kurulumu

Terraform'u kullanmaya başlamak için öncelikle sisteminize kurmanız gerekmektedir. Linux tabanlı sistemlerde kurulum, HashiCorp'un resmi APT reposu kullanılarak oldukça basit bir şekilde gerçekleştirilebilir. Aşağıdaki adımları izleyerek Ubuntu veya Debian tabanlı sistemlerinize Terraform kurabilirsiniz.

İlk olarak, HashiCorp'un GPG anahtarını indirmeniz ve sisteminize eklemeniz gerekmektedir. Bu güvenlik önlemi, indirdiğiniz paketlerin gerçekten HashiCorp tarafından sağlandığını doğrular. Ardından, apt sources listesine HashiCorp reposunu ekleyebilir ve paket listesini güncelleyebilirsiniz. Son olarak, Terraform paketini apt komutuyla kurabilirsiniz. Kurulum tamamlandıktan sonra terraform version komutuyla kurulumun başarılı olup olmadığını doğrulayabilirsiniz.

Kurulum sonrasında temel Terraform komutlarını kullanmaya hazır hale gelirsiniz. terraform init komutu, konfigürasyonda tanımlanan provider'ları indirir ve çalışma ortamını hazırlar. terraform plan komutu, mevcut altyapı ile tanımlanan konfigürasyon arasındaki farkları gösterir ve yapılacak değişiklikleri önizlemenizi sağlar. terraform apply komutu, plan'da gösterilen değişiklikleri uygular ve altyapıyı günceller. terraform destroy komutu ise Terraform tarafından yönetilen tüm kaynakları siler. Bu komut dikkatli kullanılmalıdır, çünkü geri alınamaz bir işlemdir.

Temel Dosya Yapısı ve Organizasyonu

Professional bir Terraform projesi oluştururken, kodun organize ve bakımı kolay bir yapıda olması kritik öneme sahiptir. İyi bir dosya yapısı, ekip çalışmasını kolaylaştırır ve konfigürasyonun anlaşılırlığını artırır. Tipik bir Terraform projesinde dört temel dosya bulunur: main.tf, variables.tf, outputs.tf ve terraform.tfvars.

Main.tf dosyası, asıl kaynak tanımlarının yapıldığı ve Terraform'un temel mantığının bulunduğu dosyadır. Burada provider tanımlamaları, resource blokları, data kaynakları ve module çağrıları yer alır. Bu dosya, projenin kalbidir ve genellikle en büyük dosya olacaktır.

Variables.tf dosyası, yeniden kullanılabilir değişkenlerin tanımlandığı yerdir. Bu dosyada tanımlanan değişkenler, farklı ortamlarda veya farklı konfigürasyonlarda değerleri değiştirmek için kullanılır. Örneğin, sunucu sayısı, sunucu boyutu, konum gibi değerler değişken olarak tanımlanabilir ve böylece aynı konfigürasyon farklı değerlerle kullanılabilir.

Outputs.tf dosyası, Terraform apply işlemi tamamlandıktan sonra görüntülenecek çıktıları tanımlar. Bu çıktılar, oluşturulan kaynakların önemli özelliklerini içerir. Örneğin, oluşturulan sunucunun IP adresi, veritabanı bağlantı string'i veya yük dengeleyicinin DNS adı outputs olarak tanımlanabilir. Bu değerler, sonraki adımlarda Ansible gibi konfigürasyon yönetim araçlarına veya CI/CD pipeline'larına aktarılabilir.

Terraform.tfvars dosyası, değişkenlerin gerçek değerlerini içerir. Bu dosya, hassas bilgiler (API token'ları, şifreler gibi) içerebileceği için genellikle .gitignore'a eklenir ve versiyon kontrolüne dahil edilmez. Bu yaklaşım, güvenlik açısından kritik öneme sahiptir.

Provider Kullanımı ve Proxmox Örneği

Terraform'un gücü, provider'lar aracılığıyla farklı altyapı platformlarına bağlanabilmesinden gelir. Provider'lar, Terraform ile farklı sistemler ve servisler arasında bir köprü görevi görür. Her provider, ilgili platformun API'siyle iletişim kurarak kaynak oluşturma, güncelleme ve silme işlemlerini gerçekleştirir.

Proxmox sanallaştırma platformu için Terraform provider'ı, fiziksel sunucularınız üzerinde sanal makine oluşturmayı ve yönetmeyi otomatikleştirir. Bu yaklaşım, özellikle birden fazla VM oluşturmanız gerektiğinde veya tekrarlanabilir VM şablonları oluşturmak istediğinizde son derece faydalıdır.

Proxmox provider kullanımı için öncelikle Terraform konfigürasyonunda provider'ı tanımlamanız gerekmektedir. Provider tanımında Proxmox sunucunuzun API URL'si, API token ID ve secret değerleri ile TLS sertifika doğrulaması ayarlarını belirtirsiniz. Token değerleri, güvenlik açısından değişken olarak tanımlanmalı ve terraform.tfvars dosyasında saklanmalıdır.

VM kaynağı oluştururken, sanal makinenin adını, hedef node'u, klonlanacak şablonu, CPU çekirdek sayısını, bellek miktarını, disk boyutunu ve ağ yapılandırmasını belirtebilirsiniz. Bu sayede, tek bir konfigürasyon dosyasıyla istediğiniz sayıda VM'i hızlıca oluşturabilirsiniz.

State Yönetimi: En Kritik Kavram

Terraform'un en kritik kavramlarından biri state yönetimidir. Terraform, oluşturduğu her kaynağı bir state dosyasında (terraform.tfstate) takip eder. Bu JSON formatındaki dosya, gerçek altyapı ile Terraform konfigürasyonu arasındaki eşleşmeyi sağlar. State dosyası olmadan, Terraform hangi kaynakların kendi yönetiminde olduğunu bilemez ve mevcut kaynakları yeniden oluşturmaya çalışabilir veya mevcut kaynakları silme riski oluşabilir.

Local state, tek kişilik kullanım veya laboratuvar ortamları için uygundur. Ancak ekip çalışmasında veya üretim ortamlarında kesinlikle önerilmez. Local state kullandığınızda, birden fazla kişi aynı anda terraform apply çalıştırdığında state dosyası üzerinde çakışma yaşanır ve kayıplar oluşabilir. Bu durum, "two terraform apply problem" olarak bilinir ve ciddi altyapı sorunlarına yol açabilir.

Remote state, ekip çalışması için zorunludur. Remote state, state dosyasının merkezi bir depolama alanında tutulmasını sağlar. AWS S3, Google Cloud Storage, Azure Blob Storage veya HashiCorp Terraform Cloud gibi backend'ler kullanılabilir. Remote state kullanmanın avantajları arasında ekip üyeleri arasında state paylaşımı, state locking (aynı anda sadece bir kişinin apply yapabilmesi) ve encryption (şifreleme) yer alır.

State locking, aynı anda birden fazla kişinin terraform apply çalıştırmasını engeller. İlk lock'u alan kişi işlemini tamamlayana kadar diğerleri beklemek zorunda kalır. Bu özellik, state dosyasının bozulmasını önlemek için kritiktir. AWS S3 backend kullanırken DynamoDB tablosu ile state locking sağlanabilir.

Remote Backend Yapılandırması

AWS S3, en yaygın kullanılan remote backend seçeneğidir. S3 bucket'ı state dosyasını saklamak için kullanılırken, DynamoDB tablosu state locking için kullanılır. Bu kombinasyon, güvenli ve profesyonel bir altyapı yönetimi sağlar.

S3 backend yapılandırmasında, bucket adı, dosya yolu (key), bölge ve DynamoDB tablo adı belirtilir. Ayrıca server-side encryption etkinleştirilmeli ve bucket policy'leri ile public access engellenmelidir. S3 bucket'ın versioning özelliği etkinleştirilmelidir; böylece state dosyasının önceki versiyonlarına geri dönülebilir.

Google Cloud Storage (GCS) backend, GCP kullanılan ortamlarda tercih edilir. Basit bir yapılandırma ile bucket adı ve prefix belirtilerek kullanılabilir. GCS, varsayılan olarak state locking sağlar ve versioning desteği sunar.

Azure Blob Storage backend, Azure kullanılan projelerde kullanılır. Resource group, storage account ve container bilgileri yapılandırmada belirtilir. Azure'nin Role-Based Access Control (RBAC) özelliği ile erişim kontrolü sağlanabilir.

Modül Kullanımı

Terraform modülleri, sık kullanılan altyapı bloklarını paketleyerek yeniden kullanılabilirlik sağlar. Bir modül, bir veya daha fazla kaynak grubunu kapsüller ve bu kaynaklar tek bir birim olarak yönetilebilir hale gelir. Örneğin, bir web sunucusu modülü oluşturabilir ve bu modülü farklı ortamlarda veya farklı projelerde kullanabilirsiniz.

Modül kullanmanın avantajları oldukça fazladır. Kod tekrarını önler, böylece aynı konfigürasyonu birden fazla yerde yazmak zorunda kalmazsınız. Standartlaşmayı sağlar; ekip üyeleri aynı modülleri kullanarak tutarlı altyapı oluşturur. Bakımı kolaylaştırır; bir modülde yapılan değişiklik, modülü kullanan tüm yerlerde otomatik olarak güncellenir. Soyutlama sağlar; modül kullanıcıları detayları bilmek zorunda kalmadan sadece gerekli parametreleri vererek altyapı oluşturabilir.

Bir modül oluşturmak için öncelikle bir modules klasörü oluşturulur ve içine ilgili .tf dosyaları yerleştirilir. Modülün input değişkenleri (variables) ve output değerleri tanımlanır. Ana konfigürasyondan module kaynağı çağrılarak modül kullanılır. count veya for_each ile döngüsel olarak birden fazla kaynak oluşturulabilir.

Terraform ve Ansible Entegrasyonu

Terraform ve Ansible, birlikte kullanıldığında güçlü bir altyapı yönetimi çözümü sunar. Terraform, altyapıyı (sunucular, ağ, depolama) oluştururken, Ansible oluşturulan bu altyapıyı yapılandırır (paket kurulumu, konfigürasyon dosyaları, uygulama dağıtımı). Bu iki aracın kombinasyonu, tam bir CI/CD pipeline'ı oluşturur.

Entegrasyon akışı şu şekilde çalışır. İlk olarak Terraform, ihtiyaç duyulan altyapı kaynaklarını oluşturur. Oluşturulan kaynakların önemli özellikleri (örneğin IP adresleri) Terraform outputs olarak tanımlanır. Bu çıktılar, Ansible inventory dosyasına aktarılır veya doğrudan Ansible playbook'larına iletilir. Ardından Ansible, sunuculara bağlanır, gerekli paketleri kurar, konfigürasyon dosyalarını yükler ve uygulamaları deploy eder.

Bu yaklaşım, "mutable infrastructure" (değiştirilebilir altyapı) ve "immutable infrastructure" (değiştirilemez altyapı) tartışmasında önemli bir rol oynar. Terraform + Ansible kombinasyonu, mutable yaklaşımı destekler; yani sunucular oluşturulduktan sonra Ansible ile sürekli olarak güncellenir. Immutable yaklaşımda ise her değişiklik için yeni bir imaj oluşturulur ve eski sunucular değiştirilmez, yenileri ile değiştirilir.

Format ve Doğrulama

Terraform konfigürasyonlarının tutarlı bir formatta olması, ekip çalışmasını kolaylaştırır ve kod incelemesini basitleştirir. Terraform, bu amaçla yerleşik formatlama ve doğrulama araçları sunar.

terraform fmt komutu, konfigürasyon dosyalarını standart formata dönüştürür. Girinti, boşluklar ve satır sonları otomatik olarak düzeltilir. Bu komutun düzenli olarak çalıştırılması, kod tabanının temiz kalmasını sağlar.

terraform validate komutu, konfigürasyon dosyalarının sözdizimsel doğruluğunu kontrol eder. Resource isimleri, değişken tipleri, required alanlar ve referanslar doğrulanır. Bu komut, özellikle CI/CD pipeline'larında commit edilen kodların geçerliliğini kontrol etmek için kullanılır. Her terraform apply öncesinde validate komutunun çalıştırılması önerilir.

Bulut Sağlayıcı Örnekleri

Terraform, AWS, Azure, Google Cloud dahil olmak üzere birçok bulut sağlayıcısını destekler. Her bulut sağlayıcısı için ayrı provider tanımlamaları yapılmalıdır. Provider'lar, ilgili bulut platformunun API'leri ile iletişim kurar ve kaynak oluşturma, güncelleme ve silme işlemlerini gerçekleştirir.

AWS için en yaygın kullanılan kaynaklar arasında EC2 instance'ları, RDS veritabanları, S3 bucket'ları, Lambda fonksiyonları, VPC ağ bileşenleri ve IAM roller yer alır. Her kaynak tipi, AWS'in detaylı API'sini kullanır ve Terraform'un declarative diline dönüştürülür.

Azure için virtual machines, storage accounts, virtual networks, Azure SQL ve Kubernetes cluster'ları oluşturulabilir. Azure provider, Azure Resource Manager API'sini kullanır ve Azure'un tüm servisleriyle entegrasyon sağlar.

Hetzner Cloud, küçük ve orta ölçekli projeler için popüler bir seçenektir. Uygun fiyatlı ve performanslı sunucuları, Terraform ile kolayca oluşturulabilir. Hetzner provider, basit bir API token ile yapılandırılır ve hcloud_server kaynağı ile sunucu oluşturulur.

En İyi Uygulamalar ve Öneriler

Professional bir Terraform kullanımı için aşağıdaki en iyi uygulamaları göz önünde bulundurmanızı öneririz.

İlk olarak, backend yapılandırmasını erken aşamada yapın. Projeye başladığınızda remote backend kurulumu yapın ve local state kullanmayın. Bu yaklaşım, sonradan geçiş yapmaktan çok daha kolaydır.

İkinci olarak, değişkenleri etkin kullanın. Sabit değerler yerine değişkenler kullanarak konfigürasyonları yeniden kullanılabilir hale getirin. Hassas değerleri terraform.tfvars dosyasında saklayın ve bu dosyayı .gitignore'a ekleyin.

Üçüncü olarak, modüler tasarım uygulayın. Büyük ve karmaşık konfigürasyonları küçük, yeniden kullanılabilir modüllere bölün. Modüllerin tek sorumluluğu olsun; bir modül bir bileşeni (VPC, web sunucusu, veritabanı) yönetmeli.

Dördüncü olarak, state dosyasını güvende tutun. State dosyası, hassas bilgiler içerebilir. Remote backend kullanın, encryption etkinleştirin ve erişim kontrollerini yapılandırın.

Beşinci olarak, plan çıktısını her zaman inceleyin. terraform apply komutunu çalıştırmadan önce plan çıktısını dikkatlice okuyun. Beklenmeyen değişiklikleri tespit edin ve gerektiğinde konfigürasyonu düzeltin.

Altıncı olarak, versiyon kontrolü kullanın. Terraform konfigürasyonlarını Git gibi bir versiyon kontrol sisteminde saklayın. Commit mesajlarında değişikliklerin nedenini açıklayın.

Yedinci olarak, CI/CD pipeline'ına entegre edin. Değişiklikler otomatik olarak test edilmeli ve onay alındıktan sonra uygulanmalıdır. Bu yaklaşım, hata riskini azaltır ve değişiklik takibini kolaylaştırır.

Sonuç

Terraform, modern altyapı yönetiminin temel taşlarından biri haline gelmiştir. Kod olarak altyapı yaklaşımı, manuel süreçlerin yerini otomatik, tekrarlanabilir ve güvenilir süreçlere bırakmıştır. Bu rehberde, Terraform'un temel kavramlarından başlayarak, kurulum, dosya yapısı, provider kullanımı, state yönetimi, modül yapısı ve en iyi uygulamaları detaylı olarak ele aldık.

Terraform'u etkili bir şekilde kullanarak, altyapı provisioning süreçlerinizi hızlandırabilir, hata oranlarınızı azaltabilir ve ekip çalışmanızı kolaylaştırabilirsiniz. Özellikle Ansible ile entegrasyonu, tam bir altyapı ve konfigürasyon yönetimi çözümü sunar. Bulut veya on-premise ortamlarınızı Terraform ile yönetmek, operasyonel verimliliğinizi önemli ölçüde artıracaktır.

Başlangıçta öğrenme eğrisi biraz dik görünse de, Terraform'un sunduğu avantajlar bu yatırıma değmektedir. Küçük bir lab ortamından başlayarak, deneyim kazandıkça daha büyük ve karmaşık altyapıları Terraform ile yönetmeye başlayabilirsiniz. Unutmayın, en iyi öğrenme yöntemi pratiktir; bu nedenle öğrendiklerinizi hemen uygulamaya koymanızı öneririz.

İleri Düzey Terraform Kullanımı

Terraform becerilerinizi bir üst seviyeye taşımak için bazı ileri düzey konseptleri de bilmenizde fayda vardır. Workspace'ler, aynı konfigürasyonu farklı ortamlar için kullanmanıza olanak tanır. Prod, staging ve development ortamlarını tek bir kod tabanından yönetebilirsiniz. Her workspace'in kendi state dosyası olur, böylece ortamlar birbirinden izole edilmiş şekilde yönetilir.

Data kaynakları, Terraform tarafından oluşturulmayan ancak mevcut altyapıdan okunan verileri kullanmanızı sağlar. Örneğin, mevcut bir VPC'nin ID'sini veya AWS hesabınızdaki mevcut AMI'leri okuyabilirsiniz. Bu özellik, Terraform olmayan kaynaklarla entegrasyon için kritiktir.

Terraform import komutu ile zaten var olan altyapıyı Terraform yönetimine alabilirsiniz. Elle oluşturduğunuz bir sunucuyu veya ağ bileşenini Terraform konfigürasyonuna import ederek, mevcut altyapınızı kod olarak yönetmeye başlayabilirsiniz. Bu özellik, Terraform'a geçiş sürecinde büyük kolaylık sağlar.

Provisioners, kaynak oluşturulduktan sonra çalışan scriptleri veya yazılımları ifade eder. Ancak provisioner kullanımı genellikle önerilmez; çünkü bu yaklaşım "mutable infrastructure" yaratır. Bunun yerine, kaynak oluşturulduktan sonra Ansible gibi harici araçların kullanılması tercih edilir.

Son olarak, Terraform Cloud veya Terraform Enterprise, ekip çalışması için geliştirilmiş ürünlerdir. Remote state yönetimi, state locking, policy enforcement ve UI tabanlı state görüntüleme gibi özellikler sunarlar. Büyük ekipler için bu ürünler önerilir.