Azure Virtual Machine Oluşturma ve Yapılandırma Rehberi
Bulut altyapısına geçiş yaparken en çok sorulan sorulardan biri şu oluyor: “Azure’da sanal makine nasıl kuruyorsun, neye dikkat etmek lazım?” Bu sorunun cevabı aslında sadece birkaç tıklamadan ibaret değil. Doğru boyutlandırma, ağ yapılandırması, güvenlik ayarları ve maliyet optimizasyonu gibi konuları bilmeden kurulan VM’ler hem para hem de performans kaybına yol açıyor. Bu yazıda sıfırdan bir Azure VM kurma sürecini, yapılandırma adımlarını ve gerçek dünya senaryolarına uygun ipuçlarını ele alacağız.
Azure VM Oluşturmadan Önce Planla
En büyük hata, düşünmeden “Create” butonuna basmak. Önce şunları netleştirmek gerekiyor:
- Workload tipi: Web sunucusu mu, veritabanı mı, CI/CD agent mi?
- İşletim sistemi: Ubuntu, RHEL, Windows Server?
- Boyut (SKU): Kaç vCPU, ne kadar RAM?
- Depolama: Premium SSD mi, Standard SSD mi?
- Ağ topolojisi: Hangi VNet, hangi subnet?
- Yedekleme ve DR: Azure Backup aktif olacak mı?
Bu soruları cevaplayıp sonra konsola gidersen hem daha hızlı hem de daha doğru bir yapı kurarsın.
Azure CLI ile VM Oluşturma
Portal üzerinden VM kurmak başlangıç için iyi ama üretim ortamında her zaman komut satırını tercih et. Tekrarlanabilir, versiyon kontrol edilebilir ve hatasız. Önce Azure CLI kurulumunu doğrula ve giriş yap:
# Azure CLI versiyonunu kontrol et
az --version
# Azure hesabına giriş yap
az login
# Mevcut subscription'ları listele
az account list --output table
# Kullanmak istediğin subscription'ı seç
az account set --subscription "Subscription-ID-veya-Adi"
Giriş yaptıktan sonra önce kaynak grubunu oluşturalım. Resource group, Azure’da her şeyin çatısı:
# Resource group oluştur
az group create
--name rg-production-westeurope
--location westeurope
--tags Environment=Production Owner=SysAdmin Team=Infrastructure
# Resource group'u doğrula
az group show --name rg-production-westeurope --output table
Şimdi asıl VM oluşturma komutuna gelelim. Basit bir Ubuntu web sunucusu için:
# Ubuntu 22.04 LTS VM oluştur
az vm create
--resource-group rg-production-westeurope
--name vm-webserver-01
--image Ubuntu2204
--size Standard_D2s_v3
--admin-username azureadmin
--ssh-key-values ~/.ssh/id_rsa.pub
--vnet-name vnet-production
--subnet subnet-web
--public-ip-address pip-webserver-01
--public-ip-sku Standard
--nsg nsg-web-tier
--os-disk-size-gb 64
--storage-sku Premium_LRS
--tags Environment=Production Role=WebServer
--zone 1
Bu komutla birlikte NIC, Public IP ve disk otomatik oluşuyor. Ama dikkat et, --public-ip-address parametresini kullanmak her zaman doğru değil. Production ortamında VM’lerin doğrudan internete açık olmaması gerekiyor genellikle.
VM Boyutu Seçimi: Doğru SKU Nedir?
Azure’da yüzlerce VM boyutu var. Bunları doğru seçmek hem performans hem de maliyet açısından kritik.
En çok kullanılan aileler şunlar:
- B-serisi (B1s, B2s): Bursty workload’lar için. Dev/test ortamları, düşük trafikli uygulamalar. Ucuz ama CPU kredisi sınırlı.
- D-serisi (D2s_v3, D4s_v5): Genel amaçlı. Web sunucuları, uygulama sunucuları için ideal.
- E-serisi (E4s_v3, E8s_v5): Memory-optimized. Veritabanı, SAP, büyük cache işlemleri.
- F-serisi (F4s_v2): Compute-optimized. Batch processing, gaming sunucuları.
- L-serisi (L8s_v3): Storage-optimized. Yüksek I/O gerektiren NoSQL veritabanları.
Boyut değiştirmek isterken:
# Mevcut VM boyutunu öğren
az vm show
--resource-group rg-production-westeurope
--name vm-webserver-01
--query hardwareProfile.vmSize
--output tsv
# Bölgedeki mevcut VM boyutlarını listele
az vm list-sizes
--location westeurope
--query "[?contains(name,'Standard_D')]"
--output table
# VM'i yeniden boyutlandır (önce durdurman gerekebilir)
az vm resize
--resource-group rg-production-westeurope
--name vm-webserver-01
--size Standard_D4s_v3
Ağ Yapılandırması: VNet ve NSG
Ağ yapılandırması çoğu zaman VM’den daha önemli. Doğru ağ tasarımı olmadan ne kadar iyi VM kursan işe yaramaz.
Önce VNet ve subnet yapısını oluştur:
# Virtual Network oluştur
az network vnet create
--resource-group rg-production-westeurope
--name vnet-production
--address-prefix 10.0.0.0/16
--location westeurope
# Web tier subnet
az network vnet subnet create
--resource-group rg-production-westeurope
--vnet-name vnet-production
--name subnet-web
--address-prefix 10.0.1.0/24
# App tier subnet
az network vnet subnet create
--resource-group rg-production-westeurope
--vnet-name vnet-production
--name subnet-app
--address-prefix 10.0.2.0/24
# DB tier subnet
az network vnet subnet create
--resource-group rg-production-westeurope
--vnet-name vnet-production
--name subnet-db
--address-prefix 10.0.3.0/24
Network Security Group (NSG) kurallarını doğru yapılandırmak güvenlik açısından şart:
# NSG oluştur
az network nsg create
--resource-group rg-production-westeurope
--name nsg-web-tier
# HTTP trafiğine izin ver
az network nsg rule create
--resource-group rg-production-westeurope
--nsg-name nsg-web-tier
--name Allow-HTTP
--priority 100
--protocol Tcp
--destination-port-range 80
--access Allow
--direction Inbound
# HTTPS trafiğine izin ver
az network nsg rule create
--resource-group rg-production-westeurope
--nsg-name nsg-web-tier
--name Allow-HTTPS
--priority 110
--protocol Tcp
--destination-port-range 443
--access Allow
--direction Inbound
# SSH'ı sadece belirli IP'den izin ver (0.0.0.0/0 asla kullanma!)
az network nsg rule create
--resource-group rg-production-westeurope
--nsg-name nsg-web-tier
--name Allow-SSH-Management
--priority 200
--protocol Tcp
--destination-port-range 22
--source-address-prefix 203.0.113.0/24
--access Allow
--direction Inbound
# NSG'yi subnet'e bağla
az network vnet subnet update
--resource-group rg-production-westeurope
--vnet-name vnet-production
--name subnet-web
--network-security-group nsg-web-tier
SSH portunu internete açık bırakmak ciddi bir güvenlik riski. Production ortamında Azure Bastion veya JumpBox kullan. Ya da en azından SSH portunu sadece şirket VPN IP’sine kısıtla.
Disk Yönetimi ve Depolama
OS diski yetmediğinde veri diski eklemek gerekiyor. Bunu runtime’da yapabilirsin:
# Managed disk oluştur
az disk create
--resource-group rg-production-westeurope
--name disk-webserver-data-01
--size-gb 128
--sku Premium_LRS
--zone 1
# Diski VM'e bağla
az vm disk attach
--resource-group rg-production-westeurope
--vm-name vm-webserver-01
--name disk-webserver-data-01
# VM'e giriş yaptıktan sonra diski formatlayıp mount et
# Önce diski bul
lsblk
# Partition oluştur
sudo fdisk /dev/sdc
# n -> p -> 1 -> Enter -> Enter -> w
# Formatlama
sudo mkfs.ext4 /dev/sdc1
# Mount noktası oluştur
sudo mkdir -p /data
# Mount et
sudo mount /dev/sdc1 /data
# /etc/fstab'a ekle (kalıcı mount)
echo "UUID=$(sudo blkid -s UUID -o value /dev/sdc1) /data ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab
nofail parametresini mutlaka ekle. Disk bağlı değilken VM’in boot etmesini engellemez, hayatını kurtarır.
Cloud-Init ile VM Otomatik Yapılandırma
VM kurulur kurulmaz otomatik olarak yapılandırmak istiyorsan cloud-init kullan. Manuel adım gerektirmeden nginx, uygulama paketleri veya monitoring agent kurabilirsin:
# cloud-init.yaml dosyası oluştur
cat > cloud-init.yaml << 'EOF'
#cloud-config
package_upgrade: true
packages:
- nginx
- htop
- curl
- git
- ufw
runcmd:
- systemctl enable nginx
- systemctl start nginx
- ufw allow 'Nginx Full'
- ufw allow OpenSSH
- ufw --force enable
- echo "vm-webserver-01" > /etc/hostname
write_files:
- path: /etc/nginx/conf.d/default.conf
content: |
server {
listen 80;
server_name _;
root /var/www/html;
index index.html;
}
final_message: "VM hazir! Sure: $UPTIME saniye"
EOF
# cloud-init ile VM oluştur
az vm create
--resource-group rg-production-westeurope
--name vm-webserver-02
--image Ubuntu2204
--size Standard_D2s_v3
--admin-username azureadmin
--ssh-key-values ~/.ssh/id_rsa.pub
--custom-data cloud-init.yaml
--vnet-name vnet-production
--subnet subnet-web
--public-ip-address ""
--nsg nsg-web-tier
Monitoring ve Alerts Kurulumu
VM kurdun, çalışıyor, güzel. Ama izlemiyorsan bir anlamı yok. Azure Monitor entegrasyonunu aktif et:
# Log Analytics Workspace oluştur
az monitor log-analytics workspace create
--resource-group rg-production-westeurope
--workspace-name law-production-monitoring
--location westeurope
--sku PerGB2018
# Workspace ID'yi al
WORKSPACE_ID=$(az monitor log-analytics workspace show
--resource-group rg-production-westeurope
--workspace-name law-production-monitoring
--query id --output tsv)
# VM'e Azure Monitor Agent kur
az vm extension set
--resource-group rg-production-westeurope
--vm-name vm-webserver-01
--name AzureMonitorLinuxAgent
--publisher Microsoft.Azure.Monitor
--version 1.0
# CPU yüksek kullanım alarmı oluştur
az monitor metrics alert create
--name alert-cpu-high-webserver01
--resource-group rg-production-westeurope
--scopes $(az vm show -g rg-production-westeurope -n vm-webserver-01 --query id -o tsv)
--condition "avg Percentage CPU > 85"
--window-size 5m
--evaluation-frequency 1m
--severity 2
--description "CPU kullanimi yuzde 85 uzerinde"
Gerçek Dünya Senaryosu: E-ticaret Uygulaması için VM Kurulumu
Bir e-ticaret müşterisi için yaptığımız yapıyı örnek verelim. 3 katmanlı mimari: Load balancer -> Web VM’leri -> App VM -> PostgreSQL DB VM.
Web katmanı için:
# Availability Set oluştur (zone yoksa)
az vm availability-set create
--resource-group rg-ecommerce-prod
--name avset-web-tier
--platform-fault-domain-count 2
--platform-update-domain-count 5
# İlk web VM
az vm create
--resource-group rg-ecommerce-prod
--name vm-web-01
--image Ubuntu2204
--size Standard_D2s_v3
--admin-username sysadmin
--ssh-key-values ~/.ssh/ecommerce_rsa.pub
--availability-set avset-web-tier
--vnet-name vnet-ecommerce
--subnet subnet-web
--public-ip-address ""
--nsg nsg-web
--os-disk-size-gb 64
--storage-sku Premium_LRS
--tags Environment=Production Application=ECommerce Role=Web Tier=1
# İkinci web VM (aynı availability set'te)
az vm create
--resource-group rg-ecommerce-prod
--name vm-web-02
--image Ubuntu2204
--size Standard_D2s_v3
--admin-username sysadmin
--ssh-key-values ~/.ssh/ecommerce_rsa.pub
--availability-set avset-web-tier
--vnet-name vnet-ecommerce
--subnet subnet-web
--public-ip-address ""
--nsg nsg-web
--os-disk-size-gb 64
--storage-sku Premium_LRS
--tags Environment=Production Application=ECommerce Role=Web Tier=1
Bu yapıda iki VM farklı fault domain’lerde çalışıyor, yani bir rack arızasında ikisi birden etkilenmiyor. Availability Zone kullanabiliyorsan daha da güvenli, ama önce bölgenin zone desteğini kontrol et.
VM Yönetimi: Start, Stop, Deallocate
Maliyet optimizasyonu için VM’leri kullanmadığında durdur. Ama dikkat, “Stop” ile “Deallocate” farkını bil:
# VM'i durdur (ücret kesilmeye devam eder!)
az vm stop
--resource-group rg-production-westeurope
--name vm-webserver-01
# VM'i deallocate et (işlem gücü ücreti kesilmez)
az vm deallocate
--resource-group rg-production-westeurope
--name vm-webserver-01
# VM'i başlat
az vm start
--resource-group rg-production-westeurope
--name vm-webserver-01
# Resource group'taki tüm VM'lerin durumunu gör
az vm list
--resource-group rg-production-westeurope
--show-details
--query "[].{Name:name, Status:powerState, Size:hardwareProfile.vmSize}"
--output table
# Scheduled shutdown ayarla (dev ortamlar için hayat kurtarır)
az vm auto-shutdown
--resource-group rg-production-westeurope
--name vm-webserver-01
--time 2200
--email "[email protected]"
az vm stop komutunu çalıştırdığında VM işletim sistemi kapanıyor ama Azure altyapısında yer ayırılmaya devam ediyor. Bu yüzden disk ve IP maliyeti kesilmeye devam eder. deallocate ise VM’i tamamen serbest bırakır.
Snapshot ve Backup
Üretim değişikliklerinden önce mutlaka snapshot al:
# OS diskinin ID'sini al
OS_DISK_ID=$(az vm show
--resource-group rg-production-westeurope
--name vm-webserver-01
--query storageProfile.osDisk.managedDisk.id
--output tsv)
# Snapshot oluştur
az snapshot create
--resource-group rg-production-westeurope
--name snapshot-webserver01-$(date +%Y%m%d)
--source $OS_DISK_ID
--location westeurope
# Azure Backup vault oluştur
az backup vault create
--resource-group rg-production-westeurope
--name rsv-production-backup
--location westeurope
# VM için backup aktif et
az backup protection enable-for-vm
--resource-group rg-production-westeurope
--vault-name rsv-production-backup
--vm vm-webserver-01
--policy-name DefaultPolicy
Snapshot anlık yedek için iyi ama uzun vadeli backup için Azure Recovery Services Vault kullan. DefaultPolicy günlük backup yapıyor, 30 gün tutuyor. Bunu ihtiyacına göre özelleştir.
Güvenlik Sertleştirme Kontrol Listesi
VM kurulduktan sonra şu adımları geç:
- Azure Defender for Servers: Microsoft Defender for Cloud üzerinden aktif et, vulnerability assessment otomatik çalışır
- Just-in-Time VM Access: SSH/RDP portlarını sürekli açık tutmak yerine JIT ile sadece ihtiyaç anında aç
- Disk Encryption: Azure Disk Encryption ile OS ve data disklerini şifrele
- Managed Identity: VM’in diğer Azure servislerine erişmesi için service principal yerine managed identity kullan
- OS güncellemeleri: Azure Update Manager ile patch yönetimini otomatize et
- Diagnostic logs: Boot diagnostics aktif et, sorun giderme kolaylaşır
# Just-in-Time erişimi aktif et
az security jit-policy create
--resource-group rg-production-westeurope
--vm-name vm-webserver-01
--kind "Basic"
--location westeurope
# Managed Identity ata
az vm identity assign
--resource-group rg-production-westeurope
--name vm-webserver-01
# Boot diagnostics aktif et
az vm boot-diagnostics enable
--resource-group rg-production-westeurope
--name vm-webserver-01
Maliyet Optimizasyonu İpuçları
Azure VM maliyetleri kontrol altına almak için birkaç pratik öneri:
- Reserved Instances: 1 veya 3 yıllık commitment ile yüzde 40-60 tasarruf. Uzun vadeli production VM’leri için mutlaka değerlendir.
- Azure Hybrid Benefit: Mevcut Windows Server veya SQL Server lisansın varsa Azure’a taşıyabilirsin, önemli maliyet düşüşü sağlar.
- Spot Instances: Fault-tolerant batch işler için Spot VM kullan, yüzde 90’a kadar indirim. Ama Spot VM’ler Azure kapasitesi gerektiğinde eviction ediliyor, bunu aklında tut.
- B-serisi burst: Çoğu zaman az CPU kullanan uygulamalar için B-serisi çok daha ekonomik.
- Dev/test subscription: Microsoft’un Dev/Test teklifleri üretim fiyatlarına göre ciddi indirim sunuyor.
- Auto-shutdown: Test ve geliştirme ortamlarında mesai saatleri dışında VM’leri kapat.
- Right-sizing: Azure Advisor önerilerini haftalık kontrol et, over-provisioned VM’leri küçült.
Sonuç
Azure’da VM oluşturmak birkaç tıklamayla yapılabilir ama doğru yapmak ayrı bir mesele. Ağ tasarımı, güvenlik yapılandırması, monitoring, backup ve maliyet optimizasyonu olmadan kurulan VM’ler ileride seni yorar. Bu yazıda anlattıklarımı şöyle özetleyeyim: Her şeyi kod olarak yaz ve tekrarlanabilir yap. Portal üzerinden el ile kurduğun şeyi bir hafta sonra hatırlamıyorsun, ama script olarak kaydettiğin şey her zaman orada. Azure CLI, Bicep veya Terraform ile infrastructure as code yaklaşımını benimsersen hem hata payını azaltırsın hem de ekip içinde bilgi paylaşımı kolaylaşır. Bulut sysadmin’liğinin temel felsefesi bu zaten: elle yapabileceğin her şeyi otomatize et, otomatize edemediğin şeylerin sayısını azalt.
