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.
Do automatyzacji tego procesu możemy użyć np. Azurowego „Automation Account” .
Tworzymy w nim nowy Runbook typu „PowerShell”, dodajemy mu jakąś nazwę i opis żebyśmy wiedzieli na przyszłość co to jest.
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”.
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.
Jeśli chciałbyś poznać więcej sposobów na oszczędzanie pieniędzy na Azure to zapraszam do innych moich wpisów np.:
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.
Cześć Damian, miło mi, że artykuły się podobają. Na pewno będzie jeszcze nie jeden na temat oszczędzania na platformie Microsoft Azure.
Możliwość komentowania została wyłączona.