Takip et

Terraform Temelleri: İlk Azure Sanal Makinenizi Dağıtma Rehberi

Azure’da altyapınızı manuel olarak yönetmekten sıkıldınız mı? Terraform ile altyapıyı kod olarak (IaC) yönetmenin temellerini öğrenin ve ilk Azure sanal makinenizi (VM) dakikalar içinde otomatize bir şekilde nasıl dağıtacağınızı keşfedin. Bu kapsamlı rehber, sıfırdan başlayarak Azure VM dağıtımını adım adım ele alıyor.

Günümüzün hızla değişen dijital dünyasında, bulut altyapısı yönetimi hiç olmadığı kadar kritik bir rol oynamaktadır. Şirketler, uygulamalarını ve hizmetlerini hızlı, güvenilir ve tekrarlanabilir bir şekilde dağıtma ihtiyacı duyuyorlar. Geleneksel yaklaşımlar, yani bulut sağlayıcının arayüzünden (GUI) veya komut satırından (CLI) manuel olarak kaynak oluşturma, zaman alıcı olmasının yanı sıra insan hatasına da açıktır. Ayrıca, büyük ve karmaşık altyapılarda tutarlılığı sağlamak neredeyse imkansız hale gelebilir. İşte tam da bu noktada, Altyapı Kod Olarak (Infrastructure as Code – IaC) kavramı devreye giriyor ve oyunun kurallarını değiştiriyor.

IaC, sunucular, veritabanları, ağ yapılandırmaları ve sanal makineler (VM’ler) gibi altyapı bileşenlerini, tıpkı yazılım kodu gibi metin dosyalarında tanımlamamızı sağlar. Bu yaklaşım, altyapınızın versiyon kontrolünü yapabilmenize, değişiklikleri izlemenize ve hatta otomatik test süreçlerine dahil etmenize olanak tanır. Düşünsenize, bir kod deposunda altyapınızın tüm geçmişini görebiliyor, eski bir versiyona geri dönebiliyor veya farklı ortamlara (geliştirme, test, üretim) aynı yapılandırmayı sorunsuz bir şekilde uygulayabiliyorsunuz. Bu, geliştirme ekipleri için büyük bir esneklik ve operasyonel tutarlılık anlamına gelir.

Manuel süreçlerin aksine, IaC ile altyapı dağıtımı ve yönetimi çok daha verimli hale gelir. Örneğin, yeni bir test ortamı kurmanız gerektiğinde, daha önce tanımlanmış kod bloklarını kullanarak saniyeler içinde tamamen yeni bir altyapıyı ayağa kaldırabilirsiniz. Bu otomasyon yeteneği, operasyonel yükü azaltırken, ekiplerin daha stratejik görevlere odaklanmasını sağlar. Ayrıca, güvenlik ve uyumluluk denetimlerini de kolaylaştırır; çünkü altyapı tanımları açık ve denetlenebilir bir formattadır. Bu makalede, IaC’nin önde gelen araçlarından biri olan Terraform’u kullanarak, Microsoft Azure bulut platformunda ilk sanal makinenizi (Azure VM) nasıl dağıtacağınızı adım adım keşfedeceğiz. Terraform’un gücüyle, Azure altyapınızı kodla yönetmenin kolaylığını ve avantajlarını ilk elden deneyimleyeceksiniz. Başlangıç seviyesindeki bir kullanıcının bile rahatlıkla takip edebileceği bu rehber, Terraform ve Azure yolculuğunuzun ilk adımı olacak.

Terraform ve IaC Temelleri: Neden Kullanmalıyız?

Altyapı Kod Olarak (IaC) felsefesi, bulut ve on-premise altyapılarını kod dosyaları aracılığıyla yönetme ve sağlama pratiğidir. Geleneksel el ile yapılan yapılandırmaların aksine, IaC ile altyapı tekrarlanabilir, tutarlı ve otomatiktir. Bu, altyapının bir yazılım ürünü gibi ele alınmasını sağlar; yani versiyon kontrol sistemleri (örneğin Git) ile yönetilebilir, test edilebilir ve sürekli entegrasyon/sürekli dağıtım (CI/CD) süreçlerine dahil edilebilir.

IaC’nin sunduğu temel avantajlar şunlardır:

  • Tutarlılık ve Tekrarlanabilirlik: Farklı ortamlar (geliştirme, test, üretim) arasında aynı altyapı yapılandırmasını kolayca sağlayabilirsiniz. Bu, “benim makinemde çalışıyordu” sorunlarının önüne geçer.
  • Hız ve Verimlilik: Yeni ortamları veya mevcut altyapı değişikliklerini çok daha hızlı bir şekilde dağıtabilir ve yönetebilirsiniz. Manuel süreçler günler sürerken, IaC ile bu süre dakikalara inebilir.
  • Hata Azaltma: İnsan hatalarını en aza indirir. Kod, her zaman aynı şekilde yorumlanır ve uygulanır, bu da manuel yapılandırmalardan kaynaklanan hataları ortadan kaldırır.
  • Versiyon Kontrolü: Altyapı tanımlarını Git gibi bir versiyon kontrol sisteminde saklayarak, değişiklikleri izleyebilir, eski sürümlere geri dönebilir ve ekipler arasında işbirliğini kolaylaştırabilirsiniz.
  • Maliyet Tasarrufu: Otomasyon sayesinde operasyonel maliyetler düşer ve kaynaklar daha etkin kullanılır.

Peki, IaC araçları arasında Terraform nerede duruyor?

HashiCorp tarafından geliştirilen Terraform, IaC prensiplerini benimsemiş, açık kaynaklı ve buluttan bağımsız (cloud-agnostic) bir araçtır. Bu “buluttan bağımsız” özelliği, Terraform’u rakiplerinden ayıran en önemli noktalardan biridir. AWS, Azure, Google Cloud, Oracle Cloud Infrastructure (OCI) gibi birçok farklı bulut sağlayıcısının yanı sıra VMware, Kubernetes ve hatta GitHub gibi servisler için de kaynakları yönetebilir. Terraform, altyapıyı tanımlamak için HashiCorp Configuration Language (HCL) adı verilen, okunması ve yazması kolay kendi deklaratif dilini kullanır. Deklaratif olması, sizin “nasıl” değil, “ne” istediğinizi belirtmeniz anlamına gelir. Yani, Terraform’a bir sanal makine istediğinizi söylersiniz, o da bu makineyi oluşturmak için gerekli adımları kendisi belirler ve uygular.

Terraform’un iş akışı genellikle üç ana adımdan oluşur:

  1. Yazma (Write): HCL kullanarak altyapınızı tanımlayan .tf uzantılı dosyalar oluşturursunuz.
  2. Planlama (Plan): terraform plan komutuyla, Terraform’un mevcut altyapınızla yapılandırma dosyalarınız arasındaki farkı analiz etmesini ve uygulayacağı değişiklikleri size göstermesini sağlarsınız. Bu adım, herhangi bir gerçek değişiklik yapmadan önce ne olacağını görmenizi sağlar ve olası hataları önlemeye yardımcı olur.
  3. Uygulama (Apply): terraform apply komutuyla, planlanan değişiklikleri gerçek bulut ortamınıza uygularsınız. Terraform, tanımladığınız kaynakları oluşturur, günceller veya siler.

Terraform’un bu basit ama güçlü iş akışı, altyapı yönetimini hem karmaşık projeler için hem de küçük ekipler için ulaşılabilir ve yönetilebilir kılar. İlk Azure sanal makinenizi dağıtırken bu adımları tek tek uygulayarak, Terraform’un temel prensiplerini ve gücünü bizzat deneyimleyeceksiniz. Bulut altyapınızın geleceği, IaC ile kodlanıyor ve Terraform bu geleceğin en önemli temsilcilerinden biri.

Azure Ortamını Hazırlama ve Terraform Kurulumu Nasıl Yapılır?

İlk Azure VM’inizi Terraform ile dağıtmadan önce, çalışma ortamımızı hazırlamamız gerekiyor. Bu süreç iki ana bölümden oluşuyor: Azure hesabımızı yapılandırmak ve yerel makinemize Terraform’u kurmak. Her iki adım da kritik öneme sahip olup, sorunsuz bir başlangıç için dikkatle takip edilmelidir.

Azure Hesabınızı ve Kimlik Doğrulamasını Nasıl Yapılandırırsınız?

Terraform’un Azure kaynaklarınızı yönetebilmesi için, Azure hesabınıza erişim yetkisine sahip olması gerekir. Bu erişimi sağlamanın en yaygın ve güvenli yolu, Azure CLI (Komut Satırı Arayüzü) kullanarak kimlik doğrulaması yapmaktır. Azure CLI, hem Terraform için kimlik doğrulama sağlar hem de Terraform kullanmadan önce Azure kaynaklarını manuel olarak doğrulamanıza yardımcı olabilir.

1. Azure CLI Kurulumu:

Öncelikle, yerel makinenize Azure CLI’yi kurmanız gerekiyor. Kurulum talimatları işletim sisteminize göre değişiklik gösterir:

Kurulumu tamamladıktan sonra, bir terminal veya komut istemcisi açarak aşağıdaki komutu çalıştırarak doğru şekilde kurulup kurulmadığını kontrol edebilirsiniz:

az --version

Bu komut, Azure CLI'nin sürüm bilgilerini gösterecektir.

2. Azure Hesabınızda Oturum Açma:

Terraform'un Azure ile etkileşime geçebilmesi için, Azure CLI üzerinden hesabınızda oturum açmanız gerekmektedir. Terminalinizde şu komutu çalıştırın:

az login

Bu komutu çalıştırdığınızda, web tarayıcınız otomatik olarak açılacak ve Azure kimlik bilgilerinizle oturum açmanız istenecektir. Oturum açma işlemi tamamlandıktan sonra, terminalinizde abonelik bilgileriniz listelenecektir. Eğer birden fazla Azure aboneliğiniz varsa, Terraform'un hangi aboneliği kullanacağını belirtmek için aşağıdaki komutu kullanarak varsayılan aboneliği ayarlayabilirsiniz:

az account set --subscription "Abonelik Adınız veya ID'niz"

Uzman İpucu: Güvenlik ve otomasyon senaryoları için, az login yerine bir Hizmet Prensibi (Service Principal) kullanarak kimlik doğrulamasını sağlamak daha güvenlidir. Bu yöntem, üretim ortamları ve CI/CD pipeline'ları için önerilir.

Bu adımlarla, Terraform'un Azure kaynaklarınızı yönetmesi için gerekli olan kimlik doğrulama altyapısını kurmuş oluyorsunuz. Artık Terraform'un kendisini kurmaya geçebiliriz.

Yerel Makinenize Terraform Nasıl Kurulur?

Terraform kurulumu oldukça basittir ve HashiCorp'un resmi web sitesinden indirilebilir. İşletim sisteminize uygun paketi indirip PATH'inize eklemeniz yeterlidir.

1. Terraform'u İndirme:

Terraform'un en güncel sürümünü Terraform İndirme Sayfası adresinden indirin. İşletim sisteminize (Windows, macOS, Linux) uygun olan paketi seçtiğinizden emin olun.

2. Kurulum ve PATH Yapılandırması:

  • Windows: İndirdiğiniz ZIP dosyasını açın ve terraform.exe dosyasını bilgisayarınızda kolayca erişebileceğiniz bir yere (örneğin C:\terraform) kopyalayın. Ardından, bu dizini sisteminizin PATH ortam değişkenine eklemeniz gerekiyor. Bunu "Sistem Özellikleri" -> "Ortam Değişkenleri" üzerinden yapabilirsiniz.
  • macOS: İndirdiğiniz ZIP dosyasını açın ve terraform ikili dosyasını /usr/local/bin gibi PATH'inizde bulunan bir dizine taşıyın. Örneğin:
    unzip terraform_1.x.x_darwin_amd64.zip
    sudo mv terraform /usr/local/bin/
    

  • Linux: macOS'e benzer şekilde, indirdiğiniz ZIP dosyasını açın ve terraform ikili dosyasını PATH'inizdeki bir dizine taşıyın (örneğin /usr/local/bin).
    unzip terraform_1.x.x_linux_amd64.zip
    sudo mv terraform /usr/local/bin/
    

3. Kurulumu Doğrulama:

Kurulumu tamamladıktan sonra, bir terminal veya komut istemcisi açarak aşağıdaki komutu çalıştırarak Terraform'un doğru şekilde kurulup kurulmadığını kontrol edebilirsiniz:

terraform --version

Bu komut, Terraform'un sürüm bilgilerini gösterecektir. Eğer sürüm bilgisi görünüyorsa, Terraform başarıyla kurulmuş demektir. Artık Azure altyapınızı kodla tanımlamak ve ilk sanal makinenizi dağıtmak için hazırsınız!

Bu aşamaların her biri, Terraform ile Azure'da sorunsuz bir dağıtım deneyimi yaşamanız için temel oluşturur. Doğru kimlik doğrulaması ve araç kurulumu olmadan, karmaşık altyapıları yönetmek mümkün olmayacaktır. Dolayısıyla, bu adımları sabırla ve dikkatle tamamlamak, başarılı bir başlangıcın anahtarıdır.

İlk Azure Sanal Makinenizi Terraform ile Nasıl Dağıtırsınız?

Tebrikler! Azure ortamınızı hazırladınız ve Terraform'u başarıyla kurdunuz. Şimdi, Terraform'un gücünü kullanarak ilk Azure sanal makinenizi (VM) dağıtma zamanı geldi. Bu bölümde, adım adım bir sanal makineyi ve bağımlı kaynaklarını (kaynak grubu, sanal ağ, alt ağ, ağ güvenlik grubu, genel IP adresi ve ağ arayüzü) nasıl tanımlayacağımızı ve dağıtacağımızı öğreneceksiniz.

Adım 1: Terraform Yapılandırma Dosyalarını Oluşturma

Terraform, altyapınızı tanımlamak için .tf uzantılı dosyalar kullanır. Genellikle bu dosyaları mantıksal olarak ayırırız: sağlayıcı yapılandırması, değişkenler, kaynaklar ve çıktılar. Boş bir dizin oluşturun ve içine bu dosyaları ekleyin.

main.tf: Sağlayıcı ve Kaynak Grubunu Tanımlama

Bu dosya, Terraform'un Azure ile etkileşim kurmasını sağlayan sağlayıcıyı (provider) ve tüm kaynaklarımızı barındıracak olan kaynak grubunu tanımlar. Azure sağlayıcısını kullanacağımızı belirtmeli ve Azure CLI aracılığıyla kimlik doğrulamasını sağlamalıyız.

# Azure Sağlayıcısını Yapılandırma
# Bu blok, Terraform'a Azure kaynaklarını yönetmek için Azure sağlayıcısını kullanmasını söyler.
# CLI kimlik doğrulaması kullandığımız için 'features' bloğu gereklidir.
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0" # En az 3.0 sürümünü kullanın
    }
  }
}

provider "azurerm" {
  features {} # Azure CLI ile kimlik doğrulamasını sağlar.
}

# Kaynak Grubunu Tanımlama
# Azure'daki tüm kaynaklarımız bu kaynak grubunun altında toplanacaktır.
# Kaynak grubunun adını ve lokasyonunu belirtiriz.
resource "azurerm_resource_group" "rg" {
  name     = var.resource_group_name
  location = var.location
}

Burada azurerm_resource_group kaynağı, Azure'da bir kaynak grubu oluşturur. name ve location gibi değerleri değişkenlerden alıyoruz, bu da yapılandırmamızı daha esnek hale getiriyor.

variables.tf: Değişkenleri Tanımlama

Değişkenler, Terraform yapılandırmanızı daha dinamik ve yeniden kullanılabilir hale getirir. Sanal makine adı, konum, yönetici kullanıcı adı ve parola gibi değerleri bu dosyada tanımlayacağız.

# location değişkeni, kaynakların dağıtılacağı Azure bölgesini belirler.
variable "location" {
  description = "Azure kaynaklarının dağıtılacağı bölge."
  type        = string
  default     = "West Europe" # Varsayılan olarak Batı Avrupa'yı kullanabiliriz.
}

# resource_group_name değişkeni, oluşturulacak kaynak grubunun adını belirler.
variable "resource_group_name" {
  description = "Oluşturulacak kaynak grubunun adı."
  type        = string
  default     = "my-terraform-rg"
}

# vm_name değişkeni, oluşturulacak sanal makinenin adını belirler.
variable "vm_name" {
  description = "Oluşturulacak Sanal Makinenin Adı."
  type        = string
  default     = "my-terraform-vm"
}

# admin_username değişkeni, sanal makineye SSH/RDP ile bağlanmak için kullanılacak kullanıcı adını belirler.
variable "admin_username" {
  description = "Sanal Makine için yönetici kullanıcı adı."
  type        = string
  default     = "adminuser"
}

# admin_password değişkeni, sanal makine için yönetici parolasını belirler.
# Dikkat: Üretim ortamlarında bu şekilde doğrudan parola kullanmak yerine Azure Key Vault veya SSH anahtarları tercih edilmelidir.
variable "admin_password" {
  description = "Sanal Makine için yönetici parolası."
  type        = string
  sensitive   = true # Bu değişkenin çıktılarda görünmemesini sağlar.
}

# vm_size değişkeni, sanal makinenin boyutunu (SKU) belirler.
variable "vm_size" {
  description = "Sanal Makinenin boyutu (SKU)."
  type        = string
  default     = "Standard_B1s" # Düşük maliyetli bir boyut.
}

Uzman İpucu: Hassas verileri (parolalar gibi) doğrudan Terraform dosyalarına yazmaktan kaçının. Bunun yerine Azure Key Vault gibi bir gizli dizi yönetim hizmetini veya SSH anahtarlarını kullanın. sensitive = true kullanımı çıktılarda görünmesini engeller ama dosyada yine de bulunur.

Adım 2: Azure Ağ Altyapısını Tasvir Etme

Sanal makineyi dağıtmadan önce, onun iletişim kurabileceği bir ağ altyapısı oluşturmalıyız. Bu, bir Sanal Ağ (VNet), bir Alt Ağ (Subnet), bir Ağ Güvenlik Grubu (NSG) ve bir Genel IP adresi içerir. Ağ arayüzü (NIC) bu bileşenleri bir araya getiren köprü görevi görür.

network.tf: Ağ Kaynaklarını Tanımlama

Bu dosya, sanal makinenizin bağlanacağı ağ altyapısını içerir.

# Sanal Ağ (Virtual Network) Oluşturma
# Tüm ağ kaynaklarımız bu sanal ağ içinde yer alacaktır.
resource "azurerm_virtual_network" "vnet" {
  name                = "${var.vm_name}-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

# Alt Ağ (Subnet) Oluşturma
# Sanal ağ içindeki bir segmenttir ve sanal makinemiz bu alt ağa bağlanacaktır.
resource "azurerm_subnet" "subnet" {
  name                 = "${var.vm_name}-subnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

# Ağ Güvenlik Grubu (Network Security Group - NSG) Oluşturma
# Sanal makineye gelen ve giden trafiği kontrol etmek için kullanılır.
resource "azurerm_network_security_group" "nsg" {
  name                = "${var.vm_name}-nsg"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  security_rule {
    name                       = "SSH" # SSH bağlantısı için kural
    priority                   = 1001
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "22" # SSH için standart port
    source_address_prefix      = "*" # Herhangi bir IP'den erişime izin verir (Üretimde kısıtlayın!)
    destination_address_prefix = "*"
  }
}

# Genel IP Adresi (Public IP Address) Oluşturma
# Sanal makineye internet üzerinden erişim sağlamak için kullanılır.
resource "azurerm_public_ip" "public_ip" {
  name                = "${var.vm_name}-public-ip"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  allocation_method   = "Dynamic" # Veya "Static" olabilir.
}

# Ağ Arayüzü (Network Interface - NIC) Oluşturma
# Sanal makineyi sanal ağa bağlayan bileşendir.
resource "azurerm_network_interface" "nic" {
  name                = "${var.vm_name}-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.public_ip.id
  }
}

# Ağ Güvenlik Grubunu Ağ Arayüzüne Bağlama
# Oluşturduğumuz NSG'yi NIC'imize atarız.
resource "azurerm_network_interface_security_group_association" "nic_nsg_association" {
  network_interface_id      = azurerm_network_interface.nic.id
  network_security_group_id = azurerm_network_security_group.nsg.id
}

Bu bölümde, sanal ağdan başlayarak alt ağ, güvenlik grubu ve genel IP'ye kadar tüm ağ bileşenlerini tanımladık. Özellikle SSH (22) portuna izin veren bir güvenlik kuralı ekledik. Üretim ortamlarında source_address_prefix değerini kendi IP adresinizle kısıtlamayı unutmayın!

Adım 3: Sanal Makine Kaynağını Tanımlama

Şimdi sıra geldi ana bileşenimiz olan Azure sanal makinesini tanımlamaya. Linux veya Windows bir VM seçebiliriz. Bu örnekte bir Linux (Ubuntu) VM oluşturacağız.

vm.tf: Sanal Makine Kaynağını Tanımlama

# Sanal Makine (Virtual Machine) Oluşturma
# Linux tabanlı bir sanal makine oluştururuz.
resource "azurerm_linux_virtual_machine" "vm" {
  name                = var.vm_name
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = var.vm_size # Değişkenden alınan VM boyutu
  admin_username      = var.admin_username
  admin_password      = var.admin_password
  disable_password_authentication = false # Parola ile kimlik doğrulamasını etkinleştir

  network_interface_ids = [
    azurerm_network_interface.nic.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts"
    version   = "latest" # En güncel Ubuntu 20.04 LTS sürümünü kullan
  }
}

Burada azurerm_linux_virtual_machine kaynağını kullanarak bir Ubuntu VM oluşturduk. Makinenin adı, boyutu, yönetici bilgileri ve işletim sistemi imajı gibi detayları belirttik. network_interface_ids özelliği ile oluşturduğumuz NIC'i sanal makineye bağladık.

Adım 4: Çıktıları Tanımlama (Opsiyonel ama Tavsiye Edilir)

outputs.tf: Dağıtım Sonrası Bilgileri Gösterme

Dağıtım tamamlandıktan sonra, sanal makinenin genel IP adresi gibi önemli bilgileri almak isteyebiliriz. outputs.tf dosyası, bu bilgileri Terraform'un uygulamasını tamamladıktan sonra terminalde göstermesini sağlar.

# Sanal makinenin genel IP adresini çıktı olarak gösterir.
output "public_ip_address" {
  description = "Dağıtılan sanal makinenin genel IP adresi."
  value       = azurerm_public_ip.public_ip.ip_address
}

# SSH komutunu kolayca kopyalamak için çıktı olarak gösterir.
output "ssh_command" {
  description = "Sanal makineye SSH ile bağlanmak için komut."
  value       = "ssh ${var.admin_username}@${azurerm_public_ip.public_ip.ip_address}"
}

Adım 5: Terraform Komutlarını Uygulama ve Doğrulama

Tüm .tf dosyalarını aynı dizine yerleştirdikten sonra, terminalinizi bu dizinde açın ve aşağıdaki adımları uygulayın:

1. Terraform'u Başlatma (Initialize):

Bu komut, Terraform'un gerekli sağlayıcı eklentilerini indirmesini ve çalışma dizinini başlatmasını sağlar.

terraform init

Başarılı bir başlangıçtan sonra "Terraform has been successfully initialized!" mesajını görmelisiniz.

2. Dağıtım Planını Gözden Geçirme (Plan):

Bu komut, Terraform'un yapılandırma dosyalarınız ile mevcut Azure ortamı arasındaki farkları analiz etmesini ve uygulayacağı tüm değişiklikleri size göstermesini sağlar. Herhangi bir değişiklik yapmadan önce ne olacağını görmek için bu kritik bir adımdır.

terraform plan -var 'admin_password=YourSecurePassword123!'

-var 'admin_password=...' ile parolayı komut satırından geçirdik. Plan çıktısı, kaç kaynağın ekleneceğini (+), değiştirileceğini (~) veya silineceğini (-) gösterecektir. Çıktıyı dikkatlice inceleyin.

3. Değişiklikleri Uygulama (Apply):

Eğer plan çıktısından memnunsanız, bu komut ile Terraform'un planlanan değişiklikleri Azure ortamınıza uygulamasını sağlayın. Terraform size bir onay isteyecektir; "yes" yazarak onaylayın.

terraform apply -var 'admin_password=YourSecurePassword123!'

Bu işlem birkaç dakika sürebilir. Uygulama tamamlandığında, outputs.tf dosyasında tanımladığınız genel IP adresi ve SSH komutu terminalde gösterilecektir.

4. Dağıtımı Doğrulama:

Azure Portal'a gidin, oluşturduğunuz kaynak grubunu bulun ve içindeki VM, ağ arayüzü, genel IP adresi ve NSG'nin başarıyla oluşturulduğunu kontrol edin. Ayrıca, terminalde gördüğünüz SSH komutunu kullanarak sanal makinenize bağlanmayı deneyebilirsiniz:

ssh adminuser@

yerine Terraform çıktısındaki IP adresini yazın. İstendiğinde parolanızı girin. Başarılı bir şekilde bağlanırsanız, ilk Azure VM'inizi Terraform ile başarıyla dağıtmışsınız demektir!

Kaynakları Temizleme: terraform destroy Komutu

Denemeleriniz bittiğinde ve bu kaynaklara artık ihtiyacınız kalmadığında, onları güvenli bir şekilde kaldırmak önemlidir. Terraform, tüm oluşturulan kaynakları tek bir komutla temizlemenize olanak tanır.

terraform destroy -var 'admin_password=YourSecurePassword123!'

Terraform, silecek tüm kaynakları size listeleyecek ve onayınızı isteyecektir. "yes" yazarak onayladığınızda, tüm Azure kaynakları aboneliğinizden kaldırılacaktır. Bu, gereksiz maliyetleri önlemek ve ortamınızı temiz tutmak için harika bir yoldur.

Gerçek Dünya Senaryosu ve İleri Düzey İpuçları Nelerdir?

Terraform ile ilk Azure VM'inizi dağıtmak, altyapıyı kod olarak yönetme yolculuğunuzda önemli bir adımdı. Ancak gerçek dünya senaryoları genellikle daha karmaşık ve gelişmiş yaklaşımlar gerektirir. Bu bölümde, öğrendiklerimizi bir adım öteye taşıyacak gerçek dünya vaka analizleri ve ileri düzey ipuçları ele alacağız.

Vaka Analizi: Çok Katmanlı Bir Uygulama Altyapısı Dağıtımı

Tek bir sanal makine dağıtımı güzel bir başlangıçtır, ancak çoğu uygulama çok daha karmaşık bir altyapı gerektirir. Örneğin, bir web uygulaması için genellikle şunlara ihtiyacımız olur:

  • Bir yük dengeleyici (Load Balancer)
  • Birden fazla ön uç (frontend) web sunucusu (VMSS - Virtual Machine Scale Sets ile)
  • Bir veya daha fazla arka uç (backend) uygulama sunucusu
  • Bir veritabanı sunucusu (örneğin Azure SQL Database veya PostgreSQL)
  • Depolama alanı (örneğin Azure Blob Storage)
  • Güvenlik duvarları, sanal ağlar ve alt ağlar gibi ağ bileşenleri

Terraform, tüm bu bileşenleri tek bir, entegre yapılandırma seti içinde tanımlamanıza olanak tanır. İşte böyle bir senaryoda nasıl düşüneceğimize dair bir örnek:

Senaryo: Üç katmanlı bir web uygulaması (Web, Uygulama, Veritabanı) için Azure'da altyapı dağıtımı.

Terraform Yaklaşımı:

  1. Modüler Yapı: Tüm altyapıyı tek bir .tf dosyasında tanımlamak yerine, her katman veya bileşen için ayrı Terraform modülleri oluşturulur. Örneğin, bir "network" modülü sanal ağı ve alt ağları oluşturur, bir "web_servers" modülü web sunucularını ve yük dengeleyiciyi kurar, bir "database" modülü ise veritabanını dağıtır. Bu modüler yapı, kodun okunabilirliğini, bakımını ve yeniden kullanılabilirliğini artırır.
  2. Durum Yönetimi (State Management): Terraform, dağıttığı altyapının durumunu bir .tfstate dosyasında saklar. Bu dosya, mevcut altyapının bir haritasını içerir. Ekip çalışmasında, bu dosyanın paylaşılan bir konumda (örneğin Azure Blob Storage'da bir backend yapılandırması ile) güvenli bir şekilde saklanması ve kilitlenmesi (state locking) çok önemlidir. Bu, aynı anda birden fazla kişinin durumu bozmasını engeller.
  3. Veri Kaynakları (Data Sources): Mevcut Azure kaynaklarını (örneğin daha önce oluşturulmuş bir Sanal Ağ) Terraform yapılandırmasına dahil etmek için veri kaynakları kullanılır. Bu, her şeyi sıfırdan oluşturmak yerine mevcut altyapı ile entegrasyonu sağlar.
  4. Otomatik Dağıtım (CI/CD): Terraform dağıtım süreçleri Jenkins, Azure DevOps, GitHub Actions gibi CI/CD araçlarına entegre edilebilir. Bu, kod değişikliklerinin otomatik olarak test edilip dağıtılmasını sağlar, manuel müdahaleyi azaltır ve dağıtım hızını artırır.
# Örnek bir modül çağrısı (main.tf dosyasında olabilir)
module "network" {
  source = "./modules/network" # Yerel bir network modülünü çağırır
  prefix = "myapp"
  location = var.location
  resource_group_name = azurerm_resource_group.rg.name
}

module "web_servers" {
  source = "./modules/web_servers"
  prefix = "myapp-web"
  location = var.location
  resource_group_name = azurerm_resource_group.rg.name
  subnet_id = module.network.web_subnet_id # Ağ modülünden gelen çıktıyı kullanır
  # Diğer VMSS, yük dengeleyici ayarları...
}

# Veritabanı dağıtımı...

Terraform ile Daha Verimli Çalışmak İçin İleri Düzey İpuçları

Uzman İpucu: Karmaşık altyapılarda terraform validate komutunu sıkça kullanarak sözdizimi hatalarını erkenden yakalayın. Ayrıca, terraform fmt ile kodunuzu standart bir biçime sokun.
  1. Durum Dosyası Güvenliği ve Uzak Backend'ler:

    .tfstate dosyası, altyapınızın en hassas bilgilerini (örneğin kaynak ID'leri, bazen şifrelenmemiş hassas veriler) içerir. Bu yüzden yerel makinenizde bırakmak yerine Azure Storage Blob gibi güvenli, uzak bir konuma taşıyın. Uzak backend'ler, takım içinde işbirliğini de kolaylaştırır ve durum kilitleme (state locking) mekanizmaları sayesinde aynı anda birden fazla kişinin aynı durumu değiştirmesini engeller.

    # main.tf dosyasının en başına eklenebilir
    terraform {
      backend "azurerm" {
        resource_group_name  = "terraform-state-rg"
        storage_account_name = "terrastateaccount"
        container_name       = "tfstate"
        key                  = "terraform.tfstate"
      }
    }
            

    Bu yapılandırma, Terraform durumunu belirtilen Azure Storage hesabına kaydedecektir. İlk terraform init çalıştırdığınızda, mevcut yerel durum dosyasını uzak konuma taşımanızı isteyecektir.

  2. Terraform Modülleri:

    Modüller, Terraform yapılandırmanızı mantıksal olarak düzenlemenin ve yeniden kullanılabilirliğini artırmanın temel yoludur. Tekrarlayan kod bloklarını bir modüle dönüştürerek, farklı projelerde veya aynı proje içinde farklı ortamlarda (geliştirme, test, üretim) aynı altyapı desenlerini kolayca dağıtabilirsiniz. Azure VM dağıtımı örneğimizde, VNet, Subnet, NSG gibi ağ kaynaklarını bir "network" modülüne, VM ve ilgili bileşenleri başka bir "compute" modülüne ayırabilirsiniz.

  3. Çalışma Alanları (Workspaces):

    Aynı Terraform yapılandırmasını kullanarak farklı, izole ortamlar oluşturmak için çalışma alanları (workspaces) kullanabilirsiniz. Örneğin, "dev", "staging" ve "prod" adında üç çalışma alanı oluşturarak, her ortam için aynı kodu kullanabilir ancak farklı değişken değerleri (örneğin VM boyutları, IP aralıkları) atayabilirsiniz. Çalışma alanları, durumu izole eder ve yanlışlıkla üretim ortamında değişiklik yapma riskini azaltır.

    terraform workspace new dev
    terraform workspace select prod
    

  4. depends_on Kullanımı:

    Terraform, kaynaklar arasındaki örtük bağımlılıkları genellikle otomatik olarak çözer (örneğin bir VM'nin NIC'ye bağımlı olması). Ancak bazen açıkça belirtmeniz gereken durumlar olabilir. depends_on meta-argümanı, Terraform'a belirli bir kaynağın başka bir kaynaktan önce oluşturulması veya silinmesi gerektiğini açıkça söylemenizi sağlar. Genellikle nadiren kullanılır, ancak özellikle custom scriptlerin veya uygulamaların dağıtım sonrası çalıştırılması gereken durumlarda faydalı olabilir.

  5. for_each ve count ile Dinamik Kaynak Oluşturma:

    Birden fazla benzer kaynak oluşturmanız gerektiğinde (örneğin birden fazla VM, birden fazla ağ arayüzü), count ve for_each meta-argümanlarını kullanabilirsiniz. count belirli sayıda örneği oluştururken, for_each daha karmaşık durumlar için (örneğin bir liste veya harita üzerindeki her öğe için bir kaynak oluşturmak) idealdir.

    # count örneği: 3 adet web sunucusu oluşturma
    resource "azurerm_linux_virtual_machine" "web" {
      count = 3
      name = "web-vm-${count.index}"
      # ... diğer özellikler
    }
    
    # for_each örneği: farklı özelliklere sahip VM'ler oluşturma
    resource "azurerm_linux_virtual_machine" "app" {
      for_each = {
        "app1" = { size = "Standard_B1s", os = "Ubuntu" },
        "app2" = { size = "Standard_B2s", os = "CentOS" }
      }
      name = "app-vm-${each.key}"
      size = each.value.size
      # ... diğer özellikler
    }
            

Bu ileri düzey konular, Terraform ile daha sağlam, ölçeklenebilir ve yönetilebilir altyapılar oluşturmanız için size yol gösterecektir. Gerçek dünya projelerinde bu teknikleri uygulayarak, IaC uzmanlığınızı geliştirebilir ve bulut altyapınızı daha verimli bir şekilde yönetebilirsiniz.

Sonuç: Terraform ile Azure'da Geleceğinizi İnşa Edin

Bu makalede, "Terraform Temelleri: İlk Azure Sanal Makinenizi Dağıtma" başlığı altında, altyapıyı kod olarak (IaC) yönetmenin öneminden başlayarak, Terraform'un temel prensiplerini ve Azure'da ilk sanal makinenizi (VM) dağıtmanın pratik adımlarını detaylı bir şekilde inceledik. Azure ortamınızı hazırlamaktan, Terraform'u kurmaya ve yapılandırma dosyalarını oluşturup komutları uygulamaya kadar her aşamayı adım adım takip ettik. Bir kaynak grubu, sanal ağ, alt ağ, ağ güvenlik grubu, genel IP adresi ve ağ arayüzü gibi bağımlı tüm Azure kaynaklarını Terraform ile nasıl tanımlayacağınızı öğrendiniz.

İlk VM dağıtımınız sadece bir başlangıçtı. Gerçek dünya senaryolarında, Terraform'un modüler yapılandırma, uzak durum yönetimi, çalışma alanları ve CI/CD entegrasyonu gibi ileri düzey özelliklerinin, karmaşık bulut altyapılarını yönetmek için ne kadar hayati olduğunu gördük. Bu araçlar, altyapı süreçlerinizi otomatikleştirecek, insan hatasını azaltacak, tutarlılığı sağlayacak ve ekipler arasında işbirliğini güçlendirecektir. Altyapınızı kod olarak yönetmek, sadece bir teknik pratik değil, aynı zamanda DevOps kültürünün de temel bir taşıdır. Yazılım geliştirme prensiplerini altyapıya uygulayarak, daha hızlı, daha güvenilir ve daha ölçeklenebilir sistemler inşa edebilirsiniz.

Terraform, bulut sağlayıcıları arasındaki geçişi kolaylaştıran "buluttan bağımsız" yapısıyla da öne çıkmaktadır. Bir sağlayıcıda öğrendiğiniz prensipleri, diğerine kolayca adapte edebilirsiniz. Bu esneklik, şirketlerin gelecekteki bulut stratejilerini belirlerken büyük bir avantaj sağlar.

Unutmayın, bu yolculukta pratik yapmak anahtardır. Küçük projelerle başlayın, hatalar yapın ve onlardan ders çıkarın. Terraform'un zengin kaynak dokümantasyonunu ve topluluk desteğini aktif olarak kullanın. Altyapınızı kodla yönetme becerisi, günümüzün ve geleceğin bulut mühendisleri için vazgeçilmez bir yetkinlik haline gelmiştir. Bu rehberle attığınız adımlar, sizi bu heyecan verici alanda uzmanlaşmaya bir adım daha yaklaştırdı. Başarılar dileriz!

Sıkça Sorulan Sorular (SSS)

1. Terraform neden diğer IaC araçlarından (örneğin Azure Resource Manager şablonları) daha iyi bir seçenek olabilir?

  • Terraform'un en büyük avantajı, buluttan bağımsız (cloud-agnostic) olmasıdır. AWS, GCP, Azure gibi farklı bulut sağlayıcılarını tek bir araçla yönetebilir. Azure Resource Manager (ARM) şablonları ise sadece Azure'a özgüdür. Ayrıca, Terraform'un HCL dili, JSON tabanlı ARM şablonlarına göre daha okunabilir ve yönetilebilir olarak kabul edilir. Büyük, çok bulutlu (multi-cloud) ortamlarda Terraform, tutarlı bir yönetim deneyimi sunar.

2. Terraform state dosyası nedir ve neden önemlidir?

  • Terraform state dosyası (.tfstate), Terraform'un bulut sağlayıcınızda oluşturduğu gerçek dünya altyapısının bir anlık görüntüsüdür. Terraform, bir sonraki apply komutunda ne gibi değişiklikler yapması gerektiğini belirlemek için bu dosyayı kullanır; yani mevcut durumu istenen durumla karşılaştırır. Bu dosya hassas veriler içerebileceği ve işbirliği için merkezi olması gerektiği için, Azure Blob Storage gibi güvenli bir uzak depolama alanında tutulması ve kilitlenme (state locking) mekanizmalarının kullanılması kritik öneme sahiptir.

3. Terraform kullanarak Azure VM dağıtırken güvenlik için nelere dikkat etmeliyim?

  • Öncelikle, hassas verileri (yönetici parolaları gibi) doğrudan kod içinde tutmaktan kaçının. Bunun yerine, Azure Key Vault gibi bir gizli dizi yönetim hizmeti veya SSH anahtarları kullanın. Ağ Güvenlik Gruplarını (NSG) en az ayrıcalık prensibiyle yapılandırın; yani sadece gerekli portlara ve IP aralıklarından erişime izin verin. Hizmet Prensibi (Service Principal) kullanarak Terraform için Azure kimlik doğrulaması yapın ve bu hizmet prensibine yalnızca ihtiyaç duyduğu minimum izinleri verin (RBAC). Son olarak, Terraform state dosyasını güvenli bir uzak backend'de (örneğin Azure Storage) saklayın ve kilitlenme mekanizmalarını etkinleştirin.

4. Mevcut bir Azure kaynağını Terraform'a nasıl aktarabilirim?

  • Mevcut bir Azure kaynağını Terraform'un yönetimine almak için terraform import komutunu kullanabilirsiniz. Bu komut, Terraform'un mevcut bir kaynağı Terraform state dosyasına kaydetmesini sağlar. Örneğin, terraform import azurerm_resource_group.rg /subscriptions//resourceGroups/ şeklinde kullanılır. Import işlemi sonrası, bu kaynağın tanımını Terraform yapılandırma dosyalarınıza (.tf) eklemeniz ve state dosyasındakiyle eşleştiğinden emin olmanız gerekir.

5. Terraform'da modüller ne işe yarar ve ne zaman kullanmalıyım?

  • Terraform modülleri, ilgili kaynakların bir koleksiyonunu tek bir mantıksal birimde paketlemenizi sağlayan yeniden kullanılabilir yapılandırma bloklarıdır. Büyük ve karmaşık altyapılarda kod tekrarını azaltmak, yapılandırmayı organize etmek ve farklı projelerde veya ortamlarda aynı altyapı desenlerini tutarlı bir şekilde dağıtmak için modüller kullanmalısınız. Örneğin, bir "ağ" modülü sanal ağ, alt ağlar ve güvenlik gruplarını oluşturabilirken, bir "sanal makine" modülü bir VM'yi ve ilgili ağ arayüzlerini dağıtabilir.
Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version