Terraform Modülleriyle Dev, Test ve Prod Ortamlarını Tekrar Kullanılabilir Hale Getirmek

Bulut altyapısını elle yönetmek, ilk birkaç sunucuda masum görünür; fakat dev, test ve prod ortamları çoğaldıkça aynı güvenlik grubu, ağ ve veritabanı ayarlarını kopyalamak hızla bir bakım kabusuna dönüşür. Terraform modülleri bu sorunu, altyapı bileşenlerini parametre alan küçük ve tekrar kullanılabilir paketlere dönüştürerek çözer. Böylece ekipler aynı mimari standardı her ortamda korurken, yalnızca ortama özgü değerleri değiştirir.

``

Modül düşüncesinin teorik temeli

Terraform’da root module, komutları çalıştırdığınız ana dizindir. Bir klasör içindeki her Terraform yapılandırması teknik olarak modüldür; ancak yaygın kullanımda modül denince root module tarafından çağrılan, belirli bir sorumluluğa sahip alt klasörler anlaşılır. Örneğin bir network modülü VPC, subnet ve route table oluştururken; application modülü uygulama sunucularını oluşturabilir.

Bu yaklaşım yazılımdaki soyutlama ve DRY (Don’t Repeat Yourself) ilkelerinin altyapıdaki karşılığıdır. Ortam başına kopyalanan kaynak sayısı $n$, aynı yapının güncellenme maliyeti ise $c$ olsun. Kopyala-yapıştır modelinde değişiklik maliyeti kabaca $n \times c$ olur. Ortak modül kullanıldığında bu maliyet çoğu zaman $c + n \times v$ seviyesine iner; burada $v$, yalnızca ortam değişkenlerini yönetmenin düşük maliyetidir.

Yaklaşım Avantaj Risk
Ortam başına kopya .tf dosyaları Başlangıçta hızlı görünür Konfigürasyon sapması ve zor bakım
Tek, devasa yapılandırma Tüm kaynaklar görünür Ortam ayrımı ve yetkilendirme zorlaşır
Modül + ortam kök dizinleri Standart, tekrar kullanım ve net sınırlar Modül arayüzü tasarımı gerektirir

terraform-modulleriyle-dev-29

Önerilen klasör yapısı

Yaygın ve anlaşılır bir düzen, ortak modülleri modules altında; her ortamın çağırıcı yapılandırmasını ise environments altında tutmaktır:

terraform/
├── modules/
│   ├── network/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   └── application/
└── environments/
    ├── dev/
    ├── test/
    └── prod/

network modülü, değişkenlerle esnek fakat davranış olarak öngörülebilir olmalıdır. Aşağıdaki örnekte CIDR bloğu, ortam etiketi ve subnet sayısı dışarıdan alınır. Kodun görevi, ağ bileşenlerini aynı şablona göre üretmektir.

# modules/network/main.tf
resource "aws_vpc" "this" {
  cidr_block = var.vpc_cidr

  tags = {
    Name        = "${var.project}-${var.environment}-vpc"
    Environment = var.environment
  }
}

resource "aws_subnet" "private" {
  count             = var.subnet_count
  vpc_id            = aws_vpc.this.id
  cidr_block        = cidrsubnet(var.vpc_cidr, 8, count.index)
  availability_zone = data.aws_availability_zones.available.names[count.index]
}

cidrsubnet kullanımı, ana ağ bloğunu daha küçük bloklara ayırır. Örneğin /16 bir VPC için eklenen $8$ bit, teorik olarak $2^8 = 256$ adet /24 alt ağ üretme kapasitesi sağlar. Elbette gerçek tasarımda IP planı, kullanılabilir zone sayısı ve büyüme beklentisi birlikte değerlendirilmelidir.

Ortamlar yalnızca değer sağlamalı

Dev ortamı modülün nasıl çalıştığını yeniden tanımlamamalı; ona hangi değerlerle çalışacağını söylemelidir. Bu ayrım, prod’a geçerken mimariyi yanlışlıkla değiştirme olasılığını azaltır.

# environments/dev/main.tf
module "network" {
  source       = "../../modules/network"
  project      = "shop"
  environment  = "dev"
  vpc_cidr     = "10.10.0.0/16"
  subnet_count = 2
}
Özellik Dev Test Prod
Subnet sayısı 2 2 3
Kaynak boyutu Küçük Orta Yüksek
Silme koruması Genellikle kapalı Tercihe bağlı Açık
State erişimi Geliştirici ekibi QA/DevOps Sınırlı DevOps

Her ortam için ayrı bir remote state kullanmak kritik bir güvenlik ve eşzamanlılık önlemidir. Örneğin farklı S3 anahtarları veya Terraform Cloud workspace’leri seçilebilir. prod state dosyasını dev ile paylaşmak, yanlış apply komutunun üretim kaynaklarını değiştirmesine davetiye çıkarır.

Son olarak modülleri sürümlendirin: Git etiketi, private registry veya güvenilir bir modül kaynağı kullanın. terraform fmt, validate, plan ve onaylı apply adımlarını CI/CD hattına ekleyin. Böylece modüler Terraform yalnızca daha az kod değil; denetlenebilir, tutarlı ve büyümeye hazır bir altyapı sözleşmesi haline gelir.

Yorumlar