Kod Olarak Altyapı (IaC): Terraform (HCL) Kullanarak Azure Üzerinde Hub-Spoke Ağ Mimarisi ve NSG Kurallarını Otomatik Dağıtma
Azure portalına girip elle sanal ağ (VNet) oluşturmak, subnet'leri bölmek, Network Security Group (NSG) kuralları yazmak ve peering bağlamak küçük bir test için kolaydır. Ancak yarın felaket kurtarma için aynı mimariyi başka bir Azure bölgesinde (Region) birebir kurmanız gerektiğinde veya üretim ortamındaki bir ayar kazara bozulduğunda sistemi eski haline getirmek saatler alır. Kod Olarak Altyapı (Infrastructure as Code - IaC) ve Terraform, bulut altyapınızı Git ile versiyonlanan, denetlenebilir ve tek bir komutla ayağa kalkan kod bloklarına dönüştürür.
1. Hub-Spoke Kurumsal Ağ Mimarisi
Büyük holding ve kurumsal yapılarda kabul gören standart Hub-Spoke Topolojisidir:
- Hub VNet (Merkez Ağ): Güvenlik duvarı (Azure Firewall), VPN Gateway ve paylaşılan servisleri barındırır.
- Spoke 1 VNet (Üretim Ağı): ERP ve veritabanı sunucuları barınır.
- Spoke 2 VNet (Uygulama Ağı): Web ve API servisleri barınır.
- Tüm Spoke ağlar Hub ile VNet Peering üzerinden konuşur; güvenlik denetimi merkezden yapılır.
2. Modüler Terraform (HCL) Kodu
Aşağıdaki Terraform kodu Resource Group, VNet, Subnet ve NSG kurallarını otomatik ayağa kaldırır:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
provider "azurerm" {
features {}
}
# 1. Kaynak Grubu
resource "azurerm_resource_group" "rg_network" {
name = "RG-Holding-Network-Prod"
location = "westeurope"
tags = {
Environment = "Production"
ManagedBy = "Terraform"
}
}
# 2. Sanal Ağ (VNet)
resource "azurerm_virtual_network" "vnet_hub" {
name = "VNet-Hub-WestEurope"
location = azurerm_resource_group.rg_network.location
resource_group_name = azurerm_resource_group.rg_network.name
address_space = ["10.100.0.0/16"]
}
# 3. Güvenlik Duvarı Subnet'i
resource "azurerm_subnet" "snet_firewall" {
name = "AzureFirewallSubnet"
resource_group_name = azurerm_resource_group.rg_network.name
virtual_network_name = azurerm_virtual_network.vnet_hub.name
address_prefixes = ["10.100.1.0/24"]
}
# 4. Network Security Group (NSG) Kuralları
resource "azurerm_network_security_group" "nsg_servers" {
name = "NSG-Servers-Default"
location = azurerm_resource_group.rg_network.location
resource_group_name = azurerm_resource_group.rg_network.name
security_rule {
name = "Allow-HTTPS-Inbound"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "443"
source_address_prefix = "VirtualNetwork"
destination_address_prefix = "*"
}
}
3. Terraform Yaşam Döngüsü Komutları
# 1. Sağlayıcıları ve eklentileri indirme
terraform init
# 2. Planlama: Kodun neleri kuracağını simüle etme (DRY RUN)
terraform plan -out=tfplan.binary
# 3. Canlıya Dağıtım: Saniyeler içinde tüm ağı oluşturma
terraform apply tfplan.binary
Karşılaşılan Kritik Hatalar ve Çözüm İpuçları
- Terraform State Dosyası Güvenliği (terraform.tfstate): State dosyasını asla yerel bilgisayarınızda veya genel bir GitHub reposunda tutmayın! Bu dosya tüm altyapı şifrelerini içerir. Şirketin Azure Storage Account'u üzerinde Blob Storage Remote Backend tanımlanmalı ve state kilitleme (state locking) aktif edilmelidir.
- Portal Üzerinden Elle Yapılan Değişiklikler (Configuration Drift): Biri portaldan elle bir kural silerse,
terraform plançalıştırdığınızda Terraform aradaki farkı yakalar veterraform applyile portaldaki yetkisiz değişikliği anında ezerek kod tabanına geri döndürür!
Mühendis Notu
Altyapınızı kodladığınızda, felaket anında tüm veri merkezinizi başka bir Azure bölgesinde ayağa kaldırmak yalnızca tek bir terraform apply komutuna bakar.
