DevOps and Infrastructure

Terraform Dinamik Blokları ve For_Each: Değişken Uzunluklu Koleksiyonları Yönetmek İçin Gelişmiş Desenler

Altyapı Kod Olarak (IaC), yapılandırmalar derleme zamanında sabit olmayan kaynakları yönetmeyi içerir. İster AWS güvenlik grupları sağlıyor olun, ister Kubernetes dağıtımları yapıyor olun ya da Azure ağ arayüzleri kuruyor olun, iç içe blokların veya liste öğelerinin sayısı sıklıkla değişir. Bu yapılandırmaları kod içinde sabitlemek (hardcode), tekrarlayan koda ve bakım açısından kabuslara yol açar. İşte tam da burada Terraform dinamik blokları ve for_each meta-argümanı öne çıkar.

Orta seviyeden ileri seviyeye geliştiriciler için, bu iki özelliği ustalaşmak; temiz, ölçeklenebilir ve bakımı kolay HCL (HashiCorp Yapılandırma Dili) kodu yazmak için hayati önem taşır. Bu yazı, karmaşık ve değişken uzunluklu koleksiyonları işlemek için bu araçları birleştirme konusundaki gelişmiş desenleri incelemektedir.

Yapı Taşlarını Anlamak

Gelişmiş desenlere dalmadan önce, ayrımı kısaca netleştirelim. for_each, bir harita veya dize kümesine (set) dayalı olarak bir kaynağın birden fazla örneğini oluşturmak için kaynaklar veya modüller üzerinde kullanılabilecek bir meta-argümandır. Üst düzey kaynak oluşturma için idealdir.

Buna karşılık, dinamik bloklar bir kaynak içinde iç içe blokları (örneğin bir güvenlik grubundaki ingress bloğu) dinamik olarak oluşturmanıza olanak tanır. Bir liste veya harita üzerinde yineleme yapar ve her öğe için ilgili blok yapılandırmasını enjekte eder.

Desen 1: İç İçe Dinamik Blok

Dinamik blokların en yaygın kullanım durumu, iç içe yapılandırmalar oluşturmaktır. Bir AWS aws_security_group örneğini ele alalım. Kuralları bir değişkene dayalı olarak tanımlamak istiyorsunuz ancak kural sayısı bilinmiyor. Bir dinamik blok kullanarak, bir dizi harita üzerinde yineleme yapabilirsiniz.

variable "ingress_rules" {
  type = list(object({
    from_port   = number
    to_port     = number
    protocol    = string
    cidr_blocks = list(string)
  }))
  default = []
}

resource "aws_security_group" "example" {
  name = "example-sg"

  dynamic "ingress" {
    for_each = var.ingress_rules
    content {
      from_port   = ingress.value.from_port
      to_port     = ingress.value.to_port
      protocol    = ingress.value.protocol
      cidr_blocks = ingress.value.cidr_blocks
    }
  }
}

# main.tf içinde kullanım
resource "aws_security_group" "web_sg" {
  ingress_rules = [
    {
      from_port   = 443
      to_port     = 443
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    },
    {
      from_port   = 22
      to_port     = 22
      protocol    = "tcp"
      cidr_blocks = ["10.0.0.0/8"]
    }
  ]
}

Bu desen, değişken tanımlarınızı temiz tutar ve giriş listesine yeni kurallar eklendiğinde altyapınızın anında adapte olmasını sağlar.

Desen 2: For_Each ve Dinamik Blokları Birleştirme

Gelişmiş senaryolar, her biri kendi dinamik iç içe bloklar kümesine sahip birden fazla kaynak oluşturma gerektirebilir. Örneğin, her biri belirli ortam değişkenleri veya konteyner bağlantı noktalarına sahip birden fazla uygulama hizmeti dağıtıyor olabilirsiniz.

Kaynak üzerinde for_each ve kaynak içinde dinamik blokları birleştirerek yüksek bir esneklik derekesi elde edersiniz.

variable "services" {
  type = map(object({
    name = string
    ports = list(object({
      containerPort = number
      protocol      = string
    }))
  }))
}

resource "aws_lb_target_group" "this" {
  for_each = var.services

  name     = each.key
  port     = 80
  protocol = "HTTP"

  # Not: Hedef grupları içindeki dinamik bloklar sınırlıdır,
  # ancak bu desen aws_instance veya aws_lb_listener gibi kaynaklara uygulanır
  
  tags = {
    Name = each.key
  }
}

Yukarıdaki örnek basitleştirilmiş olsa da, daha karmaşık bir uygulamada, her bir örneğin iç dinamik bloklarını yönlendiren belirli bir yapılandırma haritası aldığı ayrı modüller veya kaynaklar oluşturmak için for_each kullanılır.

En İyi Uygulamalar ve Performans Düşünceleri

Değişken uzunluklu koleksiyonları yönetirken aşağıdaki noktalara dikkat edin:

  • Anahtarların Değişmezliği: for_each kullanırken anahtarlarınızın sabit olduğundan emin olun. Bir haritadaki bir anahtarın değişmesi, Terraform'un kaynağı güncellemek yerine yok edip yeniden oluşturmasına neden olur.
  • Değişkenleri Basitleştirin: Girdileri erken doğrulamak için yapılandırılmış değişken türleri (nesnelerin haritaları veya nesnelerin listeleri) kullanın. Bu, dinamik bloklar tanımlanmamış özniteliklere erişmeye çalıştığında çalışma zamanı hatalarını önler.
  • Okunabilirlik: Güçlü olsalar da, aşırı iç içe geçmiş dinamik bloklar kodun okunmasını zorlaştırabilir. Mantık çok karmaşık hale gelirse, karmaşık yapılandırmaları yerel değerlere (local values) veya ayrı modüllere ayırın.

Sonuç

Dinamik bloklar ve for_each sadece kolaylık sağlayan özellikler değil; Terraform ile sağlam, bulut yerel altyapı oluşturmak için temel araçlardır. Bu gelişmiş desenlerden yararlanarak kod tekrarını ortadan kaldırabilir, yapılandırma kayması riskini azaltabilir ve uygulamalarınız kadar zarifçe ölçeklenen altyapılar oluşturabilirsiniz. IaC stratejinizin tam potansiyelini açığa çıkarmak için bugün kod içinde sabitlenmiş bloklarınızı yeniden düzenlemeye başlayın.

Share: