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

Azure Automation'da çalışmak üzere powershell scripti yazacağız bunun için yeni bir Runbook oluşturuyoruz.

azure runbook

azure create runbook

Runbook'umuzu oluşturalım.

azure create runbook

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;

azure run as account

Not: Eğer module hatası alırsanız. Bu module'leri eklemeyip tekrar deneyin.

az-modules

Şimdi scriptimizi test edebiliriz.

azure run test runbook with parameter

azure-runbooks

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.

azure create schedule

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.

azure create schedule

Schedule'ı oluşturduk fakat henüz runbook'a linklemedik.

create azure schedule

Şimdi oluşturmuş olduğumuz runbook'umuza gidip Link to Schedule diyoruz.

azure runbook link to schedule

Parametrelerimizi tanımlıyoruz;

azure runbook configure parameter

azure runbook configure parameter

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.

azure select schedule

Şimdi Schedule'ımı runbook'umuza linkliyoruz.

azure runbook link to schedule

Son durumumuz.

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...