Terraform ile Kod Olarak Altyapı: Manuelden Otomatik Bulut Yönetimine

Bulut altyapısını Terraform ile yönetin. HCL sözdizimini, modülleri, durum yönetimini, CI/CD entegrasyonunu ve çoklu ortam dağıtım stratejilerini kapsar.

E
ECOSIRE Research and Development Team
|16 Mart 20266 dk okuma1.4k Kelime|

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

KonseptAçıklama
SağlayıcıBulut platformuyla (AWS, GCP, Azure, Cloudflare) arayüz oluşturan eklenti
KaynakTek bir altyapı bileşeni (EC2 bulut sunucusu, RDS veritabanı, S3 paketi)
Veri kaynağıMevcut altyapıya salt okunur referans
DeğişkenYeniden kullanılabilir konfigürasyon için giriş parametresi
ÇıkışTerraform yapılandırmasından dışa aktarılan değer
DevletTerraform'un neleri yönettiğinin ve mevcut özelliklerinin kaydı
ModülTanı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

ÇevreAmaçÖrnek BoyutlarıMaliyet Hedefi
GeliştirmeÖzellik testit3.micro / t3.small<100$/ay
AşamaÜretim öncesi doğrulamaAyna üretimi (daha küçük)~%30 üretim
ÜretimCanlı trafikYük için doğru boyuttaOptimize 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.

E

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.

WhatsApp'ta Sohbet Et