Terraform Best Practices: 15 Adımda API Geliştirme [2026 Rehberi]
Yazar: Burak Balkı | Kategori: API Development | Okuma Süresi: 65 dk
Bu rehber, 2026'da Terraform'u kullanarak API altyapınızı en iyi uygulamalarla nasıl yöneteceğinizi, kurulumdan ileri seviye tekniklere, best practice'lerden...
# Terraform Best Practices: 15 Adımda API Geliştirme [2026 Rehberi]
Bulut altyapısı yönetimi, 2026'da bile hala birçok ekip için karmaşık bir meydan okuma olmaya devam ediyor. Özellikle API geliştirme süreçlerinde altyapının tutarlı, güvenli ve ölçeklenebilir olması, projenin başarısı için kritik önem taşıyor. Manuel konfigürasyonlar zaman alıcı hatalara yol açarken, doğru araçlarla otomasyon bu yükü ortadan kaldırabilir. Bu kapsamlı rehberde, 2026 itibarıyla Terraform'u kullanarak API altyapınızı en iyi uygulamalarla nasıl yöneteceğinizi, verimliliği artıracağınızı ve olası sorunları nasıl önleyeceğinizi adım adım öğreneceksiniz. Kapsamlı örnekler ve pratik ipuçları ile Terraform'un gücünü keşfedin.
## Terraform Nedir?
Terraform, HashiCorp tarafından geliştirilen açık kaynaklı bir Altyapı Olarak Kod (Infrastructure as Code - IaC) aracıdır. Geliştiricilerin ve DevOps mühendislerinin bulut ve on-prem kaynakları (sanal makineler, ağlar, veritabanları, API ağ geçitleri vb.) deklaratif bir konfigürasyon dili (HashiCorp Configuration Language - HCL) kullanarak tanımlamasına ve sağlamasına olanak tanır. 2026'da, Terraform, altyapının hızlı, güvenilir ve tekrarlanabilir bir şekilde dağıtılmasını sağlayarak, manuel süreçlerin getirdiği hataları ve tutarsızlıkları ortadan kaldırır. Bu araç, altyapıyı kod olarak yönetme felsefesini benimseyen tüm ekipler için vazgeçilmez bir çözüm haline gelmiştir.
Terraform'un temel çalışma prensibi, altyapının istenen durumunu (desired state) tanımlamanız ve Terraform'un mevcut durumu (current state) bu istenen duruma getirmek için gerekli değişiklikleri otomatik olarak yapmasıdır. Bu, `terraform plan` komutuyla değişiklikleri önizleme, `terraform apply` ile uygulama ve `terraform destroy` ile kaynakları güvenli bir şekilde kaldırma yeteneği sunar. Bu deklaratif yaklaşım, altyapı yönetimini çok daha öngörülebilir ve kontrol edilebilir kılar. Özellikle çoklu bulut ortamlarında, Terraform'un farklı sağlayıcılar (AWS, Azure, GCP, Kubernetes vb.) için tek bir araçla altyapı yönetimi sunması, onu 2026'nın en popüler IaC araçlarından biri yapmaktadır.
## Neden Terraform Kullanmalısınız?
2026 yılında, modern API geliştirme ve dağıtım süreçlerinde Terraform kullanmak, ekiplerin verimliliğini ve altyapının güvenilirliğini önemli ölçüde artırır. Manuel altyapı yönetimi, özellikle karmaşık API mimarilerinde, tutarsızlıklara, güvenlik açıklarına ve operasyonel darboğazlara yol açabilir. Terraform, bu sorunlara güçlü ve ölçeklenebilir çözümler sunar.
**Somut Faydalar ve Çözdüğü Problemler:**
* **Tutarlılık ve Tekrarlanabilirlik:** Terraform, altyapınızı kod olarak tanımladığınız için, her dağıtımın aynı sonucu vermesini sağlar. Bu, geliştirme, test ve üretim ortamları arasında tutarlılığı garanti eder, "benim makinemde çalışıyor" sorununu ortadan kaldırır.
* **Hız ve Otomasyon:** Altyapı değişikliklerini saniyeler içinde uygulayabilir, manuel müdahaleyi minimuma indirerek dağıtım süreçlerini hızlandırır. Bu, özellikle sürekli entegrasyon/sürekli dağıtım (CI/CD) pipeline'ları için kritik bir avantajdır.
* **Maliyet Tasarrufu:** Kullanılmayan veya yanlış yapılandırılmış kaynakları kolayca tespit edip kaldırarak bulut maliyetlerini optimize etmeye yardımcı olur. Ayrıca, altyapı mühendislerinin manuel iş yükünü azaltarak daha stratejik görevlere odaklanmasını sağlar.
* **Felaket Kurtarma:** Altyapınızın kod olarak depolanması, bir felaket durumunda tüm altyapıyı sıfırdan hızla yeniden oluşturabilmenizi sağlar. Bu, iş sürekliliği için hayati öneme sahiptir.
* **Sürüm Kontrolü ve İşbirliği:** Terraform konfigürasyonları Git gibi sürüm kontrol sistemlerinde saklanabilir. Bu, değişikliklerin izlenmesini, geri alınmasını ve ekip üyeleri arasında işbirliğini kolaylaştırır.
* **Çoklu Bulut Desteği:** AWS, Azure, GCP gibi farklı bulut sağlayıcıları ve VMware, OpenStack gibi on-prem ortamlar için tek bir araç ve dil kullanma yeteneği sunar. Bu, hibrit ve çoklu bulut stratejileri benimseyen kuruluşlar için benzersiz bir değerdir.
**Kimler İçin Uygun, Kimler İçin Değil?**
Terraform, altyapı yönetimi süreçlerini otomatize etmek ve ölçeklendirmek isteyen her büyüklükteki ekip için uygundur. Özellikle DevOps mühendisleri, bulut mimarları ve API geliştiricileri için vazgeçilmez bir araçtır. Sürekli değişen ve büyüyen API altyapıları olan şirketler, Terraform'dan en büyük faydayı sağlarlar. Ancak, çok küçük, statik ve tek bir sunucuya dayalı projeler için öğrenme eğrisi başlangıçta gereksiz görünebilir. Yine de, uzun vadede otomasyonun getirdiği faydalar genellikle bu başlangıç maliyetini aşar.
Terraform, 2026 itibarıyla geniş ve aktif bir topluluğa sahiptir. HashiCorp'un düzenli güncellemeleri, zengin dökümantasyonu ve üçüncü taraf sağlayıcılar için sürekli genişleyen ekosistemi, aracın uzun ömürlü ve güvenilir olduğunu kanıtlamaktadır.
## Terraform vs Alternatifler
Altyapı Olarak Kod (IaC) dünyasında Terraform tek seçenek değildir. Birçok alternatif araç farklı ihtiyaçlara ve kullanım senaryolarına hitap eder. API altyapınızı yönetirken doğru aracı seçmek, projenizin başarısı için kritik öneme sahiptir. 2026 itibarıyla en popüler alternatiflerden bazıları Ansible ve AWS CloudFormation'dır. Aşağıdaki tablo, Terraform'u bu iki popüler alternatifle karşılaştırmaktadır.
| Özellik | Terraform | Ansible | AWS CloudFormation |
| :------------------ | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ |
| **Tipi** | Deklaratif (IaC) | Prosedürel (Konfigürasyon Yönetimi) | Deklaratif (IaC) |
| **Odak Noktası** | Altyapı sağlama ve yönetimi | Konfigürasyon yönetimi, uygulama dağıtımı | AWS kaynak sağlama ve yönetimi |
| **Sağlayıcı Desteği**| Çoklu bulut (AWS, Azure, GCP, VMware vb.) | Çoklu bulut, on-prem (geniş yelpaze) | Yalnızca AWS |
| **Dil** | HCL (HashiCorp Configuration Language) | YAML | YAML/JSON |
| **State Yönetimi** | Var (`.tfstate` dosyası) | Yok (idempotency prensibiyle çalışır) | Var (AWS içinde yönetilir) |
| **Öğrenme Eğrisi** | Orta (HCL ve IaC prensipleri) | Düşük (YAML ve SSH bilgisi) | Orta (AWS kaynak bilgisi ve YAML/JSON) |
| **Ekosistem** | Geniş ve aktif, modül odaklı | Çok geniş, playbook ve modül odaklı | AWS servisleriyle entegre, zengin şablonlar |
| **Topluluk** | Çok aktif, sürekli gelişen | Çok aktif, büyük kullanıcı tabanı | Aktif, AWS odaklı |
| **Kurumsal Destek** | HashiCorp Terraform Enterprise | Red Hat Ansible Automation Platform | AWS Support |
| **Kullanım Alanı** | Bulut/on-prem altyapı sağlama, orkestrasyon | Sunucu konfigürasyonu, uygulama dağıtımı | AWS ekosisteminde altyapı otomasyonu |
**Yorum:**
Terraform, çoklu bulut stratejileri benimseyen ve altyapısını deklaratif bir yaklaşımla yönetmek isteyen ekipler için idealdir. Ansible, konfigürasyon yönetimi ve uygulama dağıtımı için harika bir araç olsa da, altyapı sağlama konusunda Terraform kadar güçlü değildir. AWS CloudFormation ise AWS ekosistemine sıkı sıkıya bağlı projeler için mükemmel bir seçenektir, ancak çoklu bulut esnekliği sunmaz. 2026'da birçok kuruluş, altyapı sağlama için Terraform'u, konfigürasyon yönetimi için Ansible'ı bir arada kullanmaktadır.
## Kurulum ve İlk Adımlar
Terraform ile API altyapınızı yönetmeye başlamak için öncelikle Terraform CLI'ı kurmanız ve temel bir konfigürasyon oluşturmanız gerekmektedir. 2026 itibarıyla kurulum süreci oldukça basittir ve birçok işletim sistemi için destek sunulmaktadır.
**Ön Gereksinimler:**
* **İşletim Sistemi:** Windows, macOS, Linux (64-bit).
* **Bulut Sağlayıcı Hesabı:** AWS, Azure, GCP gibi bir bulut sağlayıcısında aktif bir hesaba ve gerekli kimlik bilgilerine (API anahtarları, rol izinleri) sahip olmalısınız. Bu rehberde genellikle AWS örnekleri kullanılacaktır.
* **Metin Düzenleyici:** VS Code, Sublime Text veya tercih ettiğiniz herhangi bir metin düzenleyici.
**Terraform CLI Kurulumu (macOS ve Linux için):**
HashiCorp'un resmi dökümantasyonundan veya Homebrew (macOS) ya da paket yöneticileri (Linux) aracılığıyla kurulum yapabilirsiniz. Aşağıdaki adımlar genel bir yaklaşımdır:
1. **Terraform'u İndirin:** HashiCorp'un resmi web sitesinden (releases.hashicorp.com/terraform/) işletim sisteminize uygun paketi indirin. 2026'da en güncel kararlı sürüm genellikle X.Y.Z formatında olacaktır.
2. **Paketi Açın:** İndirdiğiniz zip dosyasını açın.
```bash
unzip terraform_X.Y.Z_darwin_amd64.zip
```
3. **PATH'e Ekleyin:** `terraform` yürütülebilir dosyasını sisteminizin PATH'ine ekleyin. Bu, terminalinizden `terraform` komutunu çalıştırmanıza olanak tanır. Genellikle `/usr/local/bin` veya `/usr/bin` gibi bir dizine taşıyabilirsiniz.
```bash
sudo mv terraform /usr/local/bin/
```
4. **Kurulumu Doğrulayın:** Terminalinizde aşağıdaki komutu çalıştırarak Terraform'un doğru kurulup kurulmadığını ve sürümünü kontrol edin.
```bash
terraform -v
```
Çıktı şöyle bir şey olmalıdır:
```bash
Terraform v1.8.0 # (2026 itibarıyla güncel bir sürüm)
on darwin_amd64
```
**İlk Terraform Konfigürasyonu:**
Şimdi basit bir AWS S3 bucket oluşturarak Terraform'un nasıl çalıştığını görelim. Yeni bir dizin oluşturun ve içine `main.tf` adında bir dosya yaratın.
1. **Dizin Oluşturma:**
```bash
mkdir my-api-infra
cd my-api-infra
```
2. **`main.tf` Dosyası Oluşturma:**
```hcl
# main.tf
# AWS provider'ını tanımlıyoruz
# 2026 itibarıyla en güncel provider sürümünü kullanın
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = "~> 1.8"
}
provider "aws" {
region = "us-east-1"
# AWS kimlik bilgileri genellikle ortam değişkenlerinden veya AWS CLI konfigürasyonundan alınır.
# Bu örnekte açıkça belirtmiyoruz, ancak üretimde asla buraya yazılmamalıdır.
}
# Bir S3 bucket kaynağı tanımlıyoruz
resource "aws_s3_bucket" "api_data_storage" {
bucket = "my-unique-api-data-bucket-2026-burak-balki"
tags = {
Name = "API Data Storage"
Environment = "Development"
Project = "API-Service"
}
}
# S3 bucket'ının adını çıktı olarak veriyoruz
output "s3_bucket_name" {
description = "Oluşturulan S3 bucket'ının adı"
value = aws_s3_bucket.api_data_storage.id
}
```
3. **Terraform'u Başlatma:** Proje dizininizde aşağıdaki komutu çalıştırın. Bu, AWS provider eklentisini indirir ve çalışma dizinini başlatır.
```bash
terraform init
```
Çıktı:
```
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Installing hashicorp/aws v5.24.0...
- Installed hashicorp/aws v5.24.0 (signed by HashiCorp)
Terraform has been successfully initialized!
...
```
4. **Değişiklikleri Planlama:** Terraform'un yapacağı değişiklikleri önizlemek için `plan` komutunu kullanın. Bu, herhangi bir kaynak oluşturmadan veya değiştirmeden önce ne olacağını gösterir.
```bash
terraform plan
```
Çıktı, bir S3 bucket'ının oluşturulacağını gösterecektir (`+` işaretiyle belirtilir).
5. **Değişiklikleri Uygulama:** Planlanan değişiklikleri uygulamak ve S3 bucket'ını AWS'de oluşturmak için `apply` komutunu kullanın. Onaylamanız istendiğinde `yes` yazın.
```bash
terraform apply
```
Çıktı, kaynakların başarıyla oluşturulduğunu ve `s3_bucket_name` çıktısını gösterecektir.
```
... (output details) ...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
s3_bucket_name = "my-unique-api-data-bucket-2026-burak-balki"
```
6. **Kaynakları Yok Etme (İsteğe Bağlı):** Oluşturduğunuz kaynakları temizlemek için `destroy` komutunu kullanabilirsiniz. Bu, özellikle test ortamları için faydalıdır.
```bash
terraform destroy
```
Yine `yes` yazarak onaylamanız gerekecektir.
Bu adımlar, Terraform'un temel kurulumunu ve basit bir kaynak oluşturma sürecini özetlemektedir. API altyapınız için daha karmaşık yapıları bu temel prensipler üzerine inşa edebilirsiniz.
## Temel Kullanım ve Örnekler
Terraform'un gücü, çeşitli bulut kaynaklarını deklaratif bir şekilde yönetebilmesinden gelir. API geliştirme bağlamında, bu, API Gateway'ler, Lambda fonksiyonları, veritabanları, ağ yapılandırmaları ve depolama gibi bileşenleri otomatize etmek anlamına gelir. İşte 2026'da karşılaşabileceğiniz bazı gerçek dünya senaryolarına yönelik pratik Terraform örnekleri.
### Örnek 1: Basit Bir AWS S3 Bucket Oluşturma (API için Depolama)
**Problem:** API'nizin kullanıcı tarafından yüklenen dosyaları veya statik içerikleri depolaması gerekiyor. Bu depolama alanının hızlı, güvenli ve ölçeklenebilir olması önemli.
**Çözüm:** AWS S3 (Simple Storage Service) bu tür ihtiyaçlar için idealdir. Terraform ile bir S3 bucket'ı oluşturmak ve temel konfigürasyonunu yapmak oldukça kolaydır.
```hcl
# s3_storage.tf
resource "aws_s3_bucket" "api_assets" {
bucket = "my-api-assets-bucket-2026-burak-balki"
tags = {
Name = "API Assets"
Environment = "Production"
Project = "API-Service"
}
}
resource "aws_s3_bucket_acl" "api_assets_acl" {
bucket = aws_s3_bucket.api_assets.id
acl = "private"
}
resource "aws_s3_bucket_versioning" "api_assets_versioning" {
bucket = aws_s3_bucket.api_assets.id
versioning_configuration {
status = "Enabled"
}
}
output "api_assets_bucket_name" {
description = "API statik varlıkları için S3 bucket adı"
value = aws_s3_bucket.api_assets.id
}
```
Bu kod bloğu, bir S3 bucket'ı oluşturur, erişim kontrol listesini (ACL) `private` olarak ayarlar ve sürümlemeyi etkinleştirir. Sürümleme, yanlışlıkla silmeleri veya değişiklikleri geri almanızı sağlar, bu da API verileri için kritik bir özelliktir.
### Örnek 2: AWS EC2 Instance Oluşturma (API Host Etme)
**Problem:** Geleneksel bir sunucu üzerinde çalışan bir REST API'niz var ve bu API'yi bulutta barındırmak istiyorsunuz.
**Çözüm:** AWS EC2 (Elastic Compute Cloud) ile sanal bir sunucu (instance) oluşturabilir ve API'nizi buraya deploy edebilirsiniz. Terraform ile bu süreci otomatize edebiliriz.
```hcl
# ec2_api_host.tf
variable "ami_id" {
description = "Kullanılacak AMI ID'si (Örn: Ubuntu 22.04 LTS)"
type = string
default = "ami-0abcdef1234567890" # 2026 için güncel bir Ubuntu AMI ID'si ile değiştirin
}
variable "instance_type" {
description = "EC2 instance tipi"
type = string
default = "t3.micro"
}
resource "aws_instance" "api_server" {
ami = var.ami_id
instance_type = var.instance_type
key_name = "my-api-ssh-key-2026"
vpc_security_group_ids = [aws_security_group.api_sg.id]
tags = {
Name = "API-Server-2026"
Environment = "Development"
Project = "API-Service"
}
user_data = <<-EOF
#!/bin/bash
# API uygulamanızı buraya kurun ve başlatın
sudo apt update -y
sudo apt install -y nginx
sudo systemctl start nginx
EOF
}
resource "aws_security_group" "api_sg" {
name = "api-security-group-2026"
description = "Allow HTTP/HTTPS inbound traffic"
vpc_id = aws_vpc.api_vpc.id # Varsayılan VPC veya özel bir VPC kullanın
ingress {
description = "HTTP from anywhere"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "HTTPS from anywhere"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "API-Security-Group"
}
}
# Varsayılan VPC'yi kullanmak yerine özel bir VPC oluşturalım
resource "aws_vpc" "api_vpc" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "API-VPC-2026"
}
}
output "api_server_public_ip" {
description = "API sunucusunun Public IP adresi"
value = aws_instance.api_server.public_ip
}
```
Bu örnek, bir EC2 instance'ı, ona atanacak bir güvenlik grubunu ve basit bir VPC'yi tanımlar. `user_data` bloğu, instance başlatıldığında çalışacak komutları içerir; burada Nginx kurulup başlatılıyor. Üretim ortamında bu `user_data` genellikle bir konfigürasyon yönetimi aracı (Ansible, Chef) veya bir container orchestrator (Kubernetes) tarafından yönetilir.
### Örnek 3: AWS VPC ve Subnet Oluşturma (API Ağ İzolasyonu)
**Problem:** API'nizin diğer altyapı bileşenlerinden izole edilmiş, güvenli ve özel bir ağda çalışması gerekiyor.
**Çözüm:** AWS VPC (Virtual Private Cloud) ve subnet'ler ile bu ağ izolasyonunu sağlayabilirsiniz. Terraform ile özel bir VPC, public ve private subnet'ler oluşturabiliriz.
```hcl
# vpc_network.tf
resource "aws_vpc" "api_vpc_custom" {
cidr_block = "10.10.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "API-Custom-VPC-2026"
Environment = "Production"
}
}
resource "aws_subnet" "api_public_subnet" {
vpc_id = aws_vpc.api_vpc_custom.id
cidr_block = "10.10.1.0/24"
availability_zone = "us-east-1a"
map_public_ip_on_launch = true # Public subnet'te instance'lara public IP atanır
tags = {
Name = "API-Public-Subnet-2026"
}
}
resource "aws_subnet" "api_private_subnet" {
vpc_id = aws_vpc.api_vpc_custom.id
cidr_block = "10.10.2.0/24"
availability_zone = "us-east-1b"
tags = {
Name = "API-Private-Subnet-2026"
}
}
resource "aws_internet_gateway" "api_igw" {
vpc_id = aws_vpc.api_vpc_custom.id
tags = {
Name = "API-Internet-Gateway-2026"
}
}
resource "aws_route_table" "api_public_rt" {
vpc_id = aws_vpc.api_vpc_custom.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.api_igw.id
}
tags = {
Name = "API-Public-Route-Table-2026"
}
}
resource "aws_route_table_association" "api_public_rt_assoc" {
subnet_id = aws_subnet.api_public_subnet.id
route_table_id = aws_route_table.api_public_rt.id
}
output "api_vpc_id" {
description = "Özel API VPC ID'si"
value = aws_vpc.api_vpc_custom.id
}
output "api_public_subnet_id" {
description = "API Public Subnet ID'si"
value = aws_subnet.api_public_subnet.id
}
```
Bu kod bloğu, API'niz için özel bir VPC, bir public subnet (internet erişimi için) ve bir private subnet (veritabanları veya dahili servisler için) oluşturur. Ayrıca, public subnet'ten internete erişimi sağlamak için bir Internet Gateway ve rota tablosu yapılandırır.
### Örnek 4: Output Değişkenleri ile Kaynak Bilgilerini Çekme
**Problem:** Terraform ile oluşturduğunuz bir kaynağın (örneğin, bir S3 bucket'ının adı veya bir EC2 instance'ının IP adresi) bilgilerine başka bir Terraform konfigürasyonundan veya dışarıdan erişmeniz gerekiyor.
**Çözüm:** Terraform `output` blokları, bu bilgileri kolayca dışa aktarmanızı sağlar. Bu, modüller arası iletişim veya CI/CD pipeline'larında değerleri kullanmak için hayati öneme sahiptir.
```hcl
# outputs.tf (önceki örneklerden devam)
output "api_server_private_ip" {
description = "API sunucusunun özel IP adresi"
value = aws_instance.api_server.private_ip
}
output "s3_bucket_arn" {
description = "API Assets S3 bucket'ının ARN'si"
value = aws_s3_bucket.api_assets.arn
}
output "api_security_group_id" {
description = "API Güvenlik Grubunun ID'si"
value = aws_security_group.api_sg.id
}
```
`terraform output` komutu ile bu değerlere erişebilirsiniz. Örneğin, `terraform output api_server_public_ip` komutu, API sunucusunun genel IP adresini gösterecektir.
### Örnek 5: Modüllerin Temel Kullanımı
**Problem:** Benzer kaynak gruplarını (örneğin, bir EC2 instance, güvenlik grubu ve bir ELB) farklı ortamlarda veya projelerde tekrar tekrar oluşturmanız gerekiyor. Kodu kopyala-yapıştır yapmak yerine daha modüler bir yaklaşım istiyorsunuz.
**Çözüm:** Terraform modülleri, yeniden kullanılabilir ve parametrelendirilebilir altyapı bileşenleri oluşturmanızı sağlar. Bu, kod tekrarını azaltır ve yönetimi kolaylaştırır.
Önce bir modül oluşturalım. `modules/webserver` adında bir dizin yaratın ve içine `main.tf`, `variables.tf` ve `outputs.tf` dosyalarını ekleyin.
**`modules/webserver/main.tf`:**
```hcl
# modules/webserver/main.tf
resource "aws_instance" "web" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
vpc_security_group_ids = [aws_security_group.web_sg.id]
tags = {
Name = "${var.name_prefix}-web-server"
Environment = var.environment
}
}
resource "aws_security_group" "web_sg" {
name = "${var.name_prefix}-web-sg"
description = "Allow HTTP/HTTPS inbound traffic"
vpc_id = var.vpc_id
ingress {
description = "HTTP from anywhere"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "HTTPS from anywhere"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
```
**`modules/webserver/variables.tf`:**
```hcl
# modules/webserver/variables.tf
variable "ami_id" {
description = "Kullanılacak AMI ID'si"
type = string
}
variable "instance_type" {
description = "EC2 instance tipi"
type = string
}
variable "key_name" {
description = "SSH Key Pair adı"
type = string
}
variable "vpc_id" {
description = "Instance'ın yerleştirileceği VPC ID'si"
type = string
}
variable "name_prefix" {
description = "Kaynak adları için ön ek"
type = string
}
variable "environment" {
description = "Ortam etiketi"
type = string
}
```
**`modules/webserver/outputs.tf`:**
```hcl
# modules/webserver/outputs.tf
output "instance_id" {
description = "Oluşturulan EC2 instance'ının ID'si"
value = aws_instance.web.id
}
output "public_ip" {
description = "Oluşturulan EC2 instance'ının public IP adresi"
value = aws_instance.web.public_ip
}
```
Şimdi ana konfigürasyon dosyanızda bu modülü nasıl kullanacağınızı görelim:
**`main.tf` (Modülü kullanan):**
```hcl
# main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = "~> 1.8"
}
provider "aws" {
region = "us-east-1"
}
resource "aws_vpc" "main" {
cidr_block = "172.16.0.0/16"
tags = {
Name = "main-vpc-2026"
}
}
module "dev_api_server" {
source = "./modules/webserver"
ami_id = "ami-0abcdef1234567890" # 2026 için güncel bir AMI ID
instance_type = "t3.small"
key_name = "my-api-ssh-key-2026"
vpc_id = aws_vpc.main.id
name_prefix = "dev"
environment = "development"
}
module "prod_api_server" {
source = "./modules/webserver"
ami_id = "ami-0abcdef1234567890"
instance_type = "t3.medium"
key_name = "my-api-ssh-key-2026"
vpc_id = aws_vpc.main.id
name_prefix = "prod"
environment = "production"
}
output "dev_api_ip" {
value = module.dev_api_server.public_ip
}
output "prod_api_ip" {
value = module.prod_api_server.public_ip
}
```
Bu yapı, `dev_api_server` ve `prod_api_server` olmak üzere iki farklı EC2 instance'ı ve güvenlik grubunu tek bir modül tanımından oluşturmanızı sağlar. Bu, kodun yeniden kullanılabilirliğini ve okunabilirliğini büyük ölçüde artırır.
## İleri Seviye Teknikler
Terraform'un temel kullanımının ötesine geçerek, daha karmaşık ve üretim ortamına hazır API altyapıları oluşturmak için ileri seviye tekniklere ihtiyaç duyulur. 2026'da büyük ölçekli ve kritik API servisleri yöneten senior developer'lar ve DevOps ekipleri, aşağıdaki yaklaşımları sıklıkla kullanır.
### 1. Modül Geliştirme ve Sürümleme
Modüller, Terraform'un temel yeniden kullanılabilirlik birimidir. Kendi modüllerinizi geliştirmek ve bunları sürümlemek, altyapı kodunuzu DRY (Don't Repeat Yourself) prensibine uygun hale getirir. Modüllerinizi bir Git deposunda (GitHub, GitLab) veya Terraform Registry'de yayınlayabilirsiniz.
```hcl
# Ana konfigürasyonda uzak modül kullanımı
module "api_gateway" {
source = "git::https://github.com/my-org/terraform-aws-api-gateway.git?ref=v1.2.0" # Belirli bir sürüm
# ... modül değişkenleri
}
module "lambda_function" {
source = "app.terraform.io/my-org/lambda-function/aws" # Terraform Registry modülü
version = "~> 2.1"
# ... modül değişkenleri
}
```
> **Pro Tip:** Modüllerinizi semantik sürümleme (Semantic Versioning) kullanarak yönetin. Bu, modül tüketicilerinin uyumlu değişiklikleri kolayca takip etmesini sağlar ve kırılgan güncellemelerden kaçınır.
### 2. State Yönetimi: Uzak Backend ve Kilitleme
Terraform state dosyası (`terraform.tfstate`), yönettiği kaynakların gerçek dünya durumunun bir kaydını tutar. Bu dosya kritik öneme sahiptir ve üretim ortamlarında yerel olarak tutulmamalıdır. Uzak backend'ler, state dosyasını güvenli bir şekilde depolamanızı ve ekip üyeleri arasında işbirliği yapmanızı sağlar.
```hcl
# backend.tf
terraform {
backend "s3" {
bucket = "my-terraform-state-2026-burak-balki"
key = "api-service/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-state-lock-2026"
}
}
```
Bu konfigürasyon, state dosyasını şifreli olarak bir S3 bucket'ında saklar ve aynı anda birden fazla kişinin `terraform apply` çalıştırmasını önlemek için DynamoDB kullanarak state kilitleme mekanizması sağlar. Bu, state çakışmalarını ve veri bozulmasını engeller.
### 3. Workspace Kullanımı
Terraform workspace'leri, farklı ortamlar (geliştirme, test, üretim) için aynı Terraform konfigürasyonunu yeniden kullanmanızı sağlar. Her workspace'in kendi state dosyası vardır, bu da ortamları birbirinden izole eder.
```bash
# Yeni bir workspace oluşturma
terraform workspace new dev
# Workspace'ler arasında geçiş yapma
terraform workspace select prod
# Mevcut workspace'i gösterme
terraform workspace show
```
Konfigürasyonunuzda workspace'e göre farklı değerler atamak için `terraform.workspace` değişkenini kullanabilirsiniz:
```hcl
resource "aws_s3_bucket" "app_bucket" {
bucket = "my-app-bucket-${terraform.workspace}-2026"
tags = {
Environment = terraform.workspace
}
}
```
### 4. Dynamic Blocks
Dynamic blocks, Terraform konfigürasyonlarınızda tekrarlayan blokları dinamik olarak oluşturmanızı sağlar. Bu, özellikle güvenlik grupları veya ağ kuralları gibi listelerle çalışırken kodu daha okunabilir ve yönetilebilir hale getirir.
```hcl
resource "aws_security_group" "dynamic_sg" {
name = "dynamic-sg-2026"
description = "Dynamic security group rules"
vpc_id = aws_vpc.api_vpc_custom.id
dynamic "ingress" {
for_each = var.ingress_rules
content {
from_port = ingress.value.port
to_port = ingress.value.port
protocol = ingress.value.protocol
cidr_blocks = ingress.value.cidr_blocks
}
}
}
variable "ingress_rules" {
description = "Dinamik ingress kuralları listesi"
type = list(object({
port = number
protocol = string
cidr_blocks = list(string)
}))
default = [
{ port = 80, protocol = "tcp", cidr_blocks = ["0.0.0.0/0"] },
{ port = 443, protocol = "tcp", cidr_blocks = ["0.0.0.0/0"] }
]
}
```
Bu örnek, `ingress_rules` değişkenindeki listeye göre güvenlik grubu giriş kurallarını dinamik olarak oluşturur.
### 5. Terraform Cloud/Enterprise Entegrasyonu
Terraform Cloud (SaaS) ve Terraform Enterprise (on-prem), state yönetimini, ekip işbirliğini, politika olarak kodu (Policy as Code - Sentinel) ve CI/CD entegrasyonunu kolaylaştıran platformlardır. 2026'da kurumsal düzeyde Terraform kullanımı için bu platformlar vazgeçilmezdir.
* **CI/CD Entegrasyonu:** Git commit'leri tetiklendiğinde otomatik `terraform plan` ve `terraform apply` işlemleri.
* **Politika Uygulama:** Sentinel ile kaynakların belirli güvenlik veya maliyet politikalarına uygunluğunu zorunlu kılma.
* **Run Workspace'leri:** Uzaktan güvenli bir şekilde Terraform çalıştırma ortamları.
Bu ileri seviye teknikler, API altyapınızın karmaşıklığını yönetmenize, güvenliği artırmanıza ve DevOps süreçlerinizi daha da otomatize etmenize yardımcı olacaktır.
## Best Practices & Anti-Patterns
Terraform ile API altyapısı geliştirirken, 2026'da production ortamında karşılaşabileceğiniz sorunları minimize etmek ve sürdürülebilir bir yapı kurmak için belirli en iyi uygulamaları takip etmek hayati önem taşır. Aynı zamanda, kaçınılması gereken "anti-pattern"leri bilmek, baş ağrılarından sizi kurtaracaktır.
### ✅ DOĞRU Uygulamalar
1. **Modüler Yapı Kullanın:** Altyapınızı küçük, bağımsız ve yeniden kullanılabilir modüllere ayırın. Her modül tek bir sorumluluğa sahip olmalı (örneğin, bir EC2 modülü, bir S3 modülü). Bu, kod tekrarını azaltır, okunabilirliği artırır ve bakımı kolaylaştırır.
> **Neden Önemli?** Büyük, tekil Terraform dosyaları (monolithic configurations) hızla karmaşık hale gelir ve yönetimi zorlaşır. Modülerli