Azure VM otomatik olarak yeniden boyutlandırma
Azure'da VM'i (sanal makine) belirli saatler aralığında yeniden boyutlandırılmasının otomatik olarak yapımını anlatmaya çalışacağım.
Öncelikle neden böyle bir şeye ihtiyacımız var. Bilmeyenler için Azure, cloud çözümler sunan bir platformdur. Ücretli ücretsiz birçok özelliği mevcuttur. Ücretli tarafında kullandıkça öde mantığı bulunmaktadır.
Sanal makine tarafında ise sizin belirlemiş olduğunuz özellikler dahilinde kullandığınız kadar ödeyeceğiniz miktar belli oluyor.
Örnek bir senaryo düşünelim..
Bir kurum için yüksek ölçekli-özellikli- bir sanal makinemiz var. Bu kurumun çalışma saatleri ise hafta içi saat 9:00 ile 18:00 arasında. Bu saatler dışında ise kurumun sanal makine kullanımı neredeyse yok denilebilecek kadar az ama sanal makinenin 7/24 ulaşılabilir ve açık olması şartımız var. Bu yüzden bu kadar yüksek ölçekli-pahalı- bir makinenin bu saatler dışında bu kadar yüksek donanımlı şekilde çalışmasına gerek yok. Burada otomatik olarak yeniden boyutlandırma devreye giriyor ve makinemizi belirli saatler aralığında yeniden boyutlandırıyoruz. Bu işlem sayesinde ay sonundaki maliyetimizi düşürmüş oluyoruz.
Senaryomuza değindiğimize göre artık nasıl yapacağımıza geçebiliriz.
İlk olarak otomatize etmek için Azure Automation'ı azure portal hesabımıza ekleyip yeni bir Azure Automation Hesabı oluşturuyoruz.
Azure Automation'da çalışmak üzere powershell scripti yazacağız bunun için yeni bir Runbook oluşturuyoruz.
Runbook'umuzu oluşturalım.
Runbook oluşturduk şimdi powershell scriptimizin kodlarını yazabiliriz.
Parametreler;
$VMName = Sanal makinemizin ismi.
$ResourceGroupName = Sanal makinemizin bulunduğu kaynak grubu.
$TargetSize = Sanal makinemizin yeni boyutu.
$NicName = Makinemizin Network Interface adı.
Not: Network Interface'de Accelerated networking: Enabled ise sanal makinenin Size'ını düşürdüğümüzde disabled etmeden istediğimiz targetSize' a düşüremiyoruz (bazılarında hata veriyor) o yüzden ilk önce disabled edip sonra tekrar enabled (eğer o targetsize'da enable oluyorsa) etmek için ekledim. Optional isterseniz kaldırabilirsiniz.
Param
(
[Parameter (Mandatory= $true)]
[string] $VMName,
[Parameter (Mandatory= $true)]
[string] $ResourceGroupName,
[Parameter (Mandatory= $true)]
[string] $TargetSize,
[Parameter (Mandatory= $false)]
[string] $NicName
)
# Connection AzureRunAccount
$connectionName = "AzureRunAsConnection"
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Add-AzAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
# Resizing
$VM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status
$CurrentSize = $VM.HardwareProfile.VmSize
$VMStatusDetail = $VM.Statuses.DisplayStatus | Select-String -Pattern "VM running"
Write-Output "Current size $CurrentSize"
Write-Output "VM status $VMStatusDetail"
$IsOpen = $false
## running control
if($VMStatusDetail)
{
Write-Output "Stopping... VM $VMName"
Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
Write-Output "Stopped VM $VMName"
$IsOpen = $true
}
if($NicName) {
Write-Output "EnableAcceleratedNetworking > false"
$nic = Get-AzNetworkInterface -ResourceGroupName $ResourceGroupName -Name $NicName
$nic.EnableAcceleratedNetworking = $false
$nic | Set-AzNetworkInterface
}
Write-Output "Resizing VM $VMName to $TargetSize ..."
$ResVM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
$ResVM.HardwareProfile.VmSize = $TargetSize
Update-AzVM -VM $ResVM -ResourceGroupName $ResourceGroupName
if($NicName) {
# change again
Write-Output "EnableAcceleratedNetworking > true"
$nic = Get-AzNetworkInterface -ResourceGroupName $ResourceGroupName -Name $NicName
$nic.EnableAcceleratedNetworking = $true
$nic | Set-AzNetworkInterface
}
# if the vm is not open, do not turn the vm back on.
if($IsOpen)
{
Write-Output "Starting... VM $VMName"
Start-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
Write-Output "Started VM $VMName"
}
Scriptimizi test etmeden önce AzureRunAsConnection hesabı oluşturmalıyız, scriptimizi çalıştırabilmemiz için;
Not: Eğer module hatası alırsanız. Bu module'leri eklemeyip tekrar deneyin.
Şimdi scriptimizi test edebiliriz.
Eğer test'imiz başarılı ise; runbook'u publish ediyoruz. Publish etmezsek schedule'a linkleyemeyiz.
Schedule kısmına gelelim. Yeni bir schedule oluşturuyoruz.
Bu oluşturmuş olduğumuz schedule bizim belirlemiş olduğumuz tarih ve zamanda günlük olarak çalışıp sanal makinemizin boyutunu artıracaktır.
Schedule'ı oluşturduk fakat henüz runbook'a linklemedik.
Şimdi oluşturmuş olduğumuz runbook'umuza gidip Link to Schedule diyoruz.
Parametrelerimizi tanımlıyoruz;
Parametrelerimizi tanımladık, burada unutmamamız gereken nokta bu schedule sanal makinemizin boyutunu artırma işlemi yapacak. Bu yüzden targetsize'ımızın değerini bu duruma göre tanımlamalıyız.
Şimdi Schedule'ımı runbook'umuza linkliyoruz.
Oluşturmuş olduğumuz resizing scriptimizi birden fazla schedule'a linkleyebiliriz. Yukarıdaki işlemde biz sanal makinemizin boyutunu artırma işlemi yaptık. Bunun tam tersi yeni bir schedule oluşturabilir ve bu schedule'ımız ise sanal makinemizin boyutunu azaltma işlemi yapar.
Sonuç olarak; 2 schedules 1 runbook.
Schedule 1 > VM-1 Scale Up : saat sabah 7'de günlük olarak çalışsın ve sanal makinemizin boyutunu yükseltsin.
Schedule 2 > VM-1 Scale Down : saat akşam 7'de günlük olarak çalışsın ve sanal makinemizin boyutunu düşürsün.
Azure'da yeniden boyutlandırmayı otomatikleştirmiş olduk.
Bildiğim kadarıyla anlatmaya çalıştım. İnşallah birilerin faydalanması dileğiyle...