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 Research and Development Team
ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.
İlgili Makaleler
Borç Hesapları Otomasyonu: İşleme Maliyetlerini Yüzde 80 Oranında Azaltın
OCR, üç yönlü eşleştirme ve ERP iş akışlarıyla fatura işleme maliyetlerini fatura başına 15 ABD dolarından 3 ABD dolarına düşürmek için borç hesapları otomasyonunu uygulayın.
Muhasebe ve Defter Tutma Otomasyonunda Yapay Zeka: CFO Uygulama Kılavuzu
Fatura işleme, banka mutabakatı, gider yönetimi ve finansal raporlama için muhasebeyi yapay zeka ile otomatikleştirin. %85 daha hızlı kapatma döngüleri.
İş Süreci Otomasyonu için Yapay Zeka Aracıları: Sohbet Robotlarından Otonom İş Akışlarına
Yapay zeka aracıları, çok adımlı akıl yürütme ve sistem entegrasyonuyla satış, operasyon, finans ve müşteri hizmetleri genelindeki karmaşık iş süreçlerini nasıl otomatikleştiriyor?