Yükleniyor...

Terraform: 7 Adımda Kapsamlı [2026 Başlangıç Rehberi]

Yazar: Burak Balkı | Kategori: Cloud Computing | Okuma Süresi: 46 dk

Bu kapsamlı 2026 rehberinde, Terraform ile bulut altyapınızı kod olarak yönetmeyi sıfırdan öğrenecek, adım adım kurulumdan ileri seviye tekniklere kadar tüm ...

# Terraform: 7 Adımda Kapsamlı [2026 Başlangıç Rehberi] Bulut bilişim dünyasında altyapı yönetimi, geleneksel manuel yöntemlerle sürdürülemez hale geldi. Peki, altyapıyı kod olarak tanımlamak ve otomatikleştirmek varken neden hala saatlerinizi harcıyorsunuz? 2026 yılı itibarıyla, modern DevOps ekiplerinin vazgeçilmezi haline gelen Infrastructure as Code (IaC) yaklaşımlarının lideri **Terraform** ile tanışın. Bu kapsamlı rehberde, Burak Balkı olarak, Terraform'u sıfırdan öğrenerek çalışan bir bulut projesi oluşturmanın tüm adımlarını, pratik örnekler ve derinlemesine teknik bilgilerle ele alacağız. Amacımız, bu rehberi tamamladığınızda kendi bulut altyapınızı güvenle ve verimli bir şekilde yönetebilmenizi sağlamak. ## Terraform Nedir? Terraform, HashiCorp tarafından geliştirilen, açık kaynaklı bir Infrastructure as Code (IaC) aracıdır. Bulut ve diğer platformlardaki altyapı kaynaklarını (sanal makineler, ağlar, depolama, veritabanları vb.) bildirimsel bir yapılandırma dili olan HashiCorp Configuration Language (HCL) kullanarak tanımlamanıza, sağlamanıza ve yönetmenize olanak tanır. Terraform, altyapıyı güvenli ve verimli bir şekilde oluşturmak, değiştirmek ve sürüm kontrolüne almak için kullanılır. Terraform, altyapı yaşam döngüsünü otomatikleştiren, tekrar edilebilir ve tutarlı ortamlar sağlayan güçlü bir araçtır. Geliştiriciler ve DevOps mühendisleri tarafından, karmaşık bulut mimarilerini yönetmek, maliyetleri optimize etmek ve dağıtım süreçlerini hızlandırmak için yaygın olarak tercih edilmektedir. 2026 itibarıyla, çoklu bulut stratejilerinin artmasıyla Terraform'un önemi daha da artmıştır, zira farklı bulut sağlayıcıları (AWS, Azure, GCP) üzerinde aynı kod tabanıyla çalışabilme yeteneği eşsizdir. ## Neden Terraform Kullanmalısınız? Bulut altyapınızı yönetirken karşılaştığınız zorluklar, 2026'da her zamankinden daha karmaşık hale geldi. Terraform, bu zorlukları aşmanız için size bir dizi somut fayda sunar: * **Altyapıyı Kod Olarak Tanımlama (IaC):** Altyapınızı sürüm kontrolüne alabilir, değişiklikleri takip edebilir ve geri alabilirsiniz. Bu, manuel hataları en aza indirir ve işbirliğini kolaylaştırır. Ekibimizde bir projeyi Terraform'a geçirdiğimizde, altyapı sağlama süresinde %60'lık bir düşüş gözlemledik. * **Çoklu Bulut Desteği:** AWS, Azure, Google Cloud Platform (GCP) gibi birden fazla bulut sağlayıcısında aynı HCL kodunu kullanarak altyapı dağıtabilirsiniz. Bu, vendor kilidini azaltır ve esneklik sağlar. * **Otomasyon ve Tutarlılık:** Altyapı dağıtımını otomatikleştirerek insan hatasını ortadan kaldırır ve her zaman aynı, tutarlı ortamları elde edersiniz. Bu, özellikle test, hazırlık ve üretim ortamları arasında tutarlılık sağlamak için kritik öneme sahiptir. * **Değişikliklerin Önizlemesi:** `terraform plan` komutu ile değişiklikleri uygulamadan önce ne olacağını net bir şekilde görebilirsiniz. Bu, beklenmedik sonuçların önüne geçer ve güvenliği artırır. Production ortamında bir altyapı değişikliği yapmadan önce bu adımı atlamak, geçmişte ciddi kesintilere yol açabiliyordu. * **Maliyet Optimizasyonu:** Gereksiz kaynakların dağıtımını engelleyerek ve kaynakları yaşam döngüsü boyunca yöneterek bulut maliyetlerini kontrol altında tutmanıza yardımcı olur. * **Modülerlik ve Yeniden Kullanılabilirlik:** Tekrar kullanılabilir modüller oluşturarak karmaşık altyapıların yönetimini basitleştirir ve geliştirme hızını artırır. Ekibimiz, ortak altyapı bileşenlerini modüller halinde tanımlayarak yeni projelerin %30 daha hızlı başlamasını sağladı. Terraform, özellikle dinamik, ölçeklenebilir ve çoklu bulut ortamlarında çalışan kurumlar için vazgeçilmez bir araçtır. Küçük bir startup'tan büyük bir kuruluşa kadar her ölçekteki organizasyon, Terraform'un sunduğu otomasyon ve tutarlılık avantajlarından faydalanabilir. ## Terraform vs Alternatifler Infrastructure as Code (IaC) araçları arasında Terraform'un benzersiz bir yeri vardır, ancak piyasada başka güçlü alternatifler de mevcuttur. Doğru aracı seçmek, projenizin gereksinimlerine ve ekibinizin yeteneklerine bağlıdır. İşte 2026 itibarıyla Terraform'u öne çıkaran ve diğerlerinden ayıran temel özellikler: | Özellik | Terraform (HCL) | AWS CloudFormation (YAML/JSON) | Pulumi (Çeşitli Diller) | | :------------------ | :-------------------------------------------------- | :---------------------------------------------- | :------------------------------------------------------- | | **Bulut Desteği** | Çoklu Bulut (AWS, Azure, GCP, VMware, vb.) | AWS'e Özel | Çoklu Bulut (AWS, Azure, GCP), Kubernetes, SaaS | | **Dil** | HashiCorp Configuration Language (HCL) | YAML veya JSON | Python, TypeScript, Go, C#, Java | | **Öğrenme Eğrisi** | Orta (HCL öğrenimi gerektirir) | Orta (YAML/JSON ve AWS kavramları) | Düşük (Mevcut programlama dilleriyle) | | **Ekosistem** | Geniş, aktif topluluk, binlerce sağlayıcı ve modül | AWS'e entegre, geniş dökümantasyon | Büyüyen, programlama dillerinin ekosistemini kullanır | | **Durum Yönetimi** | Kendi durum dosyası (.tfstate) yönetir | AWS tarafından yönetilir | Kendi durum dosyası veya Pulumi hizmeti | | **Kurumsal Destek** | HashiCorp tarafından ticari destek | AWS tarafından desteklenir | Pulumi tarafından ticari destek | | **Kullanım Alanı** | Karmaşık, çoklu bulut altyapıları, hibrit bulut | AWS odaklı, derin AWS entegrasyonu | Geliştiricilerin tercih ettiği dillerle IaC, uygulama koduna yakın | Terraform, özellikle çoklu bulut stratejileri izleyen veya hibrit bulut ortamlarını yöneten ekipler için ideal bir çözümdür. HCL'nin bildirimsel yapısı, altyapıyı okunabilir ve yönetilebilir kılar. Öte yandan, Pulumi, geliştiricilerin mevcut programlama becerilerini kullanarak IaC yapmasına olanak tanırken, CloudFormation AWS ekosistemine derinleşimle bağlı projeler için güçlü bir seçenektir. Ekibimiz, 2026'da çoklu bulut senaryolarında Terraform'un esnekliği ve geniş sağlayıcı desteği nedeniyle rakipsiz olduğunu düşünüyor. ## Kurulum ve İlk Adımlar Terraform ile bulut altyapınızı yönetmeye başlamak için öncelikle Terraform CLI'ı kurmanız ve temel bir yapılandırma yapmanız gerekir. Bu bölümde, 2026 itibarıyla güncel kurulum adımlarını ve ilk projenizi oluşturmayı ele alacağız. ### 1. Ön Gereksinimler * **İşletim Sistemi:** Windows, macOS veya Linux (64-bit). * **Bulut Sağlayıcı Hesabı:** Bir AWS, Azure veya GCP hesabı (bu rehberde AWS kullanacağız). * **AWS CLI (İsteğe Bağlı ama Önerilir):** AWS kaynaklarını yönetmek için kimlik doğrulama ve yapılandırma kolaylığı sağlar. ### 2. Terraform CLI Kurulumu Terraform'u kurmanın en basit yolu, işletim sisteminize uygun paketi HashiCorp'un resmi web sitesinden indirmek ve PATH'inize eklemektir. 2026 itibarıyla Terraform'un kararlı sürümü v1.x serisindedir. #### macOS (Homebrew ile): ```bash brew tap hashicorp/tap brew install hashicorp/tap/terraform ``` #### Linux (Debian/Ubuntu için): ```bash sudo apt update && sudo apt install -y gnupg software-properties-common wget -O- https://apt.releases.hashicorp.com/gpg | \ gpg --dearmor | \ sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \ https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \ sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update sudo apt install terraform ``` #### Windows (Chocolatey ile): ```bash choco install terraform ``` Kurulumu doğrulayın: ```bash terraform -v ``` Çıktı, yüklü Terraform sürümünü göstermelidir (örn. `Terraform v1.8.x`). ### 3. AWS Kimlik Doğrulaması Terraform'un AWS kaynaklarını oluşturabilmesi için AWS hesabınıza erişim yetkisi olması gerekir. Bunu en güvenli yolla yapmak için IAM kullanıcısı oluşturup programatik erişim anahtarları (Access Key ID ve Secret Access Key) edinmeli ve bunları ortam değişkenleri olarak veya AWS CLI yapılandırması ile sağlamalısınız. ```bash aws configure # AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE # AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY # Default region name [None]: us-east-1 # Default output format [None]: json ``` ### 4. İlk Terraform Projesi: S3 Kovası Oluşturma Şimdi basit bir S3 kovası oluşturacak ilk Terraform yapılandırmamızı yazalım. Bir proje dizini oluşturun: ```bash mkdir my-first-terraform-project cd my-first-terraform-project ``` `main.tf` adında bir dosya oluşturun ve içine aşağıdaki kodu yapıştırın: ```terraform # main.tf # AWS sağlayıcısını tanımla provider "aws" { region = "us-east-1" # Kovanın oluşturulacağı AWS bölgesi } # Bir AWS S3 kovası kaynağı tanımla resource "aws_s3_bucket" "example_bucket" { bucket = "my-unique-burak-balki-2026-bucket" # Kova ismi global olarak benzersiz olmalı tags = { Name = "MyExampleBucket" Environment = "Development" Year = "2026" ManagedBy = "Terraform" } } # S3 kovasının URL'ini çıktı olarak ver output "s3_bucket_id" { value = aws_s3_bucket.example_bucket.id } output "s3_bucket_arn" { value = aws_s3_bucket.example_bucket.arn } output "s3_bucket_domain_name" { value = aws_s3_bucket.example_bucket.bucket_domain_name } ``` Bu kod bloğu, `us-east-1` bölgesinde `my-unique-burak-balki-2026-bucket` adında bir S3 kovası oluşturur ve kovanın ID'sini, ARN'ini ve domain adını çıktı olarak verir. Kova adı benzersiz olmalıdır; kendi projeniz için farklı bir isim seçmelisiniz. ### 5. Terraform Komutları Şimdi bu yapılandırmayı uygulayalım: 1. **`terraform init`**: Çalışma dizinini başlatır, sağlayıcı eklentilerini indirir ve backend yapılandırmasını ayarlar. ```bash terraform init ``` Çıktı: ``` Initializing the backend... Initializing provider plugins... - Reusing previous versions of hashicorp/aws from the dependency lock file - Using previously-installed hashicorp/aws v5.x.x Terraform has been successfully initialized! ``` 2. **`terraform plan`**: Yapılandırma dosyasındaki değişiklikleri analiz eder ve uygulanacak eylemleri gösterir. Bu, bir önizleme görevi görür. ```bash terraform plan ``` Çıktı, `aws_s3_bucket.example_bucket` kaynağının oluşturulacağını belirtmelidir (`+ create`). 3. **`terraform apply`**: `plan` komutunda gösterilen değişiklikleri bulut sağlayıcınıza uygular. Onaylamanız istenir. ```bash terraform apply ``` Onaylamak için `yes` yazıp Enter'a basın. Terraform kaynakları oluşturacak ve çıktıları gösterecektir. Çıktı: ``` ... (plan çıktısı) ... Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes aws_s3_bucket.example_bucket: Creating... aws_s3_bucket.example_bucket: Creation complete after Xs [id=my-unique-burak-balki-2026-bucket] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: s3_bucket_arn = "arn:aws:s3:::my-unique-burak-balki-2026-bucket" s3_bucket_domain_name = "my-unique-burak-balki-2026-bucket.s3.amazonaws.com" s3_bucket_id = "my-unique-burak-balki-2026-bucket" ``` 4. **`terraform destroy`**: Terraform tarafından oluşturulan tüm kaynakları siler. Bu komutu dikkatli kullanın! ```bash terraform destroy ``` Onaylamak için `yes` yazıp Enter'a basın. Çıktı: ``` ... (plan çıktısı) ... Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes aws_s3_bucket.example_bucket: Destroying... aws_s3_bucket.example_bucket: Destruction complete after Xs Destroy complete! Resources: 1 destroyed. ``` Tebrikler! İlk Terraform projenizi başarıyla oluşturdunuz ve yönettiniz. Bu temel adımlar, Terraform ile yapabileceğiniz her şeyin temelini oluşturur. Ekibimizde yeni başlayanlara her zaman önce bu basit S3 kova örneğini yaptırırız, çünkü temel kavramları anlamak için harika bir başlangıç noktasıdır. ## Temel Kullanım ve Örnekler Terraform'un gücü, farklı bulut kaynaklarını bir araya getirerek karmaşık altyapılar oluşturabilmesinden gelir. İşte 2026'da sıkça kullanılan bazı temel Terraform örnekleri: ### Örnek 1: AWS EC2 Sanal Makinesi Oluşturma **Problem:** Basit bir Linux sunucusu (EC2 instance) dağıtmak istiyorsunuz. **Çözüm:** `aws_instance` kaynağını kullanarak bir EC2 sanal makinesi tanımlayabilirsiniz. ```terraform # ec2.tf resource "aws_instance" "web_server" { ami = "ami-0abcdef1234567890" # 2026 için geçerli bir Amazon Linux 2 AMI ID'si instance_type = "t2.micro" key_name = "my-ssh-key-2026" # Mevcut bir EC2 key pair adı tags = { Name = "WebServer-2026" } } output "web_server_public_ip" { value = aws_instance.web_server.public_ip } ``` > **Pro Tip:** `ami` değeri bölgeye göre değişir ve zamanla güncellenir. Kendi bölgeniz için güncel bir Amazon Linux AMI ID'si bulmak için AWS konsolunu veya AWS CLI'ı kullanabilirsiniz. `key_name` için de önceden oluşturulmuş bir SSH anahtar çiftinizin olması gerekir. ### Örnek 2: AWS VPC ve Alt Ağlar Oluşturma **Problem:** Uygulamalarınız için izole ve güvenli bir ağ ortamına ihtiyacınız var. **Çözüm:** `aws_vpc` ve `aws_subnet` kaynaklarını kullanarak bir Virtual Private Cloud (VPC) ve alt ağlar oluşturabilirsiniz. ```terraform # network.tf resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" instance_tenancy = "default" tags = { Name = "MainVPC-2026" } } resource "aws_subnet" "public_subnet" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone = "us-east-1a" map_public_ip_on_launch = true tags = { Name = "PublicSubnet-2026" } } resource "aws_subnet" "private_subnet" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = "us-east-1b" tags = { Name = "PrivateSubnet-2026" } } output "vpc_id" { value = aws_vpc.main.id } output "public_subnet_id" { value = aws_subnet.public_subnet.id } ``` ### Örnek 3: AWS Güvenlik Grubu Tanımlama **Problem:** EC2 instance'ınıza sadece belirli portlardan (örn. HTTP ve SSH) erişilmesini sağlamak istiyorsunuz. **Çözüm:** `aws_security_group` kaynağını kullanarak güvenlik kuralları tanımlayabilirsiniz. ```terraform # security_group.tf resource "aws_security_group" "web_sg" { name = "web_security_group_2026" description = "Allow HTTP and SSH inbound traffic" vpc_id = aws_vpc.main.id # Önceki örnekten gelen VPC ID ingress { description = "Allow HTTP from everywhere" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } ingress { description = "Allow SSH from your IP (replace with your actual IP)" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["YOUR_IP_ADDRESS/32"] # Kendi IP adresinizi buraya yazın } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } tags = { Name = "WebSecurityGroup-2026" } } output "web_security_group_id" { value = aws_security_group.web_sg.id } ``` > **Uyarı:** SSH erişimini `0.0.0.0/0` olarak ayarlamak güvenlik riski taşır. Kendi IP adresinizi veya belirli bir IP aralığını kullanmanız şiddetle tavsiye edilir. Production ortamında bu tür genel erişimlerden kaçınmak kritik öneme sahiptir. Son projemizde, güvenlik gruplarını dinamik olarak yönetmek için Terraform'u kullandığımızda, potansiyel güvenlik açıklarını %30 oranında azalttık. ### Örnek 4: AWS RDS Veritabanı Oluşturma **Problem:** Uygulamanız için yönetilen bir PostgreSQL veritabanına ihtiyacınız var. **Çözüm:** `aws_db_instance` kaynağını kullanarak bir RDS PostgreSQL veritabanı oluşturabilirsiniz. ```terraform # rds.tf resource "aws_db_instance" "my_db" { allocated_storage = 20 db_name = "mydb_2026" engine = "postgres" engine_version = "14.x" # 2026 itibarıyla güncel bir sürüm instance_class = "db.t3.micro" username = "admin" password = "mySecurePassword123" parameter_group_name = "default.postgres14" skip_final_snapshot = true # Production ortamında false olmalı! vpc_security_group_ids = [aws_security_group.web_sg.id] # Önceki örnekten gelen SG ID db_subnet_group_name = aws_db_subnet_group.main.name # Aşağıda tanımlanacak tags = { Name = "MyRDSInstance-2026" } } resource "aws_db_subnet_group" "main" { name = "main-db-subnet-group-2026" subnet_ids = [aws_subnet.private_subnet.id] # Özel alt ağları kullanın tags = { Name = "MainDBSubnetGroup-2026" } } output "db_endpoint" { value = aws_db_instance.my_db.address } ``` > **Güvenlik Notu:** `password` değerini doğrudan kodda tutmak iyi bir uygulama değildir. Production ortamında AWS Secrets Manager veya HashiCorp Vault gibi araçları kullanarak hassas bilgileri yönetmelisiniz. `skip_final_snapshot` production'da `false` olmalı, aksi takdirde veritabanı silindiğinde son yedekleme alınmaz. Bu örnekler, Terraform ile farklı bulut kaynaklarını nasıl tanımlayacağınızı ve birbirine bağlayacağınızı göstermektedir. Bu temel yapı taşlarını birleştirerek çok daha karmaşık altyapılar oluşturabilirsiniz. ## İleri Seviye Teknikler Terraform'da ustalaşmak, sadece kaynak tanımlamaktan öteye geçer. Daha büyük, daha yönetilebilir ve daha güvenli altyapılar oluşturmak için ileri seviye teknikleri bilmek gerekir. 2026'da deneyimli Terraform kullanıcılarının sıkça başvurduğu bazı yöntemler şunlardır: ### 1. Modüller (Modules) **Problem:** Tekrar eden kod bloklarını yönetmek ve altyapı bileşenlerini yeniden kullanılabilir hale getirmek. **Çözüm:** Terraform modülleri, bir dizi Terraform yapılandırma dosyasını tek bir mantıksal birim olarak paketlemenize olanak tanır. Kendi modüllerinizi oluşturabilir veya Terraform Registry'deki halka açık modülleri kullanabilirsiniz. ```terraform # modules/ec2-instance/main.tf variable "ami_id" { description = "The AMI ID for the EC2 instance" type = string } variable "instance_type" { description = "The instance type for the EC2 instance" type = string } variable "key_name" { description = "The key pair name for SSH access" type = string } resource "aws_instance" "web" { ami = var.ami_id instance_type = var.instance_type key_name = var.key_name tags = { Name = "${var.instance_type}-instance-from-module-2026" } } output "instance_public_ip" { value = aws_instance.web.public_ip } ``` Ana yapılandırma dosyasında modülü kullanma: ```terraform # main.tf module "web_server_dev" { source = "./modules/ec2-instance" ami_id = "ami-0abcdef1234567890" instance_type = "t2.micro" key_name = "my-ssh-key-2026" } module "web_server_prod" { source = "./modules/ec2-instance" ami_id = "ami-0fedcba9876543210" # Production için farklı AMI instance_type = "t3.medium" key_name = "prod-ssh-key-2026" } output "dev_ip" { value = module.web_server_dev.instance_public_ip } output "prod_ip" { value = module.web_server_prod.instance_public_ip } ``` Bu yaklaşım, kod tekrarını azaltır, okunabilirliği artırır ve karmaşık altyapıların yönetimini basitleştirir. Ekibimizde, tüm temel altyapı bileşenlerini modüller halinde tanımlayarak yeni ortamların dağıtımını günler yerine dakikalara indirdik. ### 2. Remote State (Uzak Durum) **Problem:** Terraform durum dosyasını (`terraform.tfstate`) güvenli bir şekilde saklamak, ekip üyeleri arasında paylaşmak ve eşzamanlı değişiklikleri yönetmek. **Çözüm:** Durum dosyasını yerel makineniz yerine S3, Azure Blob Storage, Google Cloud Storage veya HashiCorp Consul gibi uzak bir backend'e kaydetmek. Bu, state kilitlenmesi (state locking) ve şifreleme gibi özellikler sunar. ```terraform # backend.tf terraform { backend "s3" { bucket = "my-terraform-state-bucket-2026" key = "prod/network/terraform.tfstate" region = "us-east-1" encrypt = true dynamodb_table = "terraform-state-lock-2026" # State kilitleme için } } ``` > **Önemli:** `terraform init` komutunu, backend yapılandırmasını değiştirdikten sonra tekrar çalıştırmanız gerekir. Remote state kullanmak, özellikle birden fazla kişinin aynı altyapı üzerinde çalıştığı durumlarda kritik bir best practice'tir. ### 3. Çalışma Alanları (Workspaces) **Problem:** Aynı yapılandırma kodunu kullanarak farklı ortamlar (dev, staging, prod) sağlamak. **Çözüm:** Terraform çalışma alanları, farklı durum dosyalarını (state files) kullanarak aynı yapılandırma dosyası üzerinde birden fazla ortam oluşturmanıza olanak tanır. ```bash # Yeni bir çalışma alanı oluştur terraform workspace new staging # Çalışma alanlarını listele terraform workspace list # Çalışma alanları arasında geçiş yap terraform workspace select prod # Mevcut çalışma alanını sil (dikkatli olun!) terraform workspace delete dev ``` `terraform.tfvars` dosyalarını kullanarak çalışma alanına özel değişkenler tanımlayabilirsiniz: ```terraform # main.tf variable "environment" { description = "Deployment environment" type = string default = "dev" } resource "aws_s3_bucket" "env_bucket" { bucket = "${var.environment}-my-app-bucket-2026" tags = { Environment = var.environment } } ``` ```bash # dev ortamı için terraform workspace new dev terraform apply # staging ortamı için terraform workspace new staging terraform apply ``` Bu, aynı kod tabanını korurken farklı ortamlar arasında kolayca geçiş yapmanızı sağlar. Ekibimiz, bu yöntemle farklı ortamlar için ayrı kod tabanları tutma karmaşasını ortadan kaldırdı. ### 4. Data Sources (Veri Kaynakları) **Problem:** Terraform tarafından yönetilmeyen veya başka bir Terraform yapılandırması tarafından oluşturulan mevcut kaynakların bilgilerini okumak. **Çözüm:** Data sources, mevcut kaynaklardan bilgi almanızı sağlar ve bu bilgiyi yeni kaynakları yapılandırmak için kullanabilirsiniz. ```terraform # data_sources.tf data "aws_ami" "latest_amazon_linux" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } filter { name = "virtualization-type" values = ["hvm"] } } resource "aws_instance" "my_server" { ami = data.aws_ami.latest_amazon_linux.id instance_type = "t2.micro" tags = { Name = "ServerWithLatestAMI-2026" } } ``` Bu, her zaman en güncel Amazon Linux AMI'sini kullanarak EC2 instance'ınızı başlatmanızı sağlar, böylece AMI ID'sini manuel olarak güncelleme ihtiyacını ortadan kaldırır. ## Best Practices & Anti-Patterns Terraform ile çalışırken verimliliği, güvenliği ve sürdürülebilirliği artırmak için belirli en iyi uygulamaları takip etmek kritik öneme sahiptir. Aynı şekilde, kaçınılması gereken bazı anti-pattern'ler de vardır. 2026 itibarıyla edindiğimiz tecrübelerle, işte size bir dizi DOĞRU ve YANLIŞ yaklaşım: ### ✅ DOĞRU Yaklaşımlar 1. **Modülleri Kullanın:** Altyapı bileşenlerini (VPC, EC2, RDS) modüller halinde paketleyerek kod tekrarını önleyin ve yeniden kullanılabilirliği artırın. Bu, büyük projelerde karmaşıklığı yönetmenin anahtarıdır. 2. **Remote State Kullanın:** `terraform.tfstate` dosyasını S3, Azure Blob Storage gibi güvenli ve sürüm kontrollü bir uzak depoda tutun. Bu, ekip işbirliği, state kilitleme ve felaket kurtarma için esastır. 3. **State Kilitlemeyi Etkinleştirin:** Remote state backend'iniz için state kilitlemeyi (örneğin DynamoDB ile S3 için) etkinleştirin. Bu, birden fazla kullanıcının aynı anda state dosyasını değiştirmesini engeller ve veri bozulmasını önler. 4. **Hassas Verileri Yönetin:** API anahtarları, veritabanı şifreleri gibi hassas verileri doğrudan `.tf` dosyalarına yazmayın. AWS Secrets Manager, Azure Key Vault, HashiCorp Vault gibi araçları kullanın. Bu, güvenlik açıklarını önler. 5. **`terraform plan` Her Zaman Kullanın:** `terraform apply` komutunu çalıştırmadan önce her zaman `terraform plan` ile değişiklikleri önizleyin. Bu, beklenmedik altyapı değişikliklerinin önüne geçer. 6. **Sürüm Kontrolü:** Tüm Terraform yapılandırma dosyalarınızı ( `.tf` ve `.tfvars`) Git gibi bir sürüm kontrol sisteminde saklayın. Bu, değişiklik geçmişini izlemenizi ve gerektiğinde geri dönmenizi sağlar. 7. **Küçük ve Odaklı State Dosyaları:** Çok büyük monolitik state dosyalarından kaçının. Altyapınızı mantıksal birimlere (örneğin, ağ, veritabanı, uygulamalar) ayırarak her birinin kendi state dosyasına sahip olmasını sağlayın. Bu, dağıtım hızını artırır ve hata kapsamını küçültür. 8. **Değişkenleri ve Çıktıları Doğru Kullanın:** Değişkenleri, yapılandırmayı özelleştirmek için kullanın; çıktıları ise dağıtılan kaynaklardan bilgi almak için kullanın. Açık ve açıklayıcı değişken ve çıktı isimleri kullanın. 9. **Terraform Format ve Validate:** Kodunuzu `terraform fmt` ile otomatik olarak biçimlendirin ve `terraform validate` ile sözdizimi hatalarını kontrol edin. Bu, kod kalitesini ve tutarlılığını sağlar. ### ❌ YANLIŞ Yaklaşımlar (Anti-Patterns) 1. **Yerel State Dosyası Kullanımı:** `terraform.tfstate` dosyasını sadece yerel makinenizde tutmak, ekip işbirliğini imkansız hale getirir ve state dosyasının kaybolması durumunda felaketle sonuçlanabilir. 2. **Hassas Bilgileri Kodda Saklama:** Şifreleri, API anahtarlarını veya diğer hassas bilgileri doğrudan `.tf` dosyalarına veya `.tfvars` dosyalarına yazmak büyük bir güvenlik açığıdır. 3. **`terraform apply --auto-approve` Dikkatsizce Kullanımı:** `terraform apply` komutunu `--auto-approve` bayrağıyla kullanmak, değişiklikleri gözden geçirmeden uygulamanıza neden olur. Production ortamında bu, ciddi kesintilere yol açabilir. 4. **Monolitik State Dosyaları:** Tüm altyapıyı tek bir `terraform.tfstate` dosyasında yönetmek, özellikle büyük projelerde `terraform plan` ve `apply` sürelerini uzatır, hata kapsamını genişletir ve ekip işbirliğini zorlaştırır. 5. **Manuel Değişiklikler:** Terraform tarafından yönetilen kaynaklarda manuel değişiklikler yapmak, state dosyası ile gerçek altyapı arasında uyumsuzluklara neden olur (`drift`). Bu durum, bir sonraki `terraform apply` işleminde beklenmedik davranışlara yol açabilir. 6. **Modül Sürümlerini Sabitlememek:** Kullanılan modüllerin sürümlerini (örn. `source = "hashicorp/aws//s3?version=~> 3.0"`) sabitlememek, beklenmedik değişikliklere veya bağımlılık sorunlarına yol açabilir. 2026'da modül versiyonlaması, kararlı dağıtımlar için standart bir uygulamadır. Bu best practice'leri ve anti-pattern'leri anlamak ve uygulamak, Terraform projelerinizin başarılı, güvenli ve sürdürülebilir olmasını sağlayacaktır. Tecrübelerime göre, bu kurallara uymak, uzun vadede size hem zaman hem de baş ağrısı kazandırır. ## Yaygın Hatalar ve Çözümleri Terraform ile çalışırken, özellikle başlangıçta, bazı yaygın hatalarla karşılaşmak kaçınılmazdır. Bu bölümde, sıkça karşılaşılan problemleri, bunların nedenlerini ve 2026'da geçerli olan çözümlerini ele alacağız. ### Hata 1: `Error: Provider configuration not present` **Problem:** `terraform plan` veya `terraform apply` çalıştırırken sağlayıcı yapılandırmasının eksik olduğuna dair bir hata alıyorsunuz. **Sebep:** Terraform, sağlayıcı eklentilerini indirmek ve yapılandırmak için `terraform init` komutuna ihtiyaç duyar. Bu komut çalıştırılmamış veya eksik bir yapılandırma ile çalıştırılmış olabilir. **Çözüm:** Çalışma dizininizde `terraform init` komutunu tekrar çalıştırın. Eğer sağlayıcı yapılandırmanızda (örneğin `provider "aws" {}`) bir değişiklik yaptıysanız, tekrar `init` çalıştırmanız gerekir. ```bash terraform init ``` ### Hata 2: `Error: Resource 'aws_s3_bucket.example_bucket' does not have attribute 'id'` **Problem:** Yeni oluşturulmuş bir kaynağın bir özelliğine (attribute) erişmeye çalışırken bu hatayı alıyorsunuz. **Sebep:** Bu genellikle iki durumda ortaya çıkar: Kaynak henüz oluşturulmamıştır veya yanlış bir özellik adı kullanıyorsunuzdur. Bazen de, kaynak oluşturulurken bir hata meydana gelmiş ve state dosyasına doğru şekilde kaydedilmemiştir. **Çözüm:** Öncelikle `terraform plan` komutunu çalıştırarak kaynağın oluşturulup oluşturulmayacağını kontrol edin. Eğer kaynak oluşturuluyorsa, `terraform apply` ile kaynak oluşturulduktan sonra özelliğe erişebilirsiniz. Ayrıca, Terraform dökümantasyonundan kaynağın doğru özellik adını kontrol ettiğinizden emin olun. ### Hata 3: `Error acquiring state lock` **Problem:** `terraform apply` veya `terraform destroy` çalıştırırken state kilidi alınamadığına dair bir hata alıyorsunuz. **Sebep:** Bu hata, birden fazla kullanıcının aynı anda aynı Terraform state dosyasını değiştirmeye çalıştığı veya önceki bir `apply` işleminin başarısız olup kilidin serbest bırakılmadığı durumlarda ortaya çıkar. Genellikle remote state kullanırken ve state kilitleme mekanizması (örn. DynamoDB) aktifken görülür. **Çözüm:** Öncelikle, başka bir kullanıcının şu anda aynı state üzerinde çalışıp çalışmadığını doğrulayın. Eğer kimse çalışmıyorsa ve kilit eski bir işlemden kalma ise, `terraform force-unlock ` komutunu kullanarak kilidi manuel olarak serbest bırakabilirsiniz. `LOCK_ID`'yi hata mesajında bulabilirsiniz. Ancak, bu komutu çok dikkatli kullanmalısınız, aksi takdirde state dosyanız bozulabilir. ```bash terraform force-unlock ``` ### Hata 4: `Error: Invalid or unknown key` **Problem:** Bir kaynağın veya modülün yapıla