AZURE ÜZERİNDE TERRAFORM İLE ALT YAPI GELİŞTİRME – BÖLÜM 11 : LOOPS (DÖNGÜLER)
Azure üzerinde Terraform ile Altyapı Geliştirme makale serisine hoş geldiniz. Yazı dizisinin on birinci bölümünde Terraform’da döngüleri nasıl kullanabileceğimize bakacağız. Döngüler, karmaşık kodu alıp temiz, basit ve anlaşılması kolay bir şeye dönüştürebilir. Yalnızca birkaç satır kodla altyapıyı ölçeklendirebilir ve kolaylaştırabilirsiniz. Döngüler, modülleri dinamik hale getirmek için Terraform topluluğunda yaygın olarak kullanılmaktadır. Örneğin, bir Sanal Makine modülü, gerekirse birden çok diski dağıtmak için döngüleri kullanabilir veya birden çok IP adresi içerebilir. Terraform’da döngüleri kullanmak, kodunuza daha temiz bir görünüm verir ve aynı kavramların Terraform konfigürasyonu boyunca tekrarlanmadığı DRY (Kendini Tekrar Etme) programlama ilkelerini takip eder.
- Örneğimiz için ana dizinde aşağıdaki klasör yapısını oluşturun.

- nsg klasöründe variables.tf oluşturun ve aşağıdaki Terraform kodlarının yapıştırın
variable "nsg_rule" {
description = "OS image to deploy"
type = list(object({
name = string
priority = number
direction = string
access = string
protocol = string
source_port_range = string
destination_port_range = string
source_address_prefix = string
destination_address_prefix = string
}))
}
variable "nsgname" {
type = string
description = "Name of NSG"
}
variable "rgname" {
type = string
description = "Name of resource group"
}
variable "location" {
type = string
description = "Azure location of NSG environment"
default = "northeurope"
}
- “nsg_rule” değişkeni liste (nesne) türüdür. Bu, bu değişkenin birkaç nesnenin bir listesini tutabileceğini gösterir. Sonraki adımlarda “nsg_rule” değişkenindeki tüm nesneleri tekrar eden ve değerleri ile bir NSG kuralı oluşturan bir döngü ile konfigürasyon oluşturacağız. Ayrıca nesneler yerine bir map listesi de oluşturabilirsiniz.
- Şimdi nsg klasöründe main.tf dosyasını oluşturun ve aşağıdaki Terraform kodlarını yapıştırın.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.40.0"
}
}
}
resource "azurerm_network_security_group" "nsg" {
name = var.nsgname
location = var.location
resource_group_name = var.rgname
dynamic security_rule {
for_each = var.nsg_rule
content{
name = security_rule.value.name
priority = security_rule.value.priority
direction = security_rule.value.direction
access = security_rule.value.access
protocol = security_rule.value.protocol
source_port_range = security_rule.value.source_port_range
destination_port_range = security_rule.value.destination_port_range
source_address_prefix = security_rule.value.source_address_prefix
destination_address_prefix = security_rule.value.destination_address_prefix
}
}
}
- “azurerm_network_security_group” kaynak bloğunda, security_rule için başvurulan dinamik bir blok vardır. Dinamik bloklar, tekrarlanabilir konfigürasyon blokları içeren kaynaklar için kullanılabilir. Birkaç “security_rule” bloğunu tekrarlamak yerine, kodu basitleştirmek için dinamik bir blok kullanılır. Bu, dinamik bloğu içindeki “for_each” döngüsüyle birleştirerek yapılır. Dinamik bloğun içindeki ilk satır “for_each” döngüsüdür. Döngü, nesnelerin bir listesi olan “nsg_rule” değişkenleri listesi boyunca yinelenir. İçerik bloğunda, nesnenin her değerine, her nesnenin özniteliğiyle birlikte “security_rule.value” kullanılarak başvurulur. Dinamik blok, listedeki her nesnede tekrarlanır.
- Şimdi ana dizin klasöründe main.tf dosyasını oluşturun ve aşağıdaki Terraform kodlarının yapıştırın.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.40.0"
}
}
}
provider "azurerm" {
features {}
}
module "nsg" {
source = "./modules/nsg"
nsgname = "nsg"
rgname = "demo10"
location = "northeurope"
nsg_rule =[
{
name = "http"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "*"
},
{
name = "ssh"
priority = 101
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "22"
destination_port_range = "*"
source_address_prefix = "*"
destination_address_prefix = "*"
}
]
}
- Artık tüm dosyaları kaydedip “terraform init” ve “terraform plan” komutlarını çalıştırabiliriz. Elbette daha önce oturum açmadıysanız Azure aboneliğinizde oturum açmayı unutmayın.
- “Terraform plan” komutunun çıktısı aşağıdaki gibi olacaktır.

- “nsgname” argümanına “count.index” değişkenini değere dahil etmek için aşağıdaki kodu ekleyelim. “Count.index”, “count” kullanılırken kullanılabilir hale gelir. Oluşturulan kaynağın dizin değerini temsil eder. Count ile çoğaltıldığında kaynaklara benzersiz bir ad vermek için kullanılabilir. Bu örnekte, 4 NSG’nin NSG adları nsg0, nsg1, nsg2 ve nsg3 olacaktır.
# NSG module
module "nsg" {
count = 4
source = "./modules/nsg"
nsgname = "nsg${count.index}"
- main.tf dosyasının son hali aşağıdaki gibidir.
# Terraform
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.40.0"
}
}
}
#Azure provider
provider "azurerm" {
features {}
}
# NSG module
module "nsg" {
count = 4
source = "./modules/nsg"
nsgname = "nsg${count.index}"
rgname = "demo10"
location = "northeurope"
nsg_rule =[
{
name = "http"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "*"
},
{
name = "ssh"
priority = 101
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "22"
destination_port_range = "*"
source_address_prefix = "*"
destination_address_prefix = "*"
}
]
}
- Şimdi “Terraform apply” komutunu çalıştıralım ve 4 adet NSG oluşturalım. Bu 4 NSG içinde aynı kurallar atanacaktır.

