Terraform ile Kod Olarak Altyapı: Manuelden Otomatik Bulut Yönetimine
Kod Olarak Altyapı (IaC) kullanan kuruluşlar, ortamları %90 daha hızlı yönetir ve altyapıyı manuel olarak yönetenlere kıyasla %60 daha az yapılandırmayla ilgili kesinti yaşar. Terraform, her büyük bulut platformunu ve SaaS hizmetini destekleyen 3.000'den fazla sağlayıcıyla baskın IaC aracı olarak ortaya çıktı.
Bu kılavuz, ilk kaynak tanımınızdan üretim düzeyinde çoklu ortam dağıtımlarına kadar web uygulamaları, ERP sistemleri ve e-Ticaret platformları için pratik Terraform kullanımını kapsar.
Önemli Çıkarımlar
- Terraform, sürüm kontrolü aracılığıyla altyapı değişikliklerini incelenebilir, test edilebilir ve geri döndürülebilir hale getirir
- Uzaktan durum yönetimi, birden fazla mühendisin altyapıyı değiştirmesi durumunda çakışmaları önler
- Modüller, yeniden kullanılabilir modelleri kapsayarak yapılandırmayı yüzlerce satırdan birkaç parametreye indirir
- Terraform Bulutu veya CI/CD entegrasyonu, güvenli değişiklikler için uygulamadan önce planlama disiplinini zorunlu kılar
Neden KOBİ'ler için Terraform
Manuel Altyapı Sorunu
IaC olmadan altyapı bilginiz şu durumlarda yaşar:
- AWS Konsolu'nun kimsenin belgelemediği tıklama yolları
- Kimsenin hatırlamadığı SSH komutları aylar önce çalıştırıldı
- Doğrudan sunucularda düzenlenen yapılandırma dosyaları
- Bir mühendisin "ağın nasıl çalıştığına" ilişkin zihinsel modeli
Terraform ile altyapınız Git'te yaşar. Her değişiklik bir çekme isteğidir. Her dağıtım tekrarlanabilir. Her mühendis resmin tamamını anlayabilir.
Temel Kavramlar
| Konsept | Açıklama |
|---|---|
| Sağlayıcı | Bulut platformuyla (AWS, GCP, Azure, Cloudflare) arayüz oluşturan eklenti |
| Kaynak | Tek bir altyapı bileşeni (EC2 bulut sunucusu, RDS veritabanı, S3 paketi) |
| Veri kaynağı | Mevcut altyapıya salt okunur referans |
| Değişken | Yeniden kullanılabilir konfigürasyon için giriş parametresi |
| Çıkış | Terraform yapılandırmasından dışa aktarılan değer |
| Devlet | Terraform'un neleri yönettiğinin ve mevcut özelliklerinin kaydı |
| Modül | Tanımlanmış bir arayüze sahip yeniden kullanılabilir kaynak grubu |
İlk Terraform Yapılandırması
Web Uygulaması için AWS VPC ve EC2
# providers.tf
terraform {
required_version = ">= 1.7"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "ecosire-terraform-state"
key = "production/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
provider "aws" {
region = var.aws_region
}
# variables.tf
variable "aws_region" {
type = string
default = "us-east-1"
}
variable "environment" {
type = string
default = "production"
}
variable "instance_type" {
type = string
default = "t3.large"
}
# main.tf
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "${var.environment}-vpc"
Environment = var.environment
ManagedBy = "terraform"
}
}
resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index + 1}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = {
Name = "${var.environment}-public-${count.index + 1}"
}
}
resource "aws_instance" "app" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
subnet_id = aws_subnet.public[0].id
vpc_security_group_ids = [aws_security_group.app.id]
key_name = aws_key_pair.deploy.key_name
root_block_device {
volume_size = 50
volume_type = "gp3"
encrypted = true
}
tags = {
Name = "${var.environment}-app"
Environment = var.environment
}
}
resource "aws_db_instance" "postgres" {
identifier = "${var.environment}-db"
engine = "postgres"
engine_version = "17"
instance_class = "db.t3.medium"
allocated_storage = 50
max_allocated_storage = 200
storage_encrypted = true
db_name = "ecosire"
username = "app"
password = var.db_password
vpc_security_group_ids = [aws_security_group.db.id]
db_subnet_group_name = aws_db_subnet_group.main.name
backup_retention_period = 7
backup_window = "03:00-04:00"
maintenance_window = "sun:04:00-sun:05:00"
skip_final_snapshot = false
final_snapshot_identifier = "${var.environment}-db-final"
tags = {
Environment = var.environment
}
}
Yeniden Kullanılabilir Altyapı Modülleri
Web Uygulama Modülü Oluşturma
# modules/web-app/main.tf
variable "name" {
type = string
}
variable "environment" {
type = string
}
variable "instance_type" {
type = string
default = "t3.medium"
}
variable "vpc_id" {
type = string
}
variable "subnet_ids" {
type = list(string)
}
resource "aws_lb" "app" {
name = "${var.name}-${var.environment}-alb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb.id]
subnets = var.subnet_ids
}
resource "aws_lb_target_group" "app" {
name = "${var.name}-${var.environment}-tg"
port = 3000
protocol = "HTTP"
vpc_id = var.vpc_id
health_check {
path = "/health"
healthy_threshold = 2
unhealthy_threshold = 3
interval = 30
}
}
resource "aws_autoscaling_group" "app" {
name = "${var.name}-${var.environment}-asg"
min_size = 2
max_size = 10
desired_capacity = 2
vpc_zone_identifier = var.subnet_ids
target_group_arns = [aws_lb_target_group.app.arn]
launch_template {
id = aws_launch_template.app.id
version = "$Latest"
}
tag {
key = "Name"
value = "${var.name}-${var.environment}"
propagate_at_launch = true
}
}
output "alb_dns_name" {
value = aws_lb.app.dns_name
}
Modülün Kullanımı
# environments/production/main.tf
module "web" {
source = "../../modules/web-app"
name = "ecosire-web"
environment = "production"
instance_type = "t3.large"
vpc_id = module.network.vpc_id
subnet_ids = module.network.public_subnet_ids
}
module "api" {
source = "../../modules/web-app"
name = "ecosire-api"
environment = "production"
instance_type = "t3.large"
vpc_id = module.network.vpc_id
subnet_ids = module.network.public_subnet_ids
}
Devlet Yönetimi
S3 ile Uzak Durum
# Bootstrap: create the state bucket and DynamoDB table manually or with a separate config
resource "aws_s3_bucket" "terraform_state" {
bucket = "ecosire-terraform-state"
lifecycle {
prevent_destroy = true
}
}
resource "aws_s3_bucket_versioning" "terraform_state" {
bucket = aws_s3_bucket.terraform_state.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "terraform-locks"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
DynamoDB aracılığıyla durum kilitleme, iki mühendisin aynı anda terraform apply çalıştırmasını engeller; bu da durumun bozulmasına neden olabilir.
Durum Dosya Güvenliği
Terraform durum dosyası, veritabanı şifreleri, API anahtarları ve kaynak kimlikleri dahil olmak üzere hassas bilgiler içerir. Koruyun:
- Saklanma sırasında şifreleme: S3 paket sürümü oluşturma + sunucu tarafı şifreleme
- Aktarım sırasında şifrele: HTTPS yalnızca durum erişimi için
- Erişimi kısıtla: Kimin okuyabileceğini/yazabileceğini sınırlayan IAM politikaları
- Asla Git'e bağlanma: Durum dosyaları hiçbir zaman sürüm kontrolünde olmamalıdır
- Sürüm oluşturmayı etkinleştir: S3 sürümü oluşturma, bozuk durumdan kurtarmaya olanak tanır
CI/CD Entegrasyonu
GitHub Eylemleri Terraform İşlem Hattı
name: Terraform
on:
pull_request:
paths: ['infrastructure/**']
push:
branches: [main]
paths: ['infrastructure/**']
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- name: Terraform Init
run: terraform init
working-directory: infrastructure/environments/production
- name: Terraform Plan
run: terraform plan -out=tfplan
working-directory: infrastructure/environments/production
- name: Comment PR with plan
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const plan = require('fs').readFileSync('infrastructure/environments/production/tfplan.txt', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## Terraform Plan\n\`\`\`\n${plan}\n\`\`\``
});
apply:
needs: plan
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- name: Terraform Apply
run: terraform apply -auto-approve
working-directory: infrastructure/environments/production
Çoklu Ortam Stratejisi
| Çevre | Amaç | Örnek Boyutları | Maliyet Hedefi |
|---|---|---|---|
| Geliştirme | Özellik testi | t3.micro / t3.small | <100$/ay |
| Aşama | Üretim öncesi doğrulama | Ayna üretimi (daha küçük) | ~%30 üretim |
| Üretim | Canlı trafik | Yük için doğru boyutta | Optimize Edilmiş |
Terraform çalışma alanlarını veya ortam başına ayrı dizinleri kullanın:
infrastructure/
modules/
web-app/
database/
network/
environments/
development/
main.tf
terraform.tfvars
staging/
main.tf
terraform.tfvars
production/
main.tf
terraform.tfvars
Sıkça Sorulan Sorular
Terraform mu Pulumi mi --- hangisini seçmeliyiz?
Ekibinizde bildirime dayalı yapılandırmayı tercih eden operasyon mühendisleri varsa Terraform. Ekibiniz geliştirici ağırlıklıysa ve altyapıyı TypeScript veya Python'da yazmayı tercih ediyorsa Pulumi. Terraform daha büyük bir ekosisteme ve daha fazla topluluk modülüne sahiptir. Pulumi'nin başlangıç öğrenme eğrisi daha diktir ancak karmaşık mantık için daha esnektir.
Mevcut altyapıyı Terraform'a nasıl aktarırız?
Mevcut kaynakları Terraform yönetimi altına getirmek için terraform import kullanın. Örneğin: terraform import aws_instance.app i-1234567890abcdef0. İçe aktardıktan sonra eşleşen yapılandırmayı yazın. Terraform 1.5+, toplu içe aktarmalar için yapılandırma dosyalarındaki içe aktarma bloklarını destekler.
Terraform'da sırları nasıl ele alıyoruz?
Terraform dosyalarına asla sırları aktarmayın. terraform.tfvars (Git'ten hariç tutulur), ortam değişkenleri (TF_VAR_db_password) veya bir gizli dizi yöneticisi (AWS Secrets Manager, HashiCorp Vault) kullanın. Plan çıktısında görünmelerini önlemek için hassas değişkenleri sensitive = true ile işaretleyin.
Terraform'u yönetmenin maliyeti nedir?
Terraform'un kendisi ücretsiz ve açık kaynaktır. Terraform Cloud, uzak durum ve planlama/uygulama ile 5 kullanıcıya kadar ücretsiz bir katmana sahiptir. Ana maliyet, öğrenme eğrisi (deneyimli bir mühendis için 20-40 saat) ve devam eden bakımdır (ayda 2-4 saat). Bu, manuel altyapı yönetiminde tasarruf edilen zamanla dengelenir.
Sırada Ne Var?
Terraform, otomatik altyapının temelini oluşturur. Otomatik dağıtım için CI/CD işlem hatları, operasyonel görünürlük için izleme ve dayanıklılık için olağanüstü durum kurtarma ile birleştirin.
Altyapı otomasyonu danışmanlığı için ECOSIRE ile iletişime geçin veya yol haritasının tamamı için Küçük işletmeler için DevOps kılavuzumuzu inceleyin.
ECOSIRE tarafından yayınlandı - işletmelerin bulut altyapısını otomatikleştirmesine yardımcı oluyor.
Yazan
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
ECOSIRE ile İşinizi Büyütün
ERP, e-Ticaret, yapay zeka, analitik ve otomasyon genelinde kurumsal çözümler.
İlgili Makaleler
Muhasebe Otomasyonu: 2026'da Manuel Defter Tutmayı Ortadan Kaldırın
2026'da banka akışı otomasyonu, makbuz tarama, fatura eşleştirme, AP/AR otomasyonu ve ay sonu kapanış hızlandırma ile defter tutmayı otomatikleştirin.
İşletmeler için Yapay Zeka Aracıları: Kesin Kılavuz (2026)
İşletmelere yönelik yapay zeka aracılarına yönelik kapsamlı kılavuz: nasıl çalışırlar, kullanım örnekleri, uygulama yol haritası, maliyet analizi, yönetişim ve 2026 için gelecekteki eğilimler.
Yapay Zeka Aracıları ve RPA: İşletmeniz için Hangi Otomasyon Teknolojisi Uygun?
LLM destekli yapay zeka aracılarıyla geleneksel RPA botlarının kapsamlı karşılaştırması: yetenekler, maliyetler, kullanım örnekleri ve doğru yaklaşımı seçmeye yönelik karar matrisi.