Azure – Automatyczna zmiana rozmiaru VM

Automatic Azure VM resizing

Last updated on 20 kwietnia, 2021

Osoby, które mnie znają wiedzą, że często obniżam koszty usług na platformie Azure na różne sposoby. Automatyczna zmiana rozmiaru VM(maszyn wirtualnych), była jednym z pierwszych sposobów zmniejszenia kosztów jakie wprowadziłem. Ma on dobre i złe strony, po 3 latach testów postaram się więcej o nich opowiedzieć.

Gdy mamy dużo serwerów w chmurze i są one drogie, to dobrze by było obniżyć koszt ich utrzymania.

Pewna grupa serwerów była używania intensywnie w godzinach 7:00 -17:00, a poza tymi godzinami można powiedzieć, że maszyny się nudziły. Problem był w tym, że serwery nie mogą być wyłączone, bo usługi muszą być dostępne cały czas.

Tutaj super sposobem na obniżenie kosztów jest zmiana rozmiaru VM. Tylko nie chcemy tego robić ręcznie, bo za każdym razem po zakończeniu pracy należałoby zmniejszyć rozmiar, a rano przed rozpoczęciem pracy trzeba byłoby zwiększyć rozmiar.

Zmiana rozmiaru Azure VM size - widok portalu

Do automatyzacji tego procesu możemy użyć np. Azurowego „Automation Account” .

pole wyszukiwania na portalu azure

Tworzymy w nim nowy Runbook typu „PowerShell”, dodajemy mu jakąś nazwę i opis żebyśmy wiedzieli na przyszłość co to jest.

tworzenie nowego runbook dla Automatycznej zmiany rozmiaru VM
tworzenie nowego runbook

W środku Runbooka podajemy Grupę zasobów gdzie jest nasza VM, podajemy jej nazwę i określony przez nas rozmiar.

$ResourceGroupName = "Nazwa_resource_group"
$VMname = "Nazwa_VM"
$Size = "Standard_F1s"

$vm = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -VMName $VMname -Status
$vm = $vm.Statuses.DisplayStatus | Select-String -Pattern "VM running"

if($vm -match "VM running")
{
Stop-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMname -Force
$vm1 = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -VMName $VMname
$vm1.HardwareProfile.VmSize = $Size
Update-AzureRmVM -VM $vm1 -ResourceGroupName $ResourceGroupName
Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMname
}

Jeśli maszyna jest uruchomiona, to zostanie wykonany skrypt do zmiany jej rozmiaru. Jeśli jest wyłączona, to nie trzeba zmieniać rozmiaru, bo nie ponosimy żadnych opłat za wyłączoną maszynę, oczywiście poza dyskami.

Tak więc skrypt zatrzymuje VM, zmienia jej parametry (rozmiar) i ponownie ją uruchamia.

Teraz trzeba tylko jeszcze zapisać naszego runbooka i określić godzinę, o której ma być wykonany skrypt. Robimy to za pomocą opcji „Add a schedule”.

dodanie do schedules

Następnie musimy stworzyć jeszcze raz taki sam skrypt tylko zmienić rozmiar i czas uruchomienia by był wykonany przed rozpoczęciem pracy, a nie po jej zakończeniu.

Plusem jest to, że oszczędzamy pieniądze. Im maszyna jest mniejszego rozmiaru, tym mniej kosztuje. Jeśli mamy dużą ilość maszyn albo maszyny o dużych rozmiarach, to naprawdę sporo można zaoszczędzić.

Minusem jest to, że czasem maszyna utknie w stanie „deallocated” np. gdy brakuje zasobów w jakimś centrum danych, lub mają tam jakieś problemy techniczne. Taka sytuacja zdarzyła się dosłownie kilka razy przez te 3 lata, ale jednak warto mieć to na uwadze.

Dlatego wprowadziłem dodatkowy warunek, że maszyna może dopiero zmienić rozmiar gdy poprzednia, której zmienialiśmy rozmiar ma status „running”. Możemy to łatwo sprawdzić np.:

#jeśli maszyna VM1 ma stan "running" to wykonaj skrypt
$sprawdz_VM = "Nazwa_wcześniej_zmienianej_VM"
$sprawdz_RG = "Nazwa_ResourceGroup_wcześniej_zmienianej_VM"

$VMStats = (Get-AzureRmVM -Name $sprawdz_VM -ResourceGroupName $sprawdz_RG -Status).Statuses

$VMStats= ($VMStats | Where Code -Like 'PowerState/*')[0].DisplayStatus

if ($VMStats  -eq "VM running")
{
TUTAJ WSTAW SKRYPT OD ZMIANY ROZMIARU
}

Na koniec podaję całą zawartość Runbooka:

$DateTimeNow = Get-Date
if($DateTimeNow.DayOfWeek -ne "Saturday" -and $DateTimeNow.DayOfWeek -ne "Sunday") 
{
$connectionName = "AzureRunAsConnection"
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         
"Logging in to Azure..."
Add-AzureRmAccount `
-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
}
}



$sprawdz_VM = "Nazwa_wcześniej_zmienianej_VM"
$sprawdz_RG = "Nazwa_ResourceGroup_wcześniej_zmienianej_VM"

$VMStats = (Get-AzureRmVM -Name $sprawdz_VM -ResourceGroupName $sprawdz_RG -Status).Statuses
$VMStats= ($VMStats | Where Code -Like 'PowerState/*')[0].DisplayStatus

#jeśli poprzednia maszyna VM1 ma stan "running" to wykonaj skrypt
if ($VMStats  -eq "VM running")
{
$ResourceGroupName = "Nazwa_resource_group"
$VMname = "Nazwa_VM"
$Size = "Standard_F1s"

$vm = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -VMName $VMname -Status
$vm = $vm.Statuses.DisplayStatus | Select-String -Pattern "VM running"

# jeśli maszyna której chcesz zmienić rozmiar ma stan "running" to wykonaj skrypt 
if($vm -match "VM running")
{
Stop-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMname -Force
$vm1 = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -VMName $VMname
$vm1.HardwareProfile.VmSize = $Size
Update-AzureRmVM -VM $vm1 -ResourceGroupName $ResourceGroupName
Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMname
}
}

Więcej informacji na temat Automation Account, znajdziesz jak zwykle w dokumentacji Microsoftu https://docs.microsoft.com/pl-pl/azure/automation/automation-intro

Dokładne informacje na temat rozmiarów maszyn wirtualnych znajdziesz pod linkiem: https://docs.microsoft.com/pl-pl/azure/virtual-machines/windows/sizes

Więcej artykułów dotyczących Microsoft Azure na moim blogu znajdziesz w kategorii Azure https://lepczynski.it/category/azure/

Jeśli chciałbyś poznać więcej sposobów na oszczędzanie pieniędzy na Azure to zapraszam do innych moich wpisów np.:

2 myśli na “Azure – Automatyczna zmiana rozmiaru VM”

  1. Fajny pomysł i przystępnie opisane, co najważniejsze po polsku. Też będę to stosować u siebie. Przydało by się więcej artykułów o tym jak oszczędzać pieniądze na Azure.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *